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>
Respostas:
Python 2, 53
56-3 depois de perceber que isso
yield x
pode ser usado como uma expressão.fonte
'aa'
vez de em''
:S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s)
. Também não funciona para a entrada vazia.Haskell, 24 bytes
Produz uma lista infinita.
fonte
(:)<$>s<*>f s
que daria a ordem errada. Há,f s="":(flip(:)<$>f s<*>s)
mas é mais longo.f s=[]:(f s<**>map(:)s)
exceto que<**>
não estáPrelude
.JavaScript (ES6), 61 bytes
Porto do gerador Python do @ feersum. O
let
é necessário. Salve 2 bytes usando uma compreensão de matriz (falha na proposta do ES7, mas funciona no Firefox 30-57):Versão alternativa para 73 bytes que retorna os primeiros
n
elementos gerados pelo gerador acima:fonte
Mathematica,
3231 BytesEditar:
CatsAreFluffy raspou um byte.
fonte
Perl,
393735 bytes(Primeiro descreve uma versão mais antiga. O novo programa mais curto está no final)
Inclui +3 para
-alp
Execute com o conjunto de caracteres em STDIN, por exemplo
perl -alp kleene.pl <<< "a b c"
kleene.pl
(esta versão é 34 + 3 bytes):Adicione +2 para
-F
(solte implícito-a
se não houver espaços entre os caracteres de entrada ou -6 (somente@a=""
antes}
)) se já colocarmos vírgulas entre os caracteres em STDINExplicação:
As
-alp
opções tornam o código eficaz:Como você pode ver
<>
, o perl não é usado apenas para o readline, mas também pode fazer globbing no estilo do shell (de fato, nos perls antigos, foi implementado chamando o shell).Por exemplo
<{a,b}{1,2}>
, expandirá para"a1","a2","b1","b2"
Portanto, se tivermos os elementos
@F
, basta adicionar vírgulas entre elas. O caractere padrão entre interpolações é o espaço, que é armazenado na variável especial$"
. Assim a definição$"
de,
girará"{@F}"
em{a,b}
se@F=qw(a b)
(globs expandir como cordas)Na verdade, eu realmente gostaria de fazer algo assim
glob"{@F}"x$n++
, mas continuei com o problema de que a primeira linha vazia não é gerada e todas as soluções alternativas que encontrei tornaram o código muito longo.Portanto, outra parte essencial desse código é que, se você usar um
for
loop em um array, poderá inserir elementos extras durante o loop e o loop também capturará esses novos elementos. Portanto, se no loop estamos, por exemplo, no elemento"ab"
, ele<{@F}$_>
será expandido para o<{a,b}ab>
qual o contexto da lista se tornará("aab", "bab")
. Então, se eu pressionar isso@a
, as cordas estendidas uma para a esquerda também ficarão disponíveisTudo o que ainda preciso fazer é preparar o loop com uma string vazia. Isso é feito usando
$#a = 0
(,
no contexto numérico torna-se0
) o que faz com que o primeiro e único elemento@a
se torne indefinido, que se comportará como""
quando eu o usarMelhoria
De fato, fazendo testes para essa explicação, encontrei uma maneira curta de usar uma glob crescente que lida adequadamente com a primeira entrada vazia. Executar como
perl -ap kleene0.pl <<< "a b"
(adicione 2 bytes para-ap
)kleene0.pl
(esta versão tem 33 + 2 bytes):Todas essas soluções manterão cada vez mais a saída na memória e isso fará com que o programa falhe após algum tempo. Você também pode usar globs perl para geração lenta usando-os no contexto escalar, mas isso torna os programas mais longos ....
fonte
<{@F}$_>
:? Obrigado!Pitão, 7
Experimente aqui
Isso calcula o produto cartesiano da entrada com cada número de
0..n-1
, junta-se a eles e depois mantém apenas o primeiron
. Isso excederá o tempo limite on-line para números ou seqüências de caracteres muito maiores que 3-4.Como alternativa, para obter uma saída infinita, observe a resposta de Jakube .
fonte
Geléia,
86 bytesEste é um link monádico que aceita um alfabeto e imprime uma lista infinita de strings. Experimente online!
Como funciona
Versão alternativa, 6 bytes (não concorrente)
Esse é um link diádico que aceita um alfabeto e o número desejado de strings como argumentos esquerdo e direito, respectivamente.
Considero esta versão não concorrente, pois usa a conversão de base bijetiva, que foi implementada após o desafio ter sido sandboxed. Experimente online!
Como funciona
fonte
Python 2,
898483 bytesfonte
CJam,
1610 bytesObrigado a jimmy23013 por salvar 6 bytes.
Entrada é um argumento da linha de comandos por caractere. Saída é uma string em cada linha.
Experimente online! (Mas mate-o imediatamente ...)
Explicação
fonte
Pitão, 7 bytes
Alternativa ao @fry. Este programa lê uma string e continua imprimindo strings até o infinito.
Explicação:
Alternativamente, o seguinte também funcionará. Um pouco mais hacky embora.
fonte
Haskell, 33 bytes
Por exemplo,
k "xyz"
é a lista infinita["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]
fonte
MATL , 10 bytes
Experimente online! Mas não deixe por muito tempo, para evitar grande carga computacional no servidor.
O programa exibe as seqüências dinamicamente, cada sequência em uma linha diferente.
fonte
Python 3, 95
Por que as funções do itertools devem ter nomes tão longos?
fonte
combinations_with_replacement
nunca vale a pena. Tenho certeza de que é mais curto usar loops. Sempre.Ruby,
6560 bytesNomes tão compridos ...
fonte
p
chamainspect
seus argumentos que produziriam saída como[] ["a","b"] ["aa", "ab", ...
Pyke (confirmação 31),
109 bytesExplicação:
fonte
Scala, 69
Fluxos preguiçosos são muito bons para esse tipo de coisa.
fonte
Japt,
50403428 bytesEntrada é
"string", number of items
. A saída é classificada por comprimento e, em seguida, inverta a ordem do alfabeto. Teste online!Como funciona
Esta versão demora um pouco se você quiser fazer mais de 100 itens. Se você deseja uma versão mais rápida, tente esta de 32 bytes :
fonte
Goma de canela, 6 bytes
Não concorrente porque o chiclete de canela foi produzido após esse desafio.
Experimente online (o TIO limita a saída).
Explicação
A
h
coloca canela Gum em formato eo modo de gerar . O restante da string é descompactado para[%s]*
. O%s
é então substituído pela entrada e um gerador é criado que gera todas as seqüências possíveis correspondentes ao regex.fonte
05AB1E , 9 bytes
Experimente online!
fonte
Python, 55 bytes
Isso é mais longo que a solução de 53 bytes do feersum , mas ilustra um método diferente com a saída impressa. A lista
l
é atualizada enquanto é iterada, acrescentando cada sufixo de um caractere de cada sequência que é lida.É igualmente longo para usar
map
:O mesmo comprimento pode ser feito no Python 3, perdendo um caractere
print()
e salvando-o ao descompactar a entrada.fonte
Zsh , 31 bytes
Experimente online!
Imprima a matriz e feche os argumentos antes de repetir. Apesar de incluir o nome da função, este é um byte menor que a versão iterativa:
fonte