var QUESTION_ID=74273,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/74273/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>
Odpowiedzi:
Python 2, 53
56-3 po uświadomieniu sobie, że
yield x
można go użyć jako wyrażenia.źródło
'aa'
zamiast na''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Nie działa również dla pustych danych wejściowych.Haskell, 24 bajty
Tworzy nieskończoną listę.
źródło
(:)<$>s<*>f s
dałoby niewłaściwy porządek. Jest,f s="":(flip(:)<$>f s<*>s)
ale jest dłużej.f s=[]:(f s<**>map(:)s)
ale<**>
nie ma goPrelude
.JavaScript (ES6), 61 bajtów
Port generatora Python @ feersum. Jest
let
to konieczne. Zaoszczędź 2 bajty, używając rozumienia tablicowego (nieudana propozycja ES7, ale działa w przeglądarce Firefox 30-57):Alternatywna wersja dla 73 bajtów, która zwraca pierwsze
n
elementy wygenerowane przez powyższy generator:źródło
Mathematica,
3231 bajtówEdytować:
CatsAreFluffy zeskrobał jeden bajt.
źródło
Perl,
393735 bajtów(Najpierw opisuje starszą wersję. Nowy krótszy program jest na końcu)
Obejmuje +3 za
-alp
Uruchom z zestawem znaków na STDIN, np
perl -alp kleene.pl <<< "a b c"
kleene.pl
(ta wersja ma 34 + 3 bajty):Dodaj +2 dla
-F
(niejawnie upuść,-a
jeśli nie ma spacji między znakami wejściowymi lub -6 (tylko@a=""
wcześniej}
), jeśli już wstawiamy przecinki między znakami na STDINWyjaśnienie:
Te
-alp
opcje skutecznie wprowadzać kod:Jak widać
<>
w perlu, jest on używany nie tylko do readline, ale może także wykonywać operacje globowania w stylu powłoki (w rzeczywistości w starożytnych perlach było to realizowane przez wywołanie powłoki).Na przykład
<{a,b}{1,2}>
rozwinie się do"a1","a2","b1","b2"
Więc jeśli mamy elementy
@F
, wystarczy dodać przecinki między nimi. Domyślnym znakiem między interpolacją jest spacja, która jest przechowywana w specjalnej zmiennej$"
. Więc ustawienie$"
na,
zmieni się"{@F}"
w{a,b}
if@F=qw(a b)
(globusy rozwijają się jako łańcuchy)W rzeczywistości chciałbym zapętlić się z czymś takim
glob"{@F}"x$n++
, ale ciągle napotykałem problem, że pierwsza pusta linia nie jest generowana, a wszystkie znalezione obejścia spowodowały, że kod był zbyt długi.Kolejną istotną częścią tego kodu jest to, że jeśli użyjesz
for
pętli nad tablicą, możesz wcisnąć na nią dodatkowe elementy podczas pętli, a pętla również odbierze te nowe elementy. Jeśli więc w pętli znajdujemy się np. W elemencie"ab"
,<{@F}$_>
rozwiniemy się do<{a,b}ab>
kontekstu listy("aab", "bab")
. Więc jeśli je@a
popchnę, struny rozszerzone po lewej stronie staną się dostępneMuszę tylko zalać pętlę pustym łańcuchem. Odbywa się to za pomocą
$#a = 0
(,
w kontekście numerycznym staje się0
), co powoduje, że pierwszy i jedyny element@a
staje się undef, który zachowuje się tak, jak""
go używamPoprawa
W rzeczywistości, wykonując testy dla tego wyjaśnienia, znalazłem krótki sposób na użycie rosnącego globu, który poprawnie obsługuje pierwszy pusty wpis. Uruchom jako
perl -ap kleene0.pl <<< "a b"
(więc dodaj 2 bajty dla-ap
)kleene0.pl
(ta wersja to 33 + 2 bajty):Wszystkie te rozwiązania będą utrzymywały coraz więcej danych wyjściowych w pamięci, co po pewnym czasie spowoduje awarię programu. Możesz także używać globów Perla do leniwego generowania, używając ich w kontekście skalarnym, ale to wydłuża programy ...
źródło
<{@F}$_>
:? Dzięki!Pyth, 7
Wypróbuj tutaj
To oblicza iloczyn kartezjański danych wejściowych z każdą liczbą od
0..n-1
, łączy je, a następnie zachowuje tylko pierwsząn
. Spowoduje to przekroczenie limitu czasu online dla liczb lub ciągów, które są znacznie większe niż 3-4.Alternatywnie, aby uzyskać nieskończoną moc wyjściową, spójrz na odpowiedź Jakube .
źródło
Galaretka,
86 bajtówJest to monadyczny link, który akceptuje alfabet i drukuje nieskończoną listę ciągów. Wypróbuj online!
Jak to działa
Wersja alternatywna, 6 bajtów (niekonkurująca)
To diademiczne łącze akceptuje alfabet i pożądaną liczbę ciągów znaków odpowiednio jako lewy i prawy argument.
Uważam tę wersję za niekonkurencyjną, ponieważ wykorzystuje ona dwukierunkową konwersję bazy, która została zaimplementowana po piaskownicy tego wyzwania. Wypróbuj online!
Jak to działa
źródło
Python 2,
898483 bajtówźródło
CJam,
16 lat10 bajtówDzięki jimmy23013 za oszczędność 6 bajtów.
Dane wejściowe to jeden argument wiersza polecenia na znak. Dane wyjściowe to jeden ciąg w każdej linii.
Wypróbuj online!(Ale zabij to natychmiast ...)
Wyjaśnienie
źródło
Pyth, 7 bajtów
Alternatywa dla @ fry. Ten program odczytuje ciąg znaków i drukuje ciągi aż do nieskończoności.
Wyjaśnienie:
Alternatywnie będą również działać następujące. Trochę bardziej zuchwały.
źródło
Haskell, 33 bajty
Przykładem
k "xyz"
jest lista nieskończona["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
źródło
MATL , 10 bajtów
Wypróbuj online!Ale nie pozostawiaj go długo uruchomionego, aby uniknąć dużego obciążenia obliczeniowego na serwerze.
Program wyświetla ciągi dynamicznie, każdy ciąg w innej linii.
źródło
Python 3, 95
Dlaczego funkcje itertools muszą mieć tak długie nazwy.
źródło
combinations_with_replacement
nigdy nie jest tego warte. Jestem pewien, że użycie pętli jest krótsze. Zawsze.Rubinowy,
6560 bajtówTakie długie wbudowane nazwy ...
źródło
p
wywołujeinspect
on argumenty, które generowałyby dane wyjściowe takie jak[] ["a","b"] ["aa", "ab", ...
Pyke (zatwierdzenie 31),
109 bajtówWyjaśnienie:
źródło
Scala, 69
Leniwe strumienie są całkiem miłe dla tego rodzaju rzeczy.
źródło
Japt,
50403428 bajtówDane wejściowe to
"string", number of items
. Dane wyjściowe są sortowane według długości, a następnie w odwrotnej kolejności alfabetycznej. Przetestuj online!Jak to działa
Ta wersja zajmuje trochę czasu, jeśli chcesz zrobić więcej niż 100 pozycji. Jeśli chcesz szybszej wersji, wypróbuj tę 32-bajtową wersję :
źródło
Guma cynamonowa, 6 bajtów
Nie konkuruje, ponieważ guma cynamonowa powstała po tym wyzwaniu.
Wypróbuj online (TIO ogranicza moc wyjściową).
Wyjaśnienie
h
Stawia Cinnamon Gum w formacie i tryb generowania . Reszta ciągu dekompresuje się do[%s]*
. Następnie%s
jest zamieniany na wejście i tworzony jest generator, który wypisuje wszystkie możliwe ciągi pasujące do wyrażenia regularnego.źródło
05AB1E , 9 bajtów
Wypróbuj online!
źródło
Python, 55 bajtów
Jest to dłuższe niż 53-bajtowe rozwiązanie Feersum , ale ilustruje inną metodę z wydrukami . Lista
l
jest aktualizowana podczas iteracji, dodając każdy jednoznakowy przyrostek każdego czytanego ciągu.Równie długi jest czas użycia
map
:Tę samą długość można wykonać w Pythonie 3, tracąc znak
print()
i zapisując go przez rozpakowanie danych wejściowych.źródło
Zsh , 31 bajtów
Wypróbuj online!
Wydrukuj tablicę, a następnie spakuj argumenty przed rekurencją. Pomimo podania nazwy funkcji jest to o jeden bajt krótszy niż wersja iteracyjna:
źródło