O desafio:
Imprima cada palavra de duas letras aceitável no Scrabble usando o mínimo de bytes possível. Eu criei uma lista de arquivos de texto aqui . Veja também abaixo. Existem 101 palavras. Nenhuma palavra começa com C ou V. Soluções criativas, mesmo que não sejam ótimas, são incentivadas.
AA
AB
AD
...
ZA
Regras:
- As palavras produzidas devem ser separadas de alguma forma.
- O caso não importa, mas deve ser consistente.
- Espaços à direita e novas linhas são permitidos. Nenhum outro caractere deve ser produzido.
- O programa não deve receber nenhuma entrada. Recursos externos (dicionários) não podem ser usados.
- Sem brechas padrão.
Lista de palavras:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Respostas:
Python 3,
194188 bytesDefinitivamente, não é o método mais curto, mas achei que seria um bom começo. Tente agrupar cada par em caminhos, sobrepondo o máximo possível (por exemplo,
"ODEX..."
=["OD", "DE", "EX", ...]
). Os espaços são usados para separar caminhos e quaisquer pares com um espaço são removidos (o espaço à direita é para impedir que um únicoE
seja impresso no final).Eu também tentei regex golf isso, mas foi mais longo.
fonte
AYAHOYOWOMUNUHAID
!CJam,
9694 bytesO acima é um hexdump, que pode ser revertido com
xxd -r -c 16 -g 1
.Experimente online no intérprete CJam .
Dependendo do que exatamente conta como separado , a contagem de bytes pode ser reduzida para 93 ou mesmo 92 :
Se substituirmos
-55
por59
, as palavras serão separadas por espaços sem quebra (0xA0).Se substituirmos
-55
porW
, as palavras serão separadas por arroba (0x40).Idéia
Podemos codificar cada par de letras xy como (ord (x) - 65) × 25 + (ord (y) - 65) . 1
Em vez de armazenar os números inteiros resultantes, armazenaremos as diferenças de todos os pares que correspondem a duas palavras adjacentes (classificadas em ordem alfabética).
A diferença mais alta é 35 , portanto, consideramos os dígitos do número inteiro base 36 e convertemos esse número inteiro em uma sequência de bytes.
Código
1 Como a segunda letra nunca é um Z , usar 25 em vez de 26 é suficiente.
fonte
PHP
224, 218, 210206Definitivamente não é uma ótima pontuação, mas gostei do desafio.
Eu crio uma tabela de opções, criei um sistema bit a bit para sinalizar quais opções são válidas.
Então eu codifiquei a base-36 para obter a string:
Observe que a terceira entrada nessa matriz de cadeias não tem um valor, porque C não tem opções.
Para imprimir os valores, basta converter as opções válidas em caracteres.
Pode haver algo que eu possa fazer para reduzir o reconhecimento de que não há palavras terminadas em C, J, K, Q, V ou Z, mas não consigo pensar em um método para reduzi-lo em ATM.
Ao transpor a tabela, há mais elementos vazios e os dados codificam um pouco mais compactamente, o que reduz alguns bytes. A matriz agora é impressa em uma ordem diferente:
Obrigado a Ismael pela explosão e pelas dicas de loop.
Com uma atualização para php5.6,
pow(,)
pode ser substituído**
salvando outros 4 bytes.fonte
","
, você pode usarexplode(0,UB1YB0100CUP[...])
3
eu possa usar isso! Graças$e++;for($f=0;$f<26;$f++)
porfor($e++,$f=0;$f<26;$f++)
, e agora você pode removê-los{}
. E se você deseja converter caracteres em minúsculas, use$e^' '
.Perl,
167164157 bytesEscreva um script separado para agrupar as letras o mais compacto possível em uma sequência que contenha todas as palavras válidas de 2 letras. Isso então itera sobre todas as duas palavras da letra e imprime as válidas, uma por linha. Corra com
perl -M5.10.1 script.pl
.fonte
-M5.10.1
para usar asay
palavra - chave adicionada nessa versão ou adicionaruse feature 'say';
no corpo do script.C, 155 bytes
Versão Golfed
Saída
Versão ungolfed
A seqüência mágica de 51 bytes na versão golfed contém muitos caracteres além do ASCII 126, que quase certamente foram transformados em equivalentes Unicode. A versão ungolfed usa hex em vez disso, e como uma constante e não como literal. Além disso, a versão ungolfed separa as palavras com uma nova linha, o que facilita copiar e colar no Excel, ordenar a lista e comparar com a necessária.
Explicação
Se expandirmos a definição de vogal para incluir as 8 letras AHMEIOUY, observaremos que todas as palavras consistem em uma vogal e outra (que pode ou não ser uma vogal.) Portanto, para todas as palavras que terminam em vogal, precisa de uma tabela de 26 bytes, uma para cada primeira letra, com os bits individuais correspondentes à vogal. Precisamos de uma tabela semelhante para as palavras que começam com uma vogal, exceto que desta vez precisamos apenas de 25 bytes, pois não há palavras que terminem em Z. As duas tabelas são reunidas para criar a mesa final.
Para evitar códigos ASCII na região 0..31, as duas "vogais" M e H menos comuns são atribuídas ao 6º e 7º bits, e a codificação considera 1 para uma palavra inválida e 0 para uma palavra válida. Como não há consoante que emparelhe com M e H, é possível garantir que pelo menos um desses bits seja 1.
O oitavo bit é atribuído a A, que é a vogal mais comum, para tentar limitar os caracteres não-ASCII (ainda existem muitos deles).
As tabelas usadas estão abaixo. Para palavras contendo 2 vogais, priorizei a primeira letra como sendo considerada a "vogal" e a segunda letra como a "letra". Uma exceção a isso são as palavras que começam com M, pois evitam conflitos entre MM e HM.
Codificação hexadecimal de palavras que começam com uma vogal
Codificação hexadecimal de palavras que terminam com uma vogal
fonte
Java,
484448407391389 bytesMinha primeira tentativa
Formatado:
Experimente online
fonte
\n
por apenas um espaço. Eles não precisam ser separados por novas linhas."".format
É doloroso de se olhar, mas hilário.Ruby, 166 bytes
Emprestando o puro método do sp3000 para codificar as palavras em uma sequência compacta. O kicker aqui é o método curto para decodificá-lo de volta para as palavras de duas letras: Usar um lookahead no regex passado para o método de varredura de String para extrair correspondências sobrepostas, sem ocupar espaço:
Ruby, 179 bytes
Minha própria abordagem: gere todas as palavras de duas letras entre
AA
eZA
e selecione as válidas usando uma máscara de bits codificada em base 36:fonte
Matlab, 177 bytes
Gere uma matriz binária definindo todos os pares de letras permitidos, reformule-a e codifique-base-64. A string codificada na base 64 (
'CR+ ... % '
) é usada como dados no programa. O programa reverte as operações para descompactar a matriz e depois lê os pares permitidos:fonte
Malbolge , 2118 bytes
Experimente online!
fonte
Bash, 179 bytes
Ele usa
sed
para fazer a substituição do regex. A primeira entrada de regex é baseada na ideia do Sp3000, enquanto a segunda regex usa entrada comum sem espaços.Explicação:
fonte
`grep -o ..
em vez de`sed -r 's/ / &/g'
, um truque da minha resposta abaixo.Como todas as palavras têm dois caracteres, podemos agrupá-las e separá-las novamente usando uma expressão regular simples.
Qualquer idioma compatível com regex pode fazer isso, alguns com mais eficiência do que outros:
Grep (via Bash), 215 bytes
Javascript, 224 bytes
Perl, 225 bytes
Python, 245 bytes
Como observação, algumas das respostas aqui são mais longas do
echo
que eu consideraria uma linha de base:Shell POSIX, 307 bytes
fonte
C -
228217 bytes - CCGSerá atualizado se eu puder diminuí-lo, basta compilar com as saídas gcc -w, ./a.out perfeitamente. Se houver algum interesse em um não-destruído, me avise.
Não consigo pensar em nenhuma maneira de reduzi-lo do topo da minha cabeça (você pode remover tecnicamente as aspas em put e você ainda obterá uma resposta correta, a saída se parece com lixo), por favor, avise-me de qualquer maneira para encurtá-lo
fonte
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
Alterei o delimitador de saída de uma nova linha para um espaço, mas se você preferir uma nova linha (uma byte extra) altere a sequência de caracteres do formato printf para"%c%c\n"
C #, 348 bytes
Eu tentei:
Ungolfed:
fonte
Pitão , 140 bytes
Experimente online!
Método de compressão: como não existe
Z
na segunda posição de nenhuma palavra, use o alfabeto reordenadobcdfghjklmnpqrstvwxyaeiou
para codificar a validade de cada uma dessas letras como uma segunda letra para cada primeira letra (as primeiras letras estão em ordem alfabética).São 25 bits por letra ou exatamente 5 dígitos da Base 32. Como a maioria das consoantes só usa vogais como segunda letra, coloquei vogais no final para obter principalmente números de um dígito para elas. Tenho certeza de que, em geral, poderia ser melhorado com mais análises e reordenações do alfabeto, embora a definição do alfabeto reordenado ocupasse mais bytes.
Explicação
fonte
PHP:
211209204Você precisa desativar os avisos, caso contrário, um será impresso com relação à criação implícita de
$b
Muito divertido. As primeiras tentativas foram na faixa de 250, mas este é o meu mais fino ainda.
fonte
!
o se ... você precisava disso.CJam (99 bytes)
Isso inclui alguns caracteres especiais, portanto, é mais seguro fornecer um hexdump. (Em particular, o personagem com valor
0xa0
, correspondente a um espaço ininterrupto, me causou alguns problemas na configuração da demonstração online).Demonstração online .
A abordagem é codificação de diferenças na base-26.
fonte
65f+:c
por'Af+
.md
é uma melhoria brilhante, mas eu não tinha percebido o quão perto minha resposta está da sua.CJam,
10098 bytes(link permanente)
Esta é a minha primeira entrada no CJam, então provavelmente existe o potencial para um pouco mais de golfe. No entanto, criei uma maneira de compactar a lista de caracteres para 63 bytes, o que, espero, alguém achará útil.
Método de compressão
Até agora, a maioria dos métodos que eu vi codificava as duas letras de cada palavra. No entanto, quando colocamos as palavras em ordem alfabética, a primeira letra não muda com muita frequência, por isso parece um desperdício codificá-la explicitamente.
Eu codifico apenas o último caractere de cada palavra e incluo um item especial sempre que o primeiro caractere deve aumentar. Os caracteres são codificados como o primeiro caractere e, em seguida, uma lista de diferenças. Como não há palavras duplicadas, todas as diferenças devem ser pelo menos
1
. Assim, eu posso usar0
como um item separador. (Observe que devo armazenar a primeira letra de cada subsequência como um indexado, caso contrário haveria confusão entre 'primeiro caractere de substituição0
' e 'iniciar com A0
'.)Como as diferenças nesse caso nunca são maiores que 15, podemos usar a base 16 e empacotar dois itens (4 bits) em cada byte (8 bits). (No código real, converti da base 260 em vez da base 256 para evitar problemas com caracteres não imprimíveis.)
fonte
G
eN
, que pressiona 16 e um avanço de linha.%-3<
por/;;
ou mesmo/&
. (A segunda opção irá gerar uma mensagem de erro. Consenso sobre meta é que é OK para fazer isso.)brainfuck , 1371 bytes
Bastante jogável, mas não me esforcei muito.
Experimente online!
fonte
Zsh, 175 bytes
Essa solução usa uma seqüência de caracteres de 125 caracteres, em que as letras minúsculas servem como delimitadores e a primeira letra da seguinte seqüência de letras maiúsculas.
Nós iteramos sobre as letras de
$L
. Se a letra atual$X
estiver em minúscula por comparação ascii, defina$W
como$X
. Caso contrário, imprima$W
concatenado com$X
para formar a palavra atual.Experimente Online!
Edit: anexado
:l
para definir minúsculas consistentemente, por requisitoEdit2: -4 bytes usando
$X
variável e simplificado se[[..]]
condiçãoEdit3: -4 bytes removendo aspas (
"
)Edit5: -5 bytes usando conversão de matriz em vez de iterar
L
conforme abaixoEdit4: Abordagem alternativa para 182 bytes , explorando cadeias reversíveis nas primeiras 33 letras,
$L
são apenas 107 letrasfonte
Stax , 91 bytes
Execute e depure
O único truque que essa resposta usa é usar o token "," para mostrar uma alteração na primeira letra, em vez de armazená-la para cada palavra.
Obrigado ao recursivo pela ideia de usar o operador m
fonte
M
vez de1/
e use um mapa abreviado emm
vez de foreach e print explícitos{ ... PF
. Este empacota a 89.Python 3, 224 bytes
Usa máscaras de bits de comprimento variável para codificar quais segundas letras existem para cada primeira letra possível. As máscaras de bits podem ter 0,1,3,7,15 ou 31 bits. Os bits são mapeados para letras com
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, os bits anteriores são usados para letras mais comuns, de modo que as máscaras de bits podem ser curtas na maioria dos casos (geralmente 3 ou 7 bits, pois a maioria das consoantes é seguida apenas por uma das 5 vogais ou YM ou H). Infelizmente, o código para decodificar nega a economia em comparação com métodos mais simples (a lista original é de apenas 303 bytes).fonte
Haskell, 192 bytes
Para cada palavra separada por espaço na string, coloque a primeira letra na frente de todas as outras letras e adicione um espaço, por exemplo
SHIO
- ->SH SI SO
.fonte
Java, 334 bytes
Formatado:
Separadamente, codifiquei a lista de palavras em um comprimento 26x26 = 676 BitSet, converti-a em uma matriz de bytes e, finalmente, na Base 64. Essa cadeia é codificada nesse programa e o procedimento inverso é usado para reproduzir o BitSet, e, finalmente, imprimir a lista de palavras
fonte
Java, 356 bytes
Usa o gerador de números aleatórios para obter as palavras:
Ungolfed:
Você pode experimentá-lo aqui: http://ideone.com/Qni32q
fonte
Perl, 248 bytes
Primeira vez usando perl (e golfe pela primeira vez), então definitivamente há espaço para melhorias. Fatore as vogais e agrupe as letras restantes com base em como a palavra resultante foi criada - adicionando a vogal primeiro, último ou ambos, vogal primeiro e último, crie uma palavra na lista.
fonte
"MM "."MY "."BY "."HM "."SH "
poderia ser reduzido para"MM MY BY HM SH"
.Javascript (ES6), 214
Talvez não seja a maneira mais curta de fazer isso, mas definitivamente interessante.
Faz um loop através de cada letra na primeira sequência, adicionando-a a cada letra na linha correspondente da segunda. Isso retorna as palavras na ordem da última letra, da seguinte forma:
Sugestões são bem-vindas!
fonte
Java,
255254 bytesEncontrei uma maneira de extrair mais um byte dele.
Ou (embora não seja muito claro):
fonte
'A'
em65
.Haskell,
333308298 bytesApenas por diversão!
A avaliação
s
imprimirá todas as palavras em uma ordem estranha - usei o fato de que a maioria das combinações é consoante de vogal ou vice-versa, provavelmente poderia otimizar ainda mais com "classes" de caracteres personalizados, encurtando a matriz codificada (aquiw
ek
).Alguém conhece uma maneira mais curta de imprimir seqüências de caracteres sem aspas e colchetes do que a minha monádica? As classes de tipo são ainda mais longas, até onde eu sei.
Além disso, também pode haver uma maneira mais curta de fazer
p
o trabalho ...fonte
sequence_
o mesmo quevoid$sequence
? Então você pode omitir também oimport
.void
teve que ser importado. Enfim, vou ter que lembrar disso.sequence_$map putStrLn
émapM_ putStrLn
. Substitua o(
,)
em tornoconcat$...
com outro$
.05AB1E , 143 bytes (Não concorrência)
Experimente online!
fonte
PHP, 170 bytes
abordagem mais curta que pude encontrar até agora ...
demolir
Nota A versão mais curta de mapeamento de bits com ascii imprimível custa 190 bytes (dados de 113 bytes + decodificação de 77 bytes) usando 6 bits = base 64, 174 bytes (97 dados, decodificação 77) usando 7 bits (base 128); possivelmente um pouco mais para escapar.
A base 224 (usando ascii 32..255) recebe dados de 87 bytes (+ escape); mas acho que a decodificação custará mais de 10 bytes extras.
A exclusão de C e V do mapa economizaria 16/14/13 bytes nos dados, mas custaria muito em decodificação.
fonte