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>
Réponses:
Python 2, 53
56-3 après avoir réalisé qu'il
yield x
peut être utilisé comme expression.la source
'aa'
plutôt que de''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Aussi ne fonctionne pas pour l'entrée vide.Haskell, 24 octets
Produit une liste infinie.
la source
(:)<$>s<*>f s
donnerait le mauvais ordre. Il y af s="":(flip(:)<$>f s<*>s)
mais c'est plus long.f s=[]:(f s<**>map(:)s)
sauf que ce<**>
n'est pas dedansPrelude
.JavaScript (ES6), 61 octets
Générateur Python du port de @ feersum. Le
let
est nécessaire. Économisez 2 octets en utilisant un tableau de compréhension (proposition ES7 échouée, mais fonctionnant dans Firefox 30-57):Version alternative pour 73 octets qui renvoie les premiers
n
éléments fournis par le générateur ci-dessus:la source
Mathematica,
3231 octetsModifier:
CatsAreFluffy a gratté un octet.
la source
Perl,
393735 octets(Décrit d’abord une ancienne version. Le nouveau programme plus court est à la fin)
Comprend +3 pour
-alp
Exécuter avec le jeu de caractères sur STDIN, par exemple
perl -alp kleene.pl <<< "a b c"
kleene.pl
(cette version est 34 + 3 octets):Ajouter +2 pour
-F
(drop implicite-a
s'il n'y a pas d'espaces entre les caractères saisis, ou -6 (seulement@a=""
avant}
) si on met déjà des virgules entre les caractères sur STDINExplication:
Les
-alp
options rendent le code efficacement:Comme vous pouvez le constater,
<>
perl n'est pas seulement utilisé pour readline, mais peut également effectuer un globging de style shell (en fait, dans les perls anciens, il était implémenté en appelant le shell).Par exemple
<{a,b}{1,2}>
, s'étendra à"a1","a2","b1","b2"
Donc, si nous avons les éléments,
@F
nous avons juste besoin d'ajouter des virgules entre les deux. Le caractère intermédiaire intermédiaire pour l'interpolation est l'espace, qui est stocké dans une variable spéciale$"
. Donc, mettre$"
à,
se transformera"{@F}"
en{a,b}
si@F=qw(a b)
(globs se développent en tant que chaînes)En fait, j'aurais vraiment aimé faire une boucle avec quelque chose du genre
glob"{@F}"x$n++
, mais j'ai continué à rencontrer le problème suivant: la première ligne vide n'est pas générée et toutes les solutions de contournement que j'ai trouvées rendaient le code trop long.Une autre partie essentielle de ce code est donc que si vous utilisez une
for
boucle to sur un tableau, vous pouvez y insérer des éléments supplémentaires au cours de la boucle et la boucle prendra également en compte ces nouveaux éléments. Donc, si dans la boucle nous sommes par exemple at"ab"
, nous<{@F}$_>
allons développer<{a,b}ab>
ce qui devient dans le contexte de liste("aab", "bab")
. Donc, si j'appuie dessus,@a
les cordes étendues à gauche deviennent aussi disponiblesTout ce qu'il me reste à faire, c'est d'amorcer la boucle avec une chaîne vide. Cela se fait en utilisant
$#a = 0
(,
dans le contexte numérique devient0
) ce qui cause le premier et le seul élément de@a
devenir undef qui se comportera comme""
quand je l'utiliseAmélioration
En fait, en effectuant des tests pour cette explication, j'ai trouvé un moyen rapide d'utiliser un glob en pleine croissance qui gère correctement la première entrée vide. Exécuter en tant que
perl -ap kleene0.pl <<< "a b"
(ajoutez donc 2 octets pour-ap
)kleene0.pl
(cette version est 33 + 2 octets):Toutes ces solutions garderont de plus en plus de sorties en mémoire, ce qui entraînera l'échec du programme après un certain temps. Vous pouvez également utiliser des globes perl pour la génération lazy en les utilisant dans un contexte scalaire, mais cela allonge la durée des programmes ....
la source
<{@F}$_>
:? Merci!Pyth, 7
Essayez-le ici
Ceci calcule le produit cartésien de l'entrée avec chaque nombre à partir de
0..n-1
, les joint, puis ne conserve que le premiern
. Cela expirera en ligne pour les nombres ou les chaînes beaucoup plus gros que 3-4.Alternativement, pour obtenir une sortie infinie, regardez la réponse de Jakube .
la source
Gelée,
8 à6 octetsIl s'agit d'un lien monadique qui accepte un alphabet et imprime une liste infinie de chaînes. Essayez-le en ligne!
Comment ça marche
Version alternative, 6 octets (non concurrente)
Il s'agit d'un lien dyadique qui accepte un alphabet et le nombre souhaité de chaînes en tant qu'arguments gauche et droit, respectivement.
Je considère cette version comme non compétitive, car elle utilise la conversion de base bijective, qui a été mise en œuvre après la mise en sandbox de ce défi. Essayez-le en ligne!
Comment ça marche
la source
Python 2,
898483 octetsla source
CJam,
16 à10 octetsMerci à jimmy23013 d'avoir économisé 6 octets.
L'entrée est un argument de ligne de commande par caractère. La sortie est une chaîne sur chaque ligne.
Essayez-le en ligne! (Mais tuez-le immédiatement ...)
Explication
la source
Pyth, 7 octets
Alternative à @fry. Ce programme lit une chaîne et continue à imprimer des chaînes jusqu'à l'infini.
Explication:
Sinon, ce qui suit fonctionnera également. Un peu plus hacky cependant.
la source
Haskell, 33 octets
Par exemple,
k "xyz"
est la liste infinie["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
la source
MATL , 10 octets
Essayez-le en ligne! Mais ne le laissez pas fonctionner longtemps, afin d'éviter une charge de calcul importante sur le serveur.
Le programme affiche les chaînes de manière dynamique, chaque chaîne sur une ligne différente.
la source
Python 3, 95
Pourquoi les fonctions itertools doivent-elles avoir des noms aussi longs?
la source
combinations_with_replacement
ne vaut jamais la peine. Je suis sûr que c'est plus court d'utiliser des boucles. Toujours.Ruby,
6560 octetsDe tels noms construits depuis longtemps ...
la source
p
appelinspect
à ses arguments qui produiraient une sortie comme[] ["a","b"] ["aa", "ab", ...
Pyke (commit 31),
10 à9 octetsExplication:
la source
Scala, 69
Les ruisseaux paresseux sont assez gentils pour ce genre de chose.
la source
Japt,
50403428 octetsL'entrée est
"string", number of items
. La sortie est triée par longueur, puis par ordre alphabétique inverse. Testez-le en ligne!Comment ça marche
Cette version prend un certain temps si vous voulez faire plus de 100 éléments. Si vous voulez une version plus rapide, essayez celle-ci de 32 octets :
la source
Cannelle, 6 octets
Non en compétition parce que Cinnamon Gum a été fabriqué après ce défi.
Essayez-le en ligne (limite de sortie TIO).
Explication
Le
h
met Gomme à la cannelle dans le format et le mode de génération . Le reste de la chaîne se décompresse en[%s]*
. Le%s
est ensuite remplacé par l'entrée et un générateur est créé, qui génère toutes les chaînes possibles correspondant à l'expression régulière.la source
05AB1E , 9 octets
Essayez-le en ligne!
la source
Python, 55 octets
C'est plus long que la solution de 53 octets de feersum , mais cela illustre une méthode différente avec une sortie imprimée. La liste
l
est mise à jour lorsqu'elle est itérée en ajoutant chaque suffixe d'un caractère de chaque chaîne lue.C'est également long à utiliser
map
:La même longueur peut être effectuée dans Python 3, en perdant un caractère
print()
et en en sauvegardant un en décompressant les entrées.la source
Zsh , 31 octets
Essayez-le en ligne!
Imprimez le tableau, puis compressez les arguments avant de procéder à la récurrence. Malgré l'inclusion du nom de la fonction, il s'agit d'un octet plus court que la version itérative:
la source