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>
Respuestas:
Pitón 2, 53
56-3 después de darse cuenta de que
yield x
se puede usar como una expresión.fuente
'aa'
vez de en''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Tampoco funciona para la entrada vacía.Haskell, 24 bytes
Produce una lista infinita.
fuente
(:)<$>s<*>f s
que daría el orden equivocado. Hayf s="":(flip(:)<$>f s<*>s)
pero es más largo.f s=[]:(f s<**>map(:)s)
excepto que<**>
no está enPrelude
.JavaScript (ES6), 61 bytes
Puerto del generador Python de @feersum. El
let
es necesario. Ahorre 2 bytes utilizando una comprensión de matriz (propuesta ES7 fallida, pero funciona en Firefox 30-57):Versión alternativa para 73 bytes que devuelve los primeros
n
elementos producidos por el generador anterior:fuente
Mathematica,
3231 BytesEditar:
CatsAreFluffy raspó un byte.
fuente
Perl,
393735 bytes(Primero describe una versión anterior. El nuevo programa más corto está al final)
Incluye +3 para
-alp
Ejecutar con el conjunto de caracteres en STDIN, p. Ej.
perl -alp kleene.pl <<< "a b c"
kleene.pl
(esta versión tiene 34 + 3 bytes):Agregue +2 para
-F
(descarte implícito-a
si no hay espacios entre los caracteres de entrada, o -6 (solo@a=""
antes}
) si ya ponemos comas entre los caracteres en STDINExplicación:
Las
-alp
opciones hacen que el código sea efectivo:Como puede ver
<>
en perl, no solo se usa para readline, sino que también puede hacer globbing de estilo shell (de hecho, en perls antiguos se implementó llamando al shell).Por ejemplo
<{a,b}{1,2}>
se expandirá a"a1","a2","b1","b2"
Entonces, si tenemos los elementos
@F
, solo necesitamos agregar comas en el medio. El carácter intermedio predeterminado para la interpolación es el espacio, que se almacena en una variable especial$"
. Por lo tanto, establecer$"
a,
se convertirá"{@F}"
en{a,b}
if@F=qw(a b)
(los globos se expanden como cadenas)De hecho, me hubiera gustado buclear con algo como
glob"{@F}"x$n++
, pero seguí encontrándome con el problema de que la primera línea vacía no se genera y todas las soluciones que encontré hicieron que el código fuera demasiado largo.Entonces, otra parte esencial de este código es que si usa un
for
bucle para pasar sobre una matriz, puede empujar elementos adicionales durante el ciclo y el ciclo también recogerá estos elementos nuevos. Entonces, si en el ciclo estamos, por ejemplo, en el elemento"ab"
,<{@F}$_>
se expandirá a lo<{a,b}ab>
que se convierte en el contexto de la lista("aab", "bab")
. Entonces, si presiono esto@a
, las cuerdas extendidas una a la izquierda también estarán disponiblesTodo lo que necesito hacer es preparar el bucle con una cadena vacía. Eso se hace usando
$#a = 0
(,
en contexto numérico se convierte0
) lo que hace que el primer y único elemento de se@a
convierta en undef, que se comportará como""
cuando lo usoMejora
De hecho, al hacer pruebas para esta explicación, encontré una forma corta de usar un globo creciente que maneja adecuadamente la primera entrada vacía. Ejecutar como
perl -ap kleene0.pl <<< "a b"
(así que agregue 2 bytes para-ap
)kleene0.pl
(esta versión tiene 33 + 2 bytes):Todas estas soluciones mantendrán más y más de la salida en la memoria y eso hará que el programa falle después de un tiempo. También puede usar perl globs para la generación perezosa al usarlos en contexto escalar, pero eso hace que los programas sean más largos ...
fuente
<{@F}$_>
? ¡Gracias!Pyth, 7
Pruébalo aquí
Esto calcula el producto cartesiano de la entrada con cada número de
0..n-1
, los une y luego solo conserva el primeron
. Esto agota el tiempo de espera en línea para números o cadenas que son mucho más grandes que 3-4.Alternativamente, para obtener una salida infinita, mira la respuesta de Jakube .
fuente
Jalea,
86 bytesEste es un enlace monádico que acepta un alfabeto e imprime una lista infinita de cadenas. Pruébalo en línea!
Cómo funciona
Versión alternativa, 6 bytes (no competitiva)
Este es un enlace diádico que acepta un alfabeto y el número deseado de cadenas como argumentos izquierdo y derecho, respectivamente.
Considero que esta versión no es competitiva, ya que utiliza la conversión de base biyectiva, que se ha implementado después de que este desafío se haya aislado. Pruébalo en línea!
Cómo funciona
fuente
Python 2,
898483 bytesfuente
CJam,
1610 bytesGracias a jimmy23013 por guardar 6 bytes.
La entrada es un argumento de línea de comando por carácter. La salida es una cadena en cada línea.
Pruébalo en línea! (Pero mátalo inmediatamente ...)
Explicación
fuente
Pyth, 7 bytes
Alternativa a @fry. Este programa lee una cadena y sigue imprimiendo cadenas hasta el infinito.
Explicación:
Alternativamente, lo siguiente también funcionará. Aunque un poco más hacky.
fuente
Haskell, 33 bytes
Por ejemplo,
k "xyz"
es la lista infinita["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
fuente
MATL , 10 bytes
Pruébalo en línea! Pero no lo deje funcionando por mucho tiempo, para evitar una gran carga computacional en el servidor.
El programa muestra las cadenas dinámicamente, cada cadena en una línea diferente.
fuente
Pitón 3, 95
¿Por qué las funciones de itertools tienen nombres tan largos?
fuente
combinations_with_replacement
nunca vale la pena Estoy bastante seguro de que es más corto usar bucles. Siempre.Ruby,
6560 bytesDichos nombres tan largos ...
fuente
p
recurreinspect
a sus argumentos que producirían resultados como[] ["a","b"] ["aa", "ab", ...
Pyke (commit 31),
109 bytesExplicación:
fuente
Scala, 69
Las secuencias diferidas son bastante agradables para este tipo de cosas.
fuente
Japt,
50403428 bytesEntrada es
"string", number of items
. La salida se ordena por longitud, luego en orden inverso del alfabeto. ¡Pruébelo en línea!Cómo funciona
Esta versión lleva un tiempo si desea hacer más de 100 elementos. Si quieres una versión más rápida, prueba esta de 32 bytes :
fuente
Chicle de canela, 6 bytes
No compite porque Cinnamon Gum se hizo después de este desafío.
Pruébelo en línea (TIO limita la salida).
Explicación
El
h
pone Cinnamon Gum en formato y modo de generación . El resto de la cadena se descomprime a[%s]*
. La%s
continuación, se sustituye con la entrada, y un generador se crea que las salidas de todas las cadenas posibles que concuerden con la expresión regular.fuente
05AB1E , 9 bytes
Pruébalo en línea!
fuente
Python, 55 bytes
Esto es más largo que la solución de 53 bytes de feersum , pero ilustra un método diferente con salida impresa. La lista
l
se actualiza mientras se repite, agregando cada sufijo de un carácter de cada cadena que se lee.Es igualmente largo de usar
map
:Se puede hacer la misma longitud en Python 3, perdiendo un carácter
print()
y guardando uno al desempaquetar la entrada.fuente
Zsh , 31 bytes
Pruébalo en línea!
Imprima la matriz, luego comprima los argumentos antes de recurrir. A pesar de incluir el nombre de la función, este es un byte más corto que la versión iterativa:
fuente