var QUESTION_ID=98252,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/98252/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}
<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>Size</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>
ab
?Odpowiedzi:
Python 2,
6863 bajtówZwraca wartość prawda lub fałsz . Przetestuj na Ideone .
źródło
Siatkówka , 11 bajtów
Wypróbuj wszystkie przypadki testowe. Pierwsze dwa bajty sprawiają, że jest to wieloliniowy.
Całkiem dosłowna interpretacja reguł, oczywiście używa wyrażenia regularnego, tak jak wszystkie programy Retina.
źródło
perl -pE '$_=/^((.+)\2)+$/'
Galaretka , 10 bajtów
Niezupełnie wydajne ... Wypróbuj online!
Jak to działa
źródło
Haskell,
7269 bajtów (bez wyrażenia regularnego)Podejście brutalnej siły. Wypróbuj na Ideone .
Dzięki BlackCap za -3 bajty.
Wyjaśnienie
Funkcja pomocnika
g
pobiera listę ciągów znaków i sprawdza, czy składa się z par identycznych ciągów znaków, takich jak["aa","aa","bba","bba","ab","ab"]
. (Anonimowa) funkcja główna dzieli ciąg na wszystkie możliwe sposoby i sprawdza, czy co najmniej jedno dzielenie daje listę, którag
akceptuje.źródło
or.map
zany
any g.map(words.concat)
i pomyślałem „hej, mogęany
or
Python 2, 60 bajtów
Mam nadzieję, że to prawda. Działa dość wolno i
and
nie wygląda optymalnie.źródło
and
masz tam.Galaretka , 12 bajtów
Dwa bajty dłuższe niż moja inna odpowiedź , ale to podejście jest znacznie bardziej wydajne i obsługuje wszystkie przypadki testowe oprócz jednego.
Wypróbuj online!
Jak to działa
źródło
Pyth - Bez Regex -
1312 bajtówSprawdza, czy którakolwiek z partycji składa się ze wszystkich ciągów, które są sobie równe po podzieleniu na dwie części.
Pakiet testowy .
źródło
Brachylog , 14 bajtów (bez wyrażenia regularnego)
Wypróbuj online!
Jest to zbyt wolne w przypadku niektórych przypadków testowych
Wyjaśnienie
źródło
JavaScript (ES6), bez wyrażenia regularnego,
7574 bajtówW
1
przeciwnym razie zwraca do parowania0
. Edycja: Zapisano 1 bajt dzięki @ edc65.źródło
substr
bez modyfikacjii
. Aleslice
powtarzając 3 razy możesz zaoszczędzić 1 bajt aliasing goi
? Zdaję sobie sprawę, żes.substr(i,i+i)
zwraca to samo,s.slice(i,i+=i)
ale potem używam zmodyfikowanej wartościi
później ...s.substr(i,i)
2 bajty mniej, a następnies.slice(i+i)
2 bajty więcejPython, 58 bajtów
Jest to oparte na rekurencyjnej metodzie Dennisa . Stąd bierze się również logiczna sztuczka negacji.
Nowym pomysłem jest powtarzanie się w partycjach
(p,s)
oryginalnego łańcucha, zaczynając od('',s)
i wielokrotnie przesuwając pierwszą postać,s
aby była ostatnią postaciąp
. Umożliwia to bezpośrednie odwoływanie się do części bez przecinania sznurka. Ponieważ jednak partycja zaczyna się odp
pustego, musimy uważać, aby uniknąć nieskończonych pętlif(s)
wywoływaniaf(s)
.źródło
JavaScript (ES6), 24 bajty
Prawdopodobnie nie jest krótszy niż ten.
źródło
\2
?\1
, aleaab
wracatrue
... dzięki za poprawkę.PHP, 40 bajtów
wypisuje 0 dla false i 1 dla true
źródło
Python,
6664 bajtówDzięki @Zgarb za -1 bajt!
Zwraca
True
lubFalse
.Wypróbuj online!
Każda pomoc w golfa będzie mile widziana.
źródło
Rakieta 230 bajtów
Drukuje „!” dla każdego sposobu, w jaki ciąg jest parowany. Drukuje „.” na końcu.
Nie golfowany:
Testowanie:
Wydajność:
źródło
Perl, 16 +2 = 18 bajtów (z wyrażeniem regularnym)
Uruchom z
-nl
flagami.-E
jest wolny.Uruchom jako:
Zwraca listę grup przechwytywania (prawda), jeśli można je sparować, łańcuch zerowy, jeśli nie można sparować.
Wyjaśnienie
Te
-nl
flagi będą uruchamiać kod w pętli (-n
), umieszczenie wejściowe (z tylną przełamane usunięte ze względu-l
) w zmiennej$_
za każdym razem, a następnie oceny kodowe wejście czas wprowadzony do momentu, gdy program jest ręcznie zakończone.-E
Flaga pozwala kod w wierszu poleceń oceniać i umożliwiasay
polecenie.Jeśli zostanie znalezione dopasowanie (np. Jeśli ciąg znaków można sparować), wyrażenie regularne zwraca listę grup przechwytywania, która zwraca wartość true, która jest następnie przekazywana
say
i generowana. Jeśli nie zostanie znalezione dopasowanie, wyrażenie regularne zwraca pusty ciąg znaków, który przekształca się w fałsz, który jest następnie przekazywanysay
i generowany.Próba:
źródło
GNU Prolog,
4946 bajtówPrawdopodobnie działa również w innych wariantach, chociaż nie wszystkie reprezentują ciągi w ten sam sposób; Reprezentacja GNU Prolog jest przydatna w przypadku tego problemu.
Nie jest jasne, czy liczy się to jako użycie wyrażenia regularnego, czy nie. Nie używa żadnej funkcji podobnej do wyrażenia regularnego, ale cała semantyka języka jest podobna do wyrażeń regularnych.
Nowa wersja (wykorzystuje sztuczkę rekurencyjną widoczną w innych odpowiedziach):
Starsza wersja:
Jest to wywołany predykat (odpowiednik funkcji Prologa)
s
, a nie pełny program. Użyj tego w ten sposób:Ciekawą cechą starszego rozwiązania jest to, że jeśli zapytasz tłumacza „czy jest więcej rozwiązań?” poprzez korzystanie z
;
Podtrue ?
szybka (zamiast pytać „czy istnieje jakieś rozwiązanie” poprzez naciśnięcie powrót w wierszu, jak ja powyżej), to zwraca „true” kilka razy równa liczbie różnych sposobów ciąg może być wyrażony w podanej formie (np. zwraca dwa razy „prawda”s("aaaa").
, ponieważ można to parsować jako(a a)(a a)
lub jako(aa aa)
).Programy prolog często są odwracalne (pozwalający
s
na generowanie listy ciągów z danej nieruchomości). Starsza nie jest (przechodzi w nieskończoną pętlę), ale to z powodu metody golfowej, której użyłem, aby upewnić się, że C nie jest puste; jeśli przepiszesz program, aby jawnie podać C jako niepuste, wygeneruje ciągi znaków w postaci „aa”, „aabb”, „aabbcc” itd. (Prolog jest Prologem, nie określa tożsamości tworzących je znaków w górę, tylko specyfikacja, które znaki są takie same). Nowsze generuje ciągi znaków w postaci „aa”, „abab”, „abcabc” i tak dalej; jest to nieskończona pętla sama w sobie, a zatem nigdy nie osiągnie punktu, w którym utknie z powodu niewykrycia ciągu o zerowej długości.źródło
Brainfuck, 177 bajtów
Sformatowany:
Oczekuje wprowadzania bez końcowego znaku nowej linii. Drukuje
\x00
jako fałszywe i\x01
prawdziwe.Wypróbuj online.
To implementuje wyszukiwanie w pierwszej kolejności. W szczególności: sprawdź powtarzające się prefiksy o większej długości, zaczynając od bieżącego sufiksu, a następnie przejdź do następnego sufiksu, jeśli znaleziono dopasowanie, w przeciwnym razie cofnij się.
Na początku łańcuch jest odwracany, a
\x01
na końcu umieszczany jest wartownik .Taśma jest podzielona na 4-komórkowe węzły. Układ pamięci węzła to:
c h x 0
gdzie
c
jest znakiem,h
oznacza flagę określającą, czy znak znajduje się w pierwszej połowie powtarzanego prefiksu, ix
flagę służącą do śledzenia bieżącej pary porównywanych znaków. Teh
flagi pozostać w miejscu, podczas gdyx
flagi tworząc okno poruszający.Jeśli łańcuch można sparować, wskaźnik wyląduje obok wartownika na końcu głównej pętli; w przeciwnym razie wskaźnik spadnie z lewej strony łańcucha podczas cofania.
źródło
Brachylog , 5 bajtów
Wypróbuj online!
Zauważ, że ten algorytm może zająć bardzo dużo czasu, szczególnie w przypadkach falsey, ponieważ sprawdza każdą możliwą partycję ciągu wejściowego.
Wyjaśnienie
W przypadku ciągu wejściowego, takiego jak
"ababcc"
,~c
próbuje różnych partycji, aż dojdzie do tego["abab", "cc"]
, w którym momencie~j
oba elementy listy,ᵐ
wyniki["ab", "c"]
i predykat się powiodą.źródło
R , 31 bajtów
Wypróbuj online!
Na podstawie odpowiedzi Retina.
R , 129 bajtów
A oto oryginalna odpowiedź, która nie jest wyrażeniem regularnym:
Wypróbuj online!
źródło
Lithp , 57 znaków
Przykładowe użycie:
źródło