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>
Antworten:
Python 2, 53
56-3 nach der Erkenntnis, dass
yield x
als Ausdruck verwendet werden kann.quelle
'aa'
anstatt an''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Funktioniert auch nicht für die leere Eingabe.Haskell, 24 Bytes
Erzeugt eine unendliche Liste.
quelle
(:)<$>s<*>f s
würde die falsche Reihenfolge geben. Es gibtf s="":(flip(:)<$>f s<*>s)
aber es ist länger.f s=[]:(f s<**>map(:)s)
außer das<**>
ist nicht drinPrelude
.JavaScript (ES6), 61 Byte
Port des Python-Generators von @ feersum. Das
let
ist notwendig. Sparen Sie 2 Byte mithilfe eines Array-Verständnisses (fehlgeschlagener ES7-Vorschlag, funktioniert jedoch in Firefox 30-57):Alternative Version für 73 Bytes, die die ersten
n
vom obigen Generator ausgegebenen Elemente zurückgibt :quelle
Mathematica,
32-31BytesBearbeiten:
CatsAreFluffy hat ein Byte abgeschabt.
quelle
Perl,
393735 Bytes(Beschreibt zuerst eine ältere Version. Das neue kürzere Programm ist am Ende)
Beinhaltet +3 für
-alp
Führen Sie mit dem Zeichensatz auf STDIN aus, z
perl -alp kleene.pl <<< "a b c"
kleene.pl
(Diese Version ist 34 + 3 Bytes):Fügen Sie +2 für
-F
(implizites Löschen,-a
wenn keine Leerzeichen zwischen den Eingabezeichen vorhanden sind, oder -6 (nur@a=""
vorher}
) hinzu, wenn in STDIN bereits Kommas zwischen den Zeichen stehenErläuterung:
Die
-alp
Optionen machen den Code effektiv:Wie Sie
<>
in Perl sehen können, wird es nicht nur zum Lesen von Zeilen verwendet, sondern kann auch das Globbing im Shell-Stil ausführen (tatsächlich wurde es in alten Perls durch Aufrufen der Shell implementiert).Zum Beispiel
<{a,b}{1,2}>
wird zu erweitern"a1","a2","b1","b2"
Wenn wir also die Elemente in haben, müssen
@F
wir nur Kommas dazwischen hinzufügen. Das Standardzeichen für die Interpolation ist das Leerzeichen, das in einer speziellen Variablen gespeichert wird$"
. Wenn Sie also einstellen$"
,,
wird dies"{@F}"
zu{a,b}
if@F=qw(a b)
(Globs werden als Zeichenfolgen erweitert).Eigentlich hätte ich gerne eine Schleife mit so etwas gemacht
glob"{@F}"x$n++
, aber ich bin immer wieder auf das Problem gestoßen, dass die erste leere Zeile nicht generiert wird und alle Problemumgehungen, die ich fand, den Code zu lang machten.Ein weiterer wesentlicher Teil dieses Codes ist, dass Sie, wenn Sie eine
for
Schleife über ein Array ausführen, während der Schleife zusätzliche Elemente darauf drücken können, und die Schleife auch diese neuen Elemente aufnimmt. Wenn wir also in der Schleife zB am Element sind"ab"
, dann<{@F}$_>
wird erweitert, zu<{a,b}ab>
welchem im Listenkontext("aab", "bab")
. Wenn ich diese also@a
drücke, werden auch die nach links verlängerten Saiten verfügbarAlles was ich noch tun muss, ist die Schleife mit einer leeren Zeichenkette zu füllen. Dies geschieht mit
$#a = 0
(,
im numerischen Kontext wird0
), wodurch das erste und einzige Element von@a
undef wird, das sich so verhält, wie""
ich es verwendeVerbesserung
Tatsächlich habe ich bei Tests für diese Erklärung einen kurzen Weg gefunden, einen wachsenden Globus zu verwenden, der den ersten leeren Eintrag richtig handhabt. Ausführen als
perl -ap kleene0.pl <<< "a b"
(also 2 Bytes hinzufügen für-ap
)kleene0.pl
(Diese Version ist 33 + 2 Bytes):All diese Lösungen behalten immer mehr der Ausgabe im Speicher bei, und dies führt dazu, dass das Programm nach einiger Zeit fehlschlägt. Sie können Perl-Globs auch für die verzögerte Generierung verwenden, indem Sie sie im skalaren Kontext verwenden. Dadurch werden die Programme jedoch länger.
quelle
<{@F}$_>
? Vielen Dank!Pyth, 7
Probieren Sie es hier aus
Dies berechnet das kartesische Produkt der Eingabe mit jeder Zahl aus
0..n-1
, verknüpft sie und behält dann nur die erste bein
. Bei Zahlen oder Zeichenfolgen, die viel größer als 3-4 sind, tritt eine Online-Zeitüberschreitung auf.Um eine unendliche Ausgabe zu erhalten, sehen Sie sich alternativ Jakubes Antwort an .
quelle
Gelee,
86 BytesDies ist ein monadischer Link, der ein Alphabet akzeptiert und eine unendliche Liste von Zeichenfolgen ausgibt. Probieren Sie es online!
Wie es funktioniert
Alternative Version, 6 Bytes (nicht konkurrierend)
Dies ist eine dyadische Verknüpfung, die ein Alphabet und die gewünschte Anzahl von Zeichenfolgen als linkes bzw. rechtes Argument akzeptiert.
Ich halte diese Version für nicht konkurrierend, da sie eine bijektive Basiskonvertierung verwendet, die implementiert wurde, nachdem diese Herausforderung in einer Sandbox ausgeführt wurde. Probieren Sie es online!
Wie es funktioniert
quelle
Python 2,
898483 Bytesquelle
CJam,
1610 BytesDanke an jimmy23013 für das Speichern von 6 Bytes.
Die Eingabe besteht aus einem Befehlszeilenargument pro Zeichen. Ausgabe ist eine Zeichenfolge in jeder Zeile.
Probieren Sie es online! (Aber töte es sofort ...)
Erläuterung
quelle
Pyth, 7 Bytes
Alternative zu @fry. Dieses Programm liest eine Zeichenfolge und druckt die Zeichenfolgen bis unendlich.
Erläuterung:
Alternativ funktioniert auch Folgendes. Ein bisschen hackiger.
quelle
Haskell, 33 Bytes
Zum Beispiel
k "xyz"
ist die unendliche Liste["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
quelle
MATL , 10 Bytes
Probieren Sie es online! Lassen Sie es jedoch nicht lange laufen, um eine hohe Rechenlast auf dem Server zu vermeiden.
Das Programm zeigt die Zeichenfolgen dynamisch an, wobei sich jede Zeichenfolge in einer anderen Zeile befindet.
quelle
Python 3, 95
Warum müssen itertools-Funktionen so lange Namen haben?
quelle
combinations_with_replacement
ist es nie wert. Ich bin mir ziemlich sicher, dass es kürzer ist, Loops zu verwenden. Immer.Ruby,
65-60BytesSo lange eingebaute Namen ...
quelle
p
ruftinspect
seine Argumente auf, die eine Ausgabe wie[] ["a","b"] ["aa", "ab", ...
Pyke (Festschreiben 31),
109 BytesErläuterung:
quelle
Scala, 69
Lazy Streams sind für so etwas ganz nett.
quelle
Japt,
50403428 BytesEingabe ist
"string", number of items
. Die Ausgabe wird nach Länge sortiert und anschließend in umgekehrter alphabetischer Reihenfolge. Testen Sie es online!Wie es funktioniert
Diese Version dauert eine Weile, wenn Sie mehr als 100 Elemente ausführen möchten. Wenn Sie eine schnellere Version wünschen, probieren Sie diese 32-Byte- Version aus :
quelle
Zimtgummi, 6 Bytes
Nicht konkurrierend, da Zimtgummi nach dieser Herausforderung hergestellt wurde.
Probieren Sie es online aus (TIO begrenzt die Ausgabe).
Erläuterung
Das
h
versetzt Cinnamon Gum in den Format- und Erzeugungsmodus . Der Rest der Zeichenfolge wird auf dekomprimiert[%s]*
. Das%s
wird dann durch die Eingabe ersetzt, und es wird ein Generator erstellt, der alle möglichen Zeichenfolgen ausgibt, die mit dem regulären Ausdruck übereinstimmen.quelle
05AB1E , 9 Bytes
Probieren Sie es online!
quelle
Python, 55 Bytes
Dies ist länger als die 53-Byte-Lösung von feersum , zeigt jedoch eine andere Methode für die Druckausgabe. Die Liste
l
wird aktualisiert, während sie durchlaufen wird, indem jedes Ein-Zeichen-Suffix jeder gelesenen Zeichenfolge angehängt wird.Es ist ebenso lang zu benutzen
map
:Dieselbe Länge kann in Python 3 durchgeführt werden,
print()
indem ein Zeichen für verloren geht und ein Zeichen durch Entpacken der Eingabe gespeichert wird.quelle
Zsh , 31 Bytes
Probieren Sie es online!
Drucken Sie das Array aus und komprimieren Sie die Argumente, bevor Sie sie wiederholen. Trotz der Angabe des Funktionsnamens ist dies ein Byte kürzer als die iterative Version:
quelle