Sua tarefa é escrever um programa que produza uma lista legível de cada cinco letras da letra com a estrutura:
consoante - vogal - consoante - vogal - consoante
A saída deve ser classificada em ordem alfabética com uma palavra por linha e nenhuma palavra repetida duas vezes. Pode ser minúscula ou maiúscula, mas não mista. Portanto, a lista pode começar e terminar assim:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
As vogais são um - e - i - o - u - y , os outros 20 letras Inglês-alfabeto são consoantes.
As palavras não precisam ser palavras de dicionário reais.
O menor código vence.
Nota: Alguns anos atrás, deparei-me com um programa em um site de uma universidade que fazia exatamente isso. Acontece que meu nome e sobrenome se encaixam na restrição de cvcvc, e eu estava pesquisando sozinho.
Respostas:
Mathematica,
726561 bytesPara testar, recomendo substituir
Print@@@
por""<>#&/@
. O Mathematica exibirá um formulário truncado mostrando as primeiras e as últimas palavras, em vez de levar uma eternidade para imprimir 288.000 linhas.Explicação
Finalmente encontrei um uso para dividir strings. :)
Fiquei intrigado com a possibilidade de adicionar ou multiplicar seqüências por um tempo, mas os casos de uso reais são bastante limitados. O ponto principal é que algo como
"foo"+"bar"
ou"foo"*"bar"
(e, consequentemente, a forma abreviada"foo""bar"
) é completamente válido no Mathematica. No entanto, ele realmente não sabe o que fazer com as seqüências de caracteres em expressões aritméticas, portanto, essas coisas permanecem sem avaliação. Mathematica não aplicar simplificações geralmente aplicáveis embora. Em particular, as strings serão classificadas em ordem canônica (que é bastante bagunçada no Mathematica, quando você começar a classificar strings contendo letras de vários casos, dígitos e não letras), que geralmente é um desrespeitador, mas não importa aqui. . Além disso,"abc""abc"
será simplificado para"abc"^2
(que é um problema quando você repetiu seqüências de caracteres, mas também não o temos), e algo como"abc"/"abc"
será cancelado (do qual usaremos até).Então, o que estamos tentando jogar aqui? Precisamos de uma lista de vogais e uma lista de consoantes, para que possamos alimentá-las
Tuples
para gerar todas as combinações possíveis. Minha primeira abordagem foi a solução ingênua:Essa lista codificada de consoantes doeu um pouco. O Mathematica tem um
Alphabet
built-in que me permitiria evitá-lo, se eu fosse capaz de remover as vogais de uma maneira barata. É aqui que fica complicado, porém. A maneira mais simples de remover elementos éComplement
, mas ela acaba sendo mais longa, usando uma das seguintes opções:(Observe que não precisamos mais aplicar
Characters
a coisa toda, porqueAlphabet[]
fornece uma lista de letras, não uma string.)Então, vamos tentar esse negócio aritmético. Se representarmos o alfabeto inteiro como um produto de letras em vez de uma lista, podemos remover as letras por divisão simples, devido à regra de cancelamento. Isso economiza muitos bytes porque não precisamos
Complement
. Além disso,"a""e""i""o""u""y"
é realmente um byte menor queCharacters@"aeiouy"
. Então, fazemos isso com:Onde estamos armazenando os produtos consoantes e vogais em
a
eb
, respectivamente. Isso funciona escrevendo uma função que multiplica todos os seus argumentos##
e os divide pelo produto das vogais. Esta função é aplicada à lista de alfabeto, que passa cada letra como um argumento separado.Até aí tudo bem, mas agora temos
como argumento
Tuples
, e essas coisas ainda são produtos, não listas. Normalmente, a maneira mais curta de corrigir isso é colocar umList@@@
na frente, que transforma os produtos em listas novamente. Infelizmente, adicionar esses 7 bytes o torna mais longo que a abordagem ingênua.No entanto, acontece que
Tuples
isso não se importa com os chefes das listas internas. Se você fizer(Sim, para um indefinido
f
.) Você receberá:Como se você tivesse usado um em
List
vez def
. Para que possamos repassar esses produtos diretamenteTuples
e ainda obter o resultado certo. Isso economiza 5 bytes em relação à abordagem ingênua, usando duas seqüências codificadas.Agora o
"a""e""i""o""u""y"
ainda é bastante irritante. Mas espere, também podemos salvar alguns bytes aqui! Os argumentos de nossa função são as letras individuais. Portanto, se escolhermos os argumentos certos, podemos reutilizá-los, em vez dos literais de string, que é mais curto para três deles. Queremos argumentos#
(abreviação de#1
),#5
,#9
,#15
,#21
e#25
. Se colocarmos#
no final, também não precisamos adicionar nenhum*
para multiplicá-los, porque (regex)#\d+
é um token completo que não pode ter nenhum dígito anexado a ele. Portanto, acabamos#5#9#15#21#25#
economizando outros 4 bytes.fonte
Tuples
truque. Isso é totalmente indocumentado, certo? E inesperado, dado que o formulário de duas entradasTuples[list,n]
trata delist
não ter aList
cabeça (pelo menos para mim)!List
. O cabeçalho em cada nível nas matrizes geradas porTuples
será o mesmo que o cabeçalho da lista .Tuples[f[{1,2}, {3,4}]]
dá{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
seu lugar. Não está documentado que a cabeça interna seja completamente ignorada.Perl, 47 bytes
Contando o shebang como um.
Experimente online!
fonte
say
?-M5.01
deveria ser 'grátis'.-M5.010
. E a parte interessante no golfe não deve ser substituídaprint
porsay
... #-E
(e subsequentementesay
) um brinde?Python 3 - 110 bytes
Diversão simples em loop :)
fonte
Ruby,
72 7152 bytesAgradecemos ao Value Ink pela idéia básica, que reduziu isso para 60 bytes.
fonte
grep
. Se você gerar um intervalo que usa sequências em minúsculas, obtém uma sequência apenas das palavras em minúsculas.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
para 60 bytes05AB1E ,
1816 bytes05AB1E usa a codificação CP-1252 .
Explicação
Para fins de teste, recomendo substituir
žP
por algumas consoantes ežO
por algumas vogais.Exemplo usando 5 consoantes e 3 vogais
fonte
Python 2 ,
12010294 bytesExperimente online!
fonte
Pure Bash, 74
Expansão direta da cinta.
Experimente online .
Se cada item deve estar em sua própria linha, temos:
Pure Bash, 84
fonte
PHP,
88868480 bytespretty string increment :)
6 bytes salvos por @Christoph
faz um loop através de todas as strings de
bababa
parazyzyz
e testa se elas correspondem ao padrão. Corra com-nr
.fonte
$a="001";$a++;
algum dia. Essa foi uma mudança muito inconveniente.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
economiza 1 caractere. Infelizmente você precisa alterar o eco para imprimir para usar&&
. Substituir\n
por uma quebra de linha real salva outra."#([^$v][$v]){2}[^$v]#"
mas eu não testei.([^$v][$v]){2}[^$v]
não funciona no circuito, enquanto[^$v]([$v][^$v]){2}
faz. Ambos funcionam de forma independente (mesmo com a variável).MATL , 21 bytes
Experimente online! (mas a saída está truncada).
fonte
11Y2'y'h2Y2yX~yyy&Z*
( Experimente online! )vcvcv
padrão, nãocvcvc
conforme necessário. Obrigado embora!Python, 92 bytes
Não posso deixar
itertools
vencer. A iterativa tem 1 byte a mais no Python 2.fonte
Haskell,
5451 bytesmapM func list
constrói todas as palavras, pegando os caracteres possíveis para o índice i da lista retornada porfunc (list!!i)
.Edit: @xnor encontrado 2 bytes para salvar e olhando para sua solução, eu encontrei outro.
fonte
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
salva um byte.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
oumapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Seria bom não codificar as vogais e consoantes, masmapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
não consegue.cycle
da sua primeira variante por recursão explícita economiza um byte adicional.Braquilog , 18 bytes
Experimente online!
Explicação
fonte
g
eb
, mas testá-lo, isso ocorre porquej
parece se recusar a receber uma lista de seqüências de caracteres como entrada?:ea
mostra realmente os pontos fortes do Prolog / Brachylog, no entanto, e é um passo que a maioria das outras línguas acha muito mais difícil.g
eb
era necessário.j
parece estar com erros e isso se deve mais uma vez à dificuldade de distinguir uma lista de argumentos de apenas uma lista. Eu posso corrigir isso, embora isso volte a complexificar a implementação. Talvez eu não conserte e investi meu tempo na solução do problema principal em uma nova versão do Brachylog.JavaScript (ES6),
9190 bytesEdições
for
declaraçãoExplicação
Isso define uma função recursiva de 5 profundos que usa a paridade de sua profundidade de chamada para determinar se itera vogais ou consoantes. Em cada iteração, ele verifica se deseja recursar ou imprimir verificando a quantidade de recursões restantes e concatena a letra de sua iteração atual até o final da cadeia de 5 caracteres que está sendo construída atualmente em profundidade primeiro.
Solução alternativa de 89 bytes, assumindo a codificação ISO8859-1:
Solução alternativa de 96 bytes que retorna toda a saída como sequência única:
Corra por sua conta e risco. Para a solução de 91 bytes, basta usar
f()
e, para a alternativa de 97 bytes, useconsole.log(f())
.fonte
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
utilizando o formulário padrão é, infelizmente, um byte mais:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
Ainda esperando pelo dia em que um gerador é a opção mais curta ...for...of
instrução para salvar um byteC,
201199186184183169163 bytesFazendo um pouco diferente do que com o método de contagem básico anterior:
Ungolfed:
E escrito de uma maneira um pouco mais convencional:
Basicamente, i são os contadores, e s a matriz de cadeias que contêm todos os caracteres sobre a qual devemos iteração, para cada marcador. O truque é o loop while interno : é usado para incrementar os contadores, começando pelo mais à direita. Se percebermos que o próximo caractere que devemos exibir é o caractere nulo final, reiniciaremos o contador para zero e o "carry" será propagado para o próximo contador.
Obrigado Cristoph!
fonte
char *c
Eu acho que o espaço é desnecessário.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
leva você a 177. Vamos lá, você pode fazer ainda melhor;).i[5]={0}
vez dei[]={0,0,0,0,0}
salva 7 bytes.Perl, 71 bytes
Experimente online!
Explicação
Vou adicionar mais explicações mais tarde.
map{push@{1+/[aeiouy]/},$_}a..z;
cria duas matrizes:@1
contém as consoantes e@2
contém as vogais.glob
Quando call com argumentos como{a,b}{c,d}
retorna todas as permutações dos elementos entre chaves.fonte
Befunge, 95 bytes
Experimente online! , embora observe que a saída será truncada.
Este é apenas um loop no intervalo de 0 a 287999, exibindo o índice como um número misto baseado 20-6-20-6-20, com os "dígitos" do número recuperados das tabelas nas duas últimas linhas.
fonte
Perl 6 , 70 bytes
Explicação da parte interessante:
O código anterior apenas gera a lista de vogais (
$_
) e a lista de consoantes (c
), que é lamentavelmente detalhada.fonte
Python 2 ,
120117 bytesObrigado a @WheatWizard pela dica de guias.
Experimente online!
Não tenho certeza de que isso possa ser muito praticado. Experimente online trunca em 128KB, mas mostra o suficiente para dar uma idéia. Uma execução local com código de depuração para contar as palavras deu um total de 288000. Executa em cerca de 45 segundos, se alguém quiser testar.
Versão não compatível e, portanto, não concorrente (imprime matrizes aninhadas em vez do formato especificado) para 110 bytes:
fonte
Perl 6, 53 bytes
Demora um pouco para obter qualquer saída. Muito ineficiente. Faz o trabalho.
fonte
xeger , 49 bytes
Dada uma expressão regular, o xeger simplesmente gera todas as strings correspondentes. Para não matar o navegador, ele pausa a cada 1000 saídas e você precisa clicar para continuar, mas chegará lá eventualmente.
Aqui está uma versão de 23 bytes com um bug
^
corrigido:Estes são classes de personagens "todas as consoantes ASCII minúsculas"
[:c]
comy
excluída^y
, e "todas as vogais ASCII minúsculas"[:v:]
comy
acrescentou.fonte
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 bytes
Retorna uma matriz de seqüências de caracteres. Versão muito rápida para
102101 (1 byte graças a @ETHproductions) bytes:fonte
CJam ,
32312928 bytesEconomizou 2 bytes graças a Martin Ender e 1 byte graças a kaine
Experimente online! (Observe que a saída é cortada no TIO)
Explicação
fonte
'{,97>
para pegar o alfabeto. E depois"aeiouy"_'{,97>^
salvar outro byte1$
.Empilhados, não concorrentes, 51 bytes
Bem simples. Experimente aqui!
fonte
Perl,
635954 bytesTentando Perl golf para variar.
EDIT: Parece que ainda tenho muito a aprender ... :)
fonte
/$b[^$a]/&&say for"a"x5.."z"x5
para salvar alguns bytes. Editar: e você pode soltar o$b
e fazer$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Além disso, como seu regex verifica 5 caracteres, você pode fazê-loa.."z"x5
.$a
e$b
como nomes de variáveis, porque esses não precisam ser declarados mesmo no modo estrito ... :) Eu também uso muito o Perl 6 hoje em dia, que nem sequer possui um modo não estrito.Scala,
8786 bytesfonte
f"$c$d$e$f$g"
por""+c+d+e+f+g
para salvar um byte.R,
143132 bytesEsta é a minha primeira vez no código de golfe, por isso gostaria de receber sugestões para reduzi-lo ainda mais. Até agora, é tudo R padrão; a única coisa possivelmente complicada aqui é que paste0 recicla seus argumentos na extensão da mais longa.
Edit: usado truque de atribuição de rturnbull, substituído
sapply(x,length)
porlengths
.fonte
R,
11198 bytesAdicionado
y
como vogal e com 13 bytes de golfe, graças a @Patrick B.Usamos
expand.grid
para gerar todas as combinações possíveis deV
eC
em uma matriz, que definimos a partir da variável predefinidaletters
(o alfabeto). Invertemos as combinações (como o padrão é a primeira variável girar mais rapidamente) para garantir a ordem alfabética. Em seguida, percorreremos cada linha da matriz, imprimindo cada letra em stdout. Usamos ofill
argumento paracat
garantir que cada palavra comece em uma nova linha.fonte
Clojure, 101 bytes
Não é tão emocionante ...
fonte
Ruby,
6561 bytesAbordagem completamente diferente:
Coisas novas que aprendi hoje: a função do produto Array #
fonte
Bytes C 361
Versão não destruída:
Deve haver alguma maneira de reduzir isso definitivamente.
Explicação
fonte