Vencedor: resposta do professorfish bash ! Um inteiro de 9 bytes! Uau!
Você pode continuar enviando sua resposta, mas não poderá mais vencer. Post original mantido para a posteridade:
Seu objetivo é converter um número inteiro entre 1 e 9 na palavra que representa.
- Você não precisará se preocupar com decimais
- O usuário irá inserir um número. Suponha que eles nunca digitarão nada 10 ou superior
- O usuário deve digitar o número em algum momento; no entanto , o método que o programa lê não importa. Pode ser com stdin, lendo um arquivo de texto, etc., no entanto, o usuário deve pressionar o botão 9 no teclado (por exemplo) em algum momento
- Não diferencia maiúsculas de minúsculas (por exemplo, "um", "um", "um", "um" etc. são aceitáveis)
- Solicitações HTTP / etc são permitidas, no entanto , qualquer código executado pelo servidor para o qual a solicitação é feita conta para a contagem de bytes do seu código final (por exemplo, se um programa C ++ fez uma solicitação HTTP, o código PHP usado na solicitação HTTP conta )
- Qualquer coisa que possa compilar e executar é aceitável
- Este concurso terminou em 27 de junho de 2014 (7 dias após a publicação).
- Este é um código de golfe , então o código mais curto vence
one
) é aceitável?3
, você não pode dar saídaone two three four five six seven eight nine
, mesmo que tecnicamente saídathree
. Da mesma forma, você não pode produzirthree seven
, etc.Respostas:
Bash (com bsdgames), 9
Lê da entrada padrão.
Não sei por que há um utilitário para isso, mas tanto faz.
fonte
Python 2, 64
É assim que a string se parece com um espaço em branco extra (tente ler na vertical):
Conforme explicado nos comentários abaixo,
[input()::9]
inicia no índice especificado e seleciona cada nono caractere subseqüente.fonte
input()::9
é um intervalo doinput()
final da string em etapas de9
, como1,10,19,28,37
ou3,12,21,30,39
, que são exatamente os índices nos quais as letras da palavra correspondente são encontradas.Lisp comum - 22 bytes
Aqui está um geral (não apenas para um dez):
Oh, você quer ordinais (primeiro, segundo, ... trezentos centésimos ...)? Está bem!
fonte
BASH 51
Então fiz outra usando minha segunda ideia, além de alguma ajuda de outras pessoas:
Onde 'X' é o número que você deseja.
BASH 48 (67)
67 com
\n
quebras de linhaNão tenho certeza se isso conta totalmente, porque está lendo de um arquivo, mas:
sed -n Xp a
Onde "X" é a entrada e onde
a
está um arquivo com:O arquivo tem 36 caracteres e o comando bash é 13.
Como funciona:
fonte
a
.'
aspas. Você também pode tentar usar uma string here em vez do arquivo externo. Mas você realmente deve contar as quebras de linha em seu arquivo.C # - 127 (86/46)
Se você pegar apenas a parte executável ...
e se isso
HourOfDay
fizesse parte do espaço para nome System, você precisaria de 46 caracteres. Infelizmente, ele fica no meio, oSystem.DirectoryServices.ActiveDirectory
que o torna 86 ... o outro ruído estraga tudo.É compilável e executável a partir da linha de comando (127 caracteres):
se salvo em um arquivo chamado cg2.cs
Como é que isso funciona?
HourOfDay
é um tipo de enumeração, para que possamos usar nomes em vez de constantes mágicas. Os tipos de enumeração têm uma implementação ToString () que fornece o nome do valor . Você pode converter um int para um enum. Console.Read () lê um caractere do fluxo de entrada representado como um número inteiro. digitar '1' fornece 49 , subtrair 48 para obter 1, converter / caixaHourOfDay
para retornar 'Um'.Dê uma olhada na versão Powershell desse mesmo truque
fonte
-48
faz aqui?Befunge 98,
116105103 bytesBefunge não foi feito para isso ...
Explicação:
fonte
char[][]
, manter umx
ey
localização, e executar o personagem naquele local. O mais difícil seria definir a operação para todos os personagens possíveis.&1-
.Javascript 68
Atob / btoa pode ser uma ferramenta de compactação pobre
(mas se você quiser tentar isso no console, não poderá copiar do texto formatado que vê ao mesmo tempo. Vá para 'editar' e copie no painel de origem)O editor de descontos não gosta de alguns dos caracteres nesta resposta: alguns caracteres se perdem ao salvar. Ainda assim, acho que é um problema de editor, não meu. Os caracteres perdidos são caracteres unicode de 8 bits perfeitamente válidos.
(Ou então, estou errado, se esse problema já foi debatido na meta, avise-me) Aqui está a versão com caracteres ofensivos escapados, cada sequência \ xNN deve contar 1
Teste simples
No console do Firefox:
fonte
Tree
eEightF
.Javascript 73
69
fonte
alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])
seria a mesma coisa, mas economizaria 8 bytes? O usuário ainda insere o número que eles querem ...Perl, 55
É executado com a opção
-p
(+1 byte), por exemplo:A entrada é esperada em STDIN e a saída é gravada em STDOUT.
O código apenas gera uma matriz e seleciona o elemento certo. A opção
-p
cuida da leitura da linha de entrada$_
e imprime o resultado$_
.Variações:
Com a nova linha à direita (+3):
ou (mesma contagem de bytes):
Atualizar:
Usando palavras simples em vez de
qw[...]
(obrigado Zaid).O índice negativo salva um byte (obrigado aragaer).
fonte
$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
use strict
).$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]
- um caractere menor.Oracle SQL - 46
Demonstração
Isso inclui uma brecha padrão , admito, mas o SQL é mais curto que o Golfscript; Eu não pude resistir!
Ele funciona (ab) usando os modelos de formato de data e hora da Oracle .
TO_DATE(n, 'j')
converte um número em um dia juliano , o número de dias desde 1º de janeiro de 4712 aC.TO_CHAR(<date>, 'jsp')
converte isso de volta no número inteiro (embora como uma string). Osp
, é um sufixo do elemento de formato que soletra o número. Isso realmente funcionará com muitos números.A
&1
é uma variável de substituição que só vai trabalhar com clientes que aceitá-la, por exemplo, SQL * Plus.fonte
CJam,
4543 bytesO acima usa as notações ^ e M, pois alguns caracteres não são imprimíveis.
Ao custo de mais 9 bytes, caracteres imprimíveis podem ser evitados:
Experimente online.
Como funciona
Exemplo
fonte
IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
GolfScript, 51 bytes
É uma tabela de pesquisa simples. A entrada é avaliada (
~
), uma matriz dos valores é criada e o índice é encontrado.Experimente aqui
fonte
Try it here
link tem um código diferente do código colado.Try it here
diferença do código no link é porque a página da Web não suporta a entrada do usuário. Altere a sequência após;
, isso é idêntico à entrada do usuário.Perl, 60 bytes
Requer a
-p
opção (dois bytes).Exemplo
Como funciona
-p
lê de STDIN e salva o resultado em$_
.=~/.[a-z]*/g
divide a palavra de barra anterior em substrings de uma letra (maiúscula) seguida por qualquer número de letras minúsculas.(…)
coleta as substrings em uma matriz.[$_]
recupera a substring correspondente à entrada do usuário.$_=…
salva o resultado em$_
.-p
imprime o valor de$_
.fonte
Lote DOS - 162 caracteres (incluindo quebras de linha)
Esta resposta foi inspirada na resposta Python do @ grc, embora eu tivesse algo semelhante em mente.
Uso:
[Nome do arquivo] [número]
Por exemplo, se o código estiver em um arquivo chamado speak.bat e você desejar ver o número "cinco", execute-o como:
speak 5
Além disso, a saída é de cima para baixo, não da esquerda para a direita! Então, ao invés de
você verá
fonte
Bash + coreutils, 64
Conceito de compactação não competitivo
Alguns dos caracteres exóticos aqui podem não renderizar bem, portanto esse script pode ser reconstruído a partir de sua representação base64:
Saída de exemplo
Explicação
Ocorreu-me que a sequência
one two three four five six seven eight nine
contém apenas as letrasefghinorstuvwx
e um separador de espaço - 15 valores de caracteres no total. Assim, cada caractere pode potencialmente ser representado em 4 bits ou 2 caracteres por 1 byte. Podemos usar a representação hexadecimal de um byte como uma maneira fácil de dividir cada byte em dois dígitos hexadecimais. Podemos então transformar os dígitos hexadecimais de volta nas letras que precisamos usartr
ou similar. Por sorte,rstuvwx
são consecutivos, portanto podem ser expressos quantor-x
atr
. A codificação é disposto de tal modo quee
ef
é deixado tal como está, e que as palavras são quebra de linha separada, para que possamos utilizarsed
para ouptut apenas a linha que precisa.Esse processo de decodificação acaba usando uma quantidade razoável de espaço extra, tornando essa resposta não competitiva como uma resposta no estilo de script de shell, mas pode ser um conceito útil em outros idiomas.
fonte
(puro) Bash, 64
Aceita entrada como seu primeiro argumento, assumindo entrada válida.
Cria uma matriz
v
e acessa o elemento especificado na entrada. Como matrizes são zero-indexadas, tive que adicionar um 0º elemento como um espaço reservado. Como alternativa (thnx @DennisWilliamson por apontar isso):fonte
v=(one two three four five six seven eight nine)
eecho ${v[$1-1]}
Python 2.x -
6564Não é tão bom quanto a resposta do @grc, mas certamente mais legível :-)
Um char a menos, graças a @flornquake
fonte
'nine eight seven six five four three two one'.split()[-input()]
Java 7 - 185
fonte
C 111
O comprimento aqui é cuidadosamente projetado para que eu possa interpretá-lo como binário e convertê- lo em decimal. Com apenas 7 caracteres, estou confiante de que tenho um vencedor!
fonte
#include
emain()
's tipo de retorno. Também um pouco de refatoração de sua expressão:main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}
. 86 caracteres pela minha contagem.111
como binário, isso seria convertido7
em decimal.dizer bash (OS X):
38"Seu objetivo é converter um número inteiro entre 1 e 9 na palavra que representa"
A última vez que verifiquei, palavras faladas também são palavras. Tentativa anterior (não aceita entrada)
say 4
Editar, deve poder ler a entrada:
Digite qualquer número e a palavra será exibida. Eu sei que a data final está vencida, mas na minha opinião eu deveria ter vencido o concurso.
Exemplo de arquivo de áudio: four.aiff
fonte
VBScript
988075fonte
J -
68 ou 6057 ou 53 bytesVersão interativa (stdin):
Versão da função:
Explicação:
".(1!:1)1
lê uma string e a converte em número inteirofonte
(;:'one two blah')>@{~<:
) e outros seis usando o gerúndio emone`two`blah
vez de;:
.>one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1
é 3 caracteres mais curto.Perl 36 (58 autônomo)
Ou, sem módulos adicionais:
fonte
Can't locate Number/Spell.pm in @INC (@INC contains: /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2level /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.2 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at toto.pl line 1.
BEGIN failed--compilation aborted at toto.pl line 1.
syntax error at titi.pl line 1, near "say qw(one two three four five six seven eight nine)"
Execution of titi.pl aborted due to compilation errors.
Em AppleScript; 123 caracteres.
Este script recebe a entrada em um diálogo. Em seguida, fornece a saída no resultado do AppleScript .
Exemplo:
6
"six"
Aqui está uma versão melhor:
Esta versão exibe a saída em uma boa caixa de diálogo.
Exemplo:
9
nine
[Resposta editada; melhorou ligeiramente o diálogo para a entrada; ainda 124 caracteres. Resposta editada novamente; agora 1 char a menos! ]
fonte
set n to text returned of
... Uau.Powershell -
9174Descobriu como transmitir para remover a chamada Enum e ToObject:
Como é que isso funciona?
HourOfDay é um tipo de enumeração, para que possamos usar nomes em vez de constantes mágicas. Os tipos de enumeração têm uma implementação ToString () que fornece o nome do valor constante. Você pode converter um int para um enum. Console.Read () lê um caractere do fluxo de entrada representado como um número inteiro. digitar '1' fornece 49, subtrai 48 para obter 1, convertido em HourOfDay para retornar 'One'.
Como o powershell faz um ToString em todos os objetos que estão sendo gravados no fluxo de saída e não precisa do fluff para transformá-lo em um executável, tudo o que é necessário além do powershell ...
fonte
CJam - 50
Esta é uma solução ASCII simples que usa solicitações HTTP (isso é permitido na pergunta):
No servidor, existem 9 arquivos de texto sem formatação denominados 1, 2, ..., 9, cada um contendo a palavra correspondente.
Tamanho total: 14 + 3 ("um") + 3 ("dois") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
É possível jogar mais golfe usando um domínio mais curto.
O interpretador online não suporta solicitações HTTP, portanto, o programa precisa ser executado usando o interpretador java .
fonte
Lote - 86
Muito mais curto que o outro lote, e surpreendentemente competitivo.
Usado como
filename.bat number
e a saída está na forma de um arquivo com o nome do número correto.fonte
Ruby 64
fonte
9-1
quando você pode apenas dizer8
? Claro que ambos9-1
e8
estão errados; esse script gera "nove" o tempo todo e ignora a entrada.BASH 9
réplica Linux sem vergonha da resposta da cousincoicane
fala um
fonte
GolfScript, 50 bytes
Queria ver se conseguia vencer a solução GolfScript de 51 bytes da Quincunx . Acontece que, com truques suficientes, sim, eu posso - por um byte.
Como um dos truques que estou usando é o uso de bytes fora do intervalo ASCII imprimível, o programa resultante não pode ser colado diretamente aqui. Em vez disso, estou fornecendo um despejo hexadecimal; os usuários dos sistemas Unixish podem usar
xxd -r
para reconstruir o programa GolfScript real de 50 bytes a partir do dump hexadecimal:O truque básico usado para gerar esse programa é simples: comprima a literal de cadeia longa que compõe a maior parte do código do Quincunx subtraindo 99 (o código ASCII da letra
c
) dos valores dos caracteres, interpretando os valores resultantes como um número na base 22 (o suficiente para codificar as letras atéx
) e, em seguida, recodifique o número resultante na base 255 para produzir a sequência de bytes não imprimível que compõe a maior parte da primeira metade do meu programa. O restante do programa reverte esse processo, decodificando a string novamente em algo imprimível.(Como a letra mais baixa realmente presente nos nomes dos números é
e
, eu poderia ter reduzido ainda mais a cadeia de bytes subtraindo 101 dos códigos ASCII e usando a base 20. No entanto, a subtração 101 teria mapeado a letrao
para uma nova linha, que eun
estou usando como delimitador de número porque está convenientemente disponível como a constante incorporada no GolfScript.Como solução alternativa, isso me custaria mais do que o byte que uma base inferior salvaria.O uso do deslocamento 99 deixa a nova linha correspondente à letram
, que está convenientemente ausente dos nomes dos números.)Aqui está uma versão descodificada do programa:
fonte