var QUESTION_ID=127261,OVERRIDE_USER=56433;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px} /* font fix */ body {font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;} /* #language-list x-pos fix */ #answer-list {margin-right: 200px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
-n
Perl, liczą się do wyniku? Tradycyjnie liczy się jako 1 bajt, ponieważ odległość edycji między standardemperl -e
aperl -ne
1 wynosi, ale czy w przypadku tego wyzwania będzien
liczona do celów liczenia duplikatów?n
to najlepsza opcja.how often this character has already occurred in the string
, prawdopodobnie zmieniłbym na,how many times the character has occurred up to this point
aby wyjaśnić, że pierwsze użycie kosztuje 1, a nie 0Odpowiedzi:
MATL , wynik 4
Wypróbuj online!
Wyjaśnienie
Rozważ dane wejściowe
'ABBA'
jako przykład.źródło
Python , wynik 49
Wypróbuj online!
Po tym jest zakładka
in
.Podział punktacji:
()Camnou
S
źródło
T-SQL, wynik
775 579!580EDYCJA : Upuściłem kilka zmiennych, trochę zagęściłem. Zejście do 16
@
symboli zamiast 22, co samo w sobie zmniejsza mój wynik aż o 117 punktów!Fajny konkurs, podoba mi się wymaganie optymalizacji czegoś oprócz całkowitej liczby postaci.
Dane wejściowe są poprzez pole varchar q w istniejącej tabeli z , zgodnie z naszymi regułami IO . W bazie danych zawierającej tę tabelę wejściową należy ustawić sortowanie z rozróżnianiem wielkości liter .
Sformatowany:
W słowach kluczowych SQL nie jest rozróżniana wielkość liter, więc użyłem mieszanych liter, aby zminimalizować liczbę zduplikowanych liter ( aaAA generuje lepszy / niższy wynik niż aaaa ).
Główna pętla porównuje długość przed i po usunięciu wszystkich wystąpień pierwszego znaku. Ta różnica n * (n + 1) / 2 jest dodawana do sumy bieżącej.
Irytująca
LEN()
funkcja SQL ignoruje końcowe spacje, więc musiałem dodać znak kontrolny i odjąć 1 na końcu.EDYCJA : Naprawiono błędne obliczenie mojego własnego wyniku o 2 punkty (problem z cytowaniem cudzysłowów), zmniejszone o 1 przez zmianę obudowy o jeden
R
. Pracując również nad zupełnie inną strategią, opublikuję to jako własną odpowiedź.źródło
579! ≈ 8.22 x 10^1349
C (gcc) , wynik:
1131031009691Dzięki @ugoren, @CalculatorFeline, @gastropner, @ l4m2 i @ JS1 za wskazówki.
Inicjuje tablicę zer, a następnie wykorzystuje wartości ASCII znaków w ciągu jako indeksy dla tej tablicy, aby śledzić liczbę wystąpień każdego znaku w ciągu.
Wypróbuj online!
źródło
z
,x
,c
.char
zawierac
...\x7f
składającej się z 127 elementów ( nie można jej wydrukować) i dodaj wyjaśnienie.z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
g(char*s){int y[238]={};while(*s)*y+=--y[*s++];*y/=~0;}
JavaScript (ES6), wynik
8178Zaoszczędź 3 punkty dzięki @Arnauld
Moje oryginalne rozwiązanie rekurencyjne score-81:
źródło
Haskell , wynik 42
Wypróbuj online!
Anonimizacja
\l->
daje ten sam wynik.źródło
Galaretka , ocena 6
Wypróbuj online!
źródło
Siatkówka , ocena 34
Wypróbuj online!
Wyjaśnienie
Zaczynamy od sortowania wszystkich znaków na wejściu, aby identyczne znaki były zgrupowane w jednym przebiegu.
s(
Aktywuje tryb SingleLine na wszystkich etapach (tj sprawia.
karetki meczu).Celem jest przekształcenie ciągu n znaków w T n znaków ( n- ta liczba trójkątna), ponieważ jest to wynik występowania tej postaci. Aby to zrobić, znajdujemy nakładające się mecze. W szczególności dla każdego i w [1, n] dołączymy do meczu znaki i-1 . Wszystkie te mecze otrzymujemy z powodu nakładającej się flagi
&
. To daje nam n * (n-1) / 2 = T n-1 = T n - n znaków tylko z dopasowań. Ale etap dopasowania połączy je z liniami, które są n liniami dla nmecze. Jest tylko jeden problem. Po ostatnim dopasowaniu nie będzie podawania linii, więc ogólna liczba znaków na wyjściu jest o jeden mniejsza niż potrzebujemy. Naprawiamy to, dopasowując również początek danych wejściowych, co daje nam jeden wiodący kanał, jeśli istnieje co najmniej jedno dopasowanie.Wreszcie, po prostu liczymy, ile znaków jest w ciągu.
źródło
Haskell, wynik
5251Istnieje zakładka pomiędzy
f
i_
.Wypróbuj online!
Wartość pustego ciągu wynosi 0. Wartość ciągu s, gdzie
a
jest pierwszym znakiem, ab
reszta ciągu to 1 plus wystąpieniaa
inb
plus wywołanie rekurencyjne z b.źródło
J , wynik 16
Wypróbuj online!
Wyjaśnienie
Użycie
1#.
zamiast+/@
sumy pozwoliło zaoszczędzić kilka punktów i&
może być użyte zamiast@
w kontekście monadycznym, aby zaoszczędzić jeszcze jeden. Powtarzanie1
kosztuje mnie jeden dodatkowy punkt, ale nie byłem w stanie się go pozbyć.źródło
R , wynik: 67
8395128-61 dzięki najlepszym wskazówkom Giuseppe
Wypróbuj online!
Ciąg jest dzielony za pomocą
utf8ToInt
i każda wartość ascii jest liczonatable
. Wynik jest obliczany przy użyciu mnożenia macierzy%*%
ponad to samo w sobie + 1 i ostatecznie o połowę.źródło
table
zamiastrle
; możesz się go również pozbyćsort
(i nie musisz indeksować[[1]]
wynikustrsplit
)n
(ponieważ jest onafunction
podwojona), a także zmieniając(n+1)
na{n+1}
05AB1E , wynik 6
Wypróbuj online!
źródło
Pyth , ocena 6
1 bajt dzięki isaacg.
Zestaw testowy.
Jak to działa
źródło
s+0
jest taki sam jak+F
.usaShHGrScQ1 8Z
16 lat. Czy możesz dodać wyjaśnienie?s/LQ
jest wynikiem 4, czy korzysta z funkcji, które datują wyzwanie?J , wynik:
14 1211Wypróbuj online!
źródło
$
.1#.2!1+1#.=
Galaretka , wynik 7
Wyjaśnienie:
Wypróbuj online!
źródło
C, 60 bajtów, wynik
10895Wypróbuj online!
Zwykle operatorzy przed i po inkrementacji są świetni do gry w golfa kodowego, ale naprawdę bolą w tym wyzwaniu!
EDYCJA: Odejmując liczby ujemne zamiast dodatnich, zapisałem całą masę wyników. Wymiana
for()
zwhile()
wyeliminowane średnik jako dobrze.źródło
Perl 6 , wynik
61 56 53 4644Spróbuj
Spróbuj
Spróbuj
Spróbuj
Spróbuj
źródło
C # (.NET Core) , wynik ∞ (mam na myśli, 209)
Wypróbuj online!
Wynik obejmuje:
źródło
return w*(w+1)/2
nareturn-~w*w/2
(wynik 196). EDYCJA: Możesz utworzyć port mojej odpowiedzi Java 8 za wynik 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
Wypróbuj online.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Galaretka , ocena 5
Wypróbuj online!
Dzięki Leaky Nun za -2 (poprzednio w odpowiedzi )
źródło
ĠJ€ẎS
PowerShell, wynik 64
(Wynik oparty jest na nowej linii nowego wiersza, która nie jest standardem Windows, ale działa w PS).
@{}
$args
jest tablicą parametrów - w tym przypadku łańcuch wejściowy czyni go tablicą pojedynczego elementu;|%
wykonuje pętlę foreach nad elementami i używagetE*
skrótu, aby dopasowaćGetEnumerator()
metodę ciągu i wywołać ją, aby przekształcić ciąg w strumień znaków.|%
zapętlaj znaki i zwiększaj ich hashtable, dodaj go do bieżącej sumy.($x+=1)
Forma z parens zarówno modyfikuje zmienną i wysyła nową wartość do użycia.(Kiedy napisałem to po raz pierwszy, było to
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
z wynikiem 128 i czułem, że nie obniżyłby się znacznie. Zmniejszenie do 64 jest całkiem przyjemne).źródło
Julia 0,6 , 45 bajtów, wynik: 77
Zainspirowany rozwiązaniem MATL:
Wypróbuj online!
Mniej ładne rozwiązanie, używając liczby:
Julia 0.6 , wynik: 82
Wypróbuj online!
Dzięki Guiseppe za wskazanie punktacji i wskazówki. Te komentarze pomogły mi ładować.
źródło
(x+1)
w[x+1]
celu dalszego zmniejszenia wynik.[x+1]
zamiast używania(x+1)
obniża ją do wyniku 98 .Java 10, wynik:
149138137134133130103102101100( Bajty:
72737475646261 )Bajty rosną, ale wynik spada. :REWynik -28 (i -11 bajtów) dzięki @Nevay .
-1 wynik (i -2 bajty) dzięki @ OlivierGrégoire .
Wynik -1 (i -1 bajt) poprzez konwersję Java 8 na Java 10.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
~
jeśli używaszj=0
ireturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
zamiastu
(return
zawierau
) i nowego wiersza i tabulacji zamiast spacji. EDYCJA: Hehe, edytowałeś właśnie wtedy, kiedy skomentowałem ten komentarz. :)F #, wynik
120118-2 dzięki Kevin Cruijssen !
Wypróbuj online!
Pobiera
string
jako dane wejściowe.Seq.countBy
paruje każdy odrębny znak z jego liczbą (id
jest funkcją tożsamości), dzięki czemu otrzymujesz kolekcję podobną do'a' = 4, 'b' = 2
itp.Seq.sumBy
Trwa odliczanie do każdego listu i sumuje wszystkie numery od0
do zliczania dla danej litery. Więc jeśli'a' = 4
kolekcja byłaby0, 1, 2, 3, 4
sumą, która jest razem10
. NastępnieSeq.sumBy
sumuje wszystkie te sumy.źródło
let q
nalet j
, ponieważq
jest on już używany w obuSeq
.APL (Dyalog) , wynik 15
Wypróbuj online!
⍞
uzyskać wprowadzanie tekstu∘.=⍨
tabela równości z jaźnią+\
skumulowana suma w poprzek1 1⍉
przekątna (dosł. zwiń oba wymiary do wymiaru pierwszego)+/
sumaźródło
Siatkówka , wynik
684543Wypróbuj online! Link pokazuje wynik. Edycja: Dzięki @MartinEnder, który zaoszczędził 20 bajtów, używając nakładających się dopasowań zamiast oczekujących, i kolejne trzy bajty, grupując etapy, tak aby
s
flaga mogła być zastosowana tylko raz. Zaoszczędzono kolejne dwa bajty, obliczając liczbę trójkątną inaczej, unikając potrzeby sortowania.źródło
PHP , 45 bajtów, wynik 78
Wypróbuj online!
PHP , 46 bajtów, Wynik 79 bajtów
Wypróbuj online!
PHP , 56 bajtów, wynik 92
Wypróbuj online!
źródło
Wynik Perla 5
9183Używa
-p
flagi, która dodaje 2 z powodu pw podziale.źródło
$` is automatically
printed after each call so we can use that to store the score and
/./ g` zwraca listę wszystkich znaków$_
, która jest tańsza niżsplit//
.Oktawa , 39 bajtów, wynik 69
Wypróbuj online!
Chociaż istnieje inna odpowiedź Octave, ta jest całkowicie moja i ma inne podejście, a ponadto ma mniej punktów :).
Podejście sprowadza się do pierwszego znalezienia liczby (b) każdego unikalnego znaku, którą uzyskuje się za pomocą funkcji histogramu. Następnie dla każdego elementu obliczamy sumę 1 do b, która odbywa się za pomocą wzoru
(b*(b+1))/2
. Następnie poszczególne sumy są sumowane do końcowego wyniku.W testach wydaje się, że nawiasy są bardzo kosztowne w ocenie, ponieważ wiele jest potrzebnych. Zoptymalizowałem od początkowego wyniku wynoszącego około 88, zmieniając układ pytań, aby zminimalizować liczbę nawiasów otwierających / zamykających - dlatego teraz wykonujemy / 2 na końcowej sumie, a nie indywidualnie, a także zmodyfikowałem formułę, aby
(b^2+b)/2
ponieważ wymaga to mniejszej liczby nawiasów.źródło
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Common Lisp, wynik
286232222Wysoko ceniony wynik ze względu na mylną składnię wbudowanych operatorów Common Lisp.
Wypróbuj online!
Nieskluczony kod:
źródło
Mathematica, ocena 54
Wejście
dzięki hftf
źródło
Total[#(#+1)/2&@Counts@Characters@#]&
wyniki 54.