Converta 1, 2, 3, 4, 5, 6, 7, 8 e 9 em "um", "dois", "três" etc.

47

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 , então o código mais curto vence
Jon
fonte
2
O espaço em branco à direita (ou seja one ) é aceitável?
grc
1
@grc Sim, desde que o programa emita a palavra.
Jon
1
você deve especificar que apenas o número fornecido pode ser impresso e não os outros números.
precisa saber é o seguinte
1
@Pinna_be por exemplo, se a entrada I 3, você não pode dar saída one two three four five six seven eight nine, mesmo que tecnicamente saída three. Da mesma forma, você não pode produzir three seven, etc.
Jon
1
Esta pergunta foi bastante agradável. Mas não gosto da adição do limite de datas. Especialmente, o limite de data foi adicionado imediatamente antes do limite de data, e não sete dias antes.
Nicolas Barbulesco 26/06

Respostas:

19

Bash (com bsdgames), 9

number -l

Lê da entrada padrão.

Não sei por que há um utilitário para isso, mas tanto faz.


fonte
2
Não tenho certeza se gosto de instalar o bsdgames e depois chamá-lo de "bash", apesar de admitir que minha reserva é subjetiva.
Paul Draper
@PaulDraper Nem eu. Eu não postei isso como uma resposta séria, acho que uma das outras respostas merecia ser aceita #
5
Isso não é uma brecha padrão?
Justin
2
@ Quincunx sim, é basicamente. Embora a maioria das coisas sejam utilitários externos no Bash, eu não consideraria o pacote bsdgames como algo muito permitido (ao contrário do grep, wget, coreutils, sed, bc ...).
132

Python 2, 64

print' ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt'[input()::9]

É assim que a string se parece com um espaço em branco extra (tente ler na vertical):

o t t f f s s e n
n w h o i i e i i
e o r u v x v g n
    e r e   e h e 
    e       n t

Conforme explicado nos comentários abaixo, [input()::9]inicia no índice especificado e seleciona cada nono caractere subseqüente.

grc
fonte
9
Oh, merda, eu gosto disso. Provavelmente vale ressaltar que este é python 2, a propósito.
undergroundmonorail
3
Explique por favor! :)
Christofer Ohlsson,
6
@ChristoferOlsson input()::9é um intervalo do input()final da string em etapas de 9, como 1,10,19,28,37ou 3,12,21,30,39, que são exatamente os índices nos quais as letras da palavra correspondente são encontradas.
Martin Ender
1
@ m.buettner thanks! Isso é bom.
Christofer Ohlsson
6
Isso não é algo como o que uma cifra de cerca de trilho faz? (+1 para uma solução elegante por sinal.)
Lou
18

Lisp comum - 22 bytes

Aqui está um geral (não apenas para um dez):

(format nil"~R"(read))

Oh, você quer ordinais (primeiro, segundo, ... trezentos centésimos ...)? Está bem!

(format nil"~:R"(read))
filcab
fonte
10
Isso não é uma brecha padrão?
seequ
2
Brecha em que sentido? É claramente definido no HyperSpec: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab
3
Seja uma brecha padrão ou não, é o que eu vim aqui também para postar. +1 :)
Joshua Taylor
5
@TheRare Olhando para os comentários dessa resposta, não acho que haja um forte consenso da comunidade de que isso seja uma brecha. Meu sentimento é que as perguntas precisam proibir explicitamente o uso desse tipo de função embutida para que não sejam usadas.
Digital Trauma
16

BASH 51

Então fiz outra usando minha segunda ideia, além de alguma ajuda de outras pessoas:

set one two three four five six seven eight nine

$X

Onde 'X' é o número que você deseja.


BASH 48 (67)

67 com \nquebras de linha

Não tenho certeza se isso conta totalmente, porque está lendo de um arquivo, mas:

sed -n Xp a

Onde "X" é a entrada e onde aestá um arquivo com:

one
two
three
four
five
six
seven
eight
nine

O arquivo tem 36 caracteres e o comando bash é 13.

Como funciona:

Cada linha do arquivo é numerada, começando com 1. Portanto, 'one' está na 1ª linha, 'two' na 2ª. O comando sed -n 'Xp' adiz: "Imprima o que está listado na linha 'X' do arquivo 'a'" sedé um editor de fluxo Unix. -nsignifica ficar em silêncio, ou apenas essencialmente ignorar todo o resto. Xpsignifica imprimir o que está na linha 'X'.

Eric Lagergren
fonte
2
Ótima primeira resposta! Obrigado por dedicar um tempo para descobrir como formatamos nossas respostas neste site. Bem-vindo à Programação de Puzzles e Code Golf!
Justin
2
Você não contou os feeds de linha a.
Dennis
1
Um byte a menos que antes, aceita um argumento da linha de comando e não requer arquivos adicionais: pastebin.com/qdbXKQGP O Bash se queixará do delimitador heredoc ausente, mas funcionará bem com o Dash e o Zsh.
Dennis
1
@ Dennis oh legal eu gosto. Devo editar minha resposta com a sua agora? Desculpe, sou novo no código de golfe.
Eric Lagergren
1
Você pode omitir as '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.
Digital Trauma
16

C # - 127 (86/46)

Se você pegar apenas a parte executável ...

Console.Write(((HourOfDay)Console.Read()-48));

e se isso HourOfDayfizesse parte do espaço para nome System, você precisaria de 46 caracteres. Infelizmente, ele fica no meio, o System.DirectoryServices.ActiveDirectoryque o torna 86 ... o outro ruído estraga tudo.

É compilável e executável a partir da linha de comando (127 caracteres):

using System;class P{static void Main(){Console.Write((System.DirectoryServices.ActiveDirectory.HourOfDay)Console.Read()-48);}}

se salvo em um arquivo chamado cg2.cs

csc cg2.cs /r:System.DirectoryServices.dll  && cg2

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 / caixa HourOfDaypara retornar 'Um'.

Dê uma olhada na versão Powershell desse mesmo truque

rene
fonte
Como é que isso funciona ? Digamos que eu digite 9. O que o programa faz então?
Nicolas Barbulesco 22/06
O que isso -48faz aqui?
Nicolas Barbulesco 22/06
2
@NicolasBarbulesco adicionou um Como isso funciona? parágrafo. Isso faz sentido?
rene
1
@NicolasBarbulesco - É classificado em ordem alfabética. O que faz sentido em todos os contextos, exceto "Essas palavras são números". Como tenho certeza de que a documentação é gerada automaticamente, não faria sentido para um caso especial no artigo.
Bobson
13

Befunge 98, 116 105 103 bytes

&1-       v
vvvvvvvvvj<
"""""""""
etnxereoe
nheivuewn
igvsiorto
nie"ffh""
"es ""t
 ""   "
>>>>>>>>>4k,@

Befunge não foi feito para isso ...

Explicação:

&1-           ;Grab the input number (`n`) and subtract 1 from it
&1-       v   ;Start moving downwards
          <   ;Start moving leftwards
         j    ;Jump `n - 1` characters to the left.
vvvvvvvvvj    ;Redirect each of the possible locations to jump to, sending the IP down.

        "     ;If `n` was 1, push `o, n, e` onto the stack (`o` is at the bottom)
        e
        n
        o
        "

       "      ;If `n` was 2, push `t, w, o` onto the stack
       o
       w
       t
       "

    *
    *
    *

"             ;If `n` was 9, push `n, i, n, e` onto the stack
e
n
i
n
"

>>>>>>>>>     ;Collect all the different possible positions the IP could be in, and send it right
>>>>>>>>>4k,  ;Print the top 5 chars. If there are less than 5, the rest are null characters. This is allowed
            @ ;End of program
Justin
fonte
8
@ Dennis Não vejo como isso pode ser tão difícil. Basta ter o arquivo, transformá-lo em um char[][], manter um xe ylocalização, e executar o personagem naquele local. O mais difícil seria definir a operação para todos os personagens possíveis.
Justin
1
Você pode salvar facilmente dois bytes com um &1-.
har-wradim
10

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

alert(btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[prompt()])

Teste simples

No console do Firefox:

[0,1,2,3,4,5,6,7,8,9]
.map(x=>x +',' btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[x])
edc65
fonte
Tentei algo semelhante, mas não consegui descobrir uma string base64 válida começando com um número. Eu acho que sua resposta foi corrompida pelo stackexchange.
Ndscore
@ndcorecore, maldito seja seu. Que altera o post, ainda é de acordo válido para mim
edc65
1
Com a versão que possui os caracteres de escape, tudo funciona menos 3 e 8, a saída Treee EightF.
21714 Justin
3
@Quincunx 'Tree' é eu não falo inglês
edc65
10

Javascript 73

alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[prompt()])

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])
nderscore
fonte
Tecnicamente, não alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])seria a mesma coisa, mas economizaria 8 bytes? O usuário ainda insere o número que eles querem ...
Eric Lagergren
@eric_lagergren, você quer dizer que o usuário teria que mudar o número na fonte? Eu não acho que isso contaria como entrada.
Ndscore
Oh, ok, entendo o que você quer dizer. Suponho que se você o executasse como um comando no console, seria parte da entrada, em oposição à fonte.
Eric Lagergren
7

Perl, 55

$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]

É executado com a opção -p(+1 byte), por exemplo:

perl -pe '$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]'

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 -pcuida da leitura da linha de entrada $_e imprime o resultado $_.

Variações:

  • Com a nova linha à direita (+3):

    $_=(nine,eight,seven,six,five,four,three,two,one)[-$_].$/

    ou (mesma contagem de bytes):

    s/./(nine,eight,seven,six,five,four,three,two,one)[-$&]/e

Atualizar:

  • Usando palavras simples em vez de qw[...](obrigado Zaid).

  • O índice negativo salva um byte (obrigado aragaer).

Heiko Oberdiek
fonte
1
Salve alguns caracteres:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid
2
@Zaid: Obrigado, ele salvou dois bytes. (Estou acostumado a use strict).
Heiko Oberdiek
Eu não gosto desse "-1". $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- um caractere menor.
Aragaer
@aragaer: Obrigado, boa ideia.
Heiko Oberdiek
6

Oracle SQL - 46

select to_char(to_date(&1,'j'),'jsp')from dual

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). O sp, é 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.

Ben
fonte
Tenho uma relação de amor / ódio com o RDBMS da Oracle, mas isso é legal.
rene
6

CJam, 45 43 bytes

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256bKb'ef+'j/li=

O 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:

" one two three four five six seven eight nine"S/li=

Experimente online.

Como funciona

" Convert the string into an integer by considering it a base-256 number.                ";

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256b

" Convert the integer from above into an array by considering it a base-20 number.       ";

Kb

" Add the ASCII character code of “e” to all elements of that array. This casts to char. ";

'ef+

" So far, we've pushed the string “jonejtwojthreejfourjfivejsixjsevenjeightjnine”.       ";

" Split the the above string where the character “j” occurs.                             ";

'j/

" Read an integer from STDIN and push the corresponding substring.                       ";

li=

Exemplo

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five
Dennis
fonte
Uau, nossas respostas são idênticas, mesmo em comprimento (presumo que o usuário insira uma string).
Justin
1
@Quincunx: Mentes parecidas pensam muito bem! : A entrada do usuário lendo P Mas vai custar dois bytes em CJam, então eu vou ter que pensar em outra coisa ...
Dennis
@ Quincunx: Ele também deve funcionar com o GolfScript, embora provavelmente não salve bytes. Dump Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis
Isto é o que eu consegui inventar; é mais: golfscript.apphb.com/…
Justin
Você sabe o que a codificação golfscript espera para caracteres não-ascii? Parece não ser utf-8
Justin
5

GolfScript, 51 bytes

~'
one
two
three
four
five
six
seven
eight
nine'n/=

É uma tabela de pesquisa simples. A entrada é avaliada ( ~), uma matriz dos valores é criada e o índice é encontrado.

Experimente aqui

Justin
fonte
O usuário deve inserir uma string, não é possível codificá-la. Além disso, seu Try it herelink tem um código diferente do código colado.
Jon
@Chipperyman O usuário insere uma string neste programa. A Try it herediferenç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.
Justin
Ah entendo. Não conheço muito bem o golfscript, obrigado por me informar.
Jon
2
@Chipperyman: GolfScript coloca o conteúdo de STDIN na pilha antes de executar o próprio script.
Dennis
2
Hah! Eu posso vencê-lo por um byte ! ;-)
Ilmari Karonen
4

Perl, 60 bytes

$_=(ZOneTwoThreeFourFiveSixSevenEightNine=~/.[a-z]*/g)[$_]

Requer a -popção (dois bytes).

Exemplo

$ perl -p convert.pl <<< 5
Five

Como funciona

  • -plê 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 $_.

  • -pimprime o valor de $_.

Dennis
fonte
2
Eu gosto do truque de regex. +1
veja
3

Lote DOS - 162 caracteres (incluindo quebras de linha)

Esta resposta foi inspirada na resposta Python do @ grc, embora eu tivesse algo semelhante em mente.

@setlocal enabledelayedexpansion
@set s="ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt
@set /a c=%1
@set z=!s:~%c%,1!
@if _%z%==_ exit /b
@echo %z%
@%0 %c%+9

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

cinco

você verá

f
i
v
e

Ruslan
fonte
3

Bash + coreutils, 64

Conceito de compactação não competitivo

xxd -p<<<TàPnàõ:àsÀ~®@ãCN|tr 0-9a-d \\ng-inor-x|sed -n $1p

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:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Saída de exemplo

$ ./n.sh 1
one
$ ./n.sh 9
nine
$ 

Explicação

Ocorreu-me que a sequência one two three four five six seven eight ninecontém apenas as letras efghinorstuvwxe 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 usar trou similar. Por sorte, rstuvwxsão consecutivos, portanto podem ser expressos quanto r-xa tr. A codificação é disposto de tal modo que ee fé deixado tal como está, e que as palavras são quebra de linha separada, para que possamos utilizar sedpara 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.

Trauma Digital
fonte
3

(puro) Bash, 64

Aceita entrada como seu primeiro argumento, assumindo entrada válida.

v=(o one two three four five six seven eight nine)
echo ${v[$1]}

Cria uma matriz ve 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):

v=(one two three four five six seven eight nine)
echo ${v[$1-1]}

fonte
2
Mesmo número de caracteres: v=(one two three four five six seven eight nine)eecho ${v[$1-1]}
Dennis Williamson
3

Python 2.x - 65 64

Não é tão bom quanto a resposta do @grc, mas certamente mais legível :-)

'one two three four five six seven eight nine'.split()[input()-1]

Um char a menos, graças a @flornquake

'nine eight seven six five four three two one'.split()[-input()]
Willem
fonte
Este também é legal. :-) Funciona.
Nicolas Barbulesco 22/06
3
Você pode salvar um personagem como este:'nine eight seven six five four three two one'.split()[-input()]
flornquake
Aquele é agradável!
Willem
3

Java 7 - 185

class Num{
public static void main(String[] args) {
    System.out.print("ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".split(",")[(new java.util.Scanner(System.in)).nextInt()-1]);
    }}
bebê
fonte
3

C 111

#include <stdio.h>
int main(){printf("%.5s","one  two  threefour five six  seveneightnine"+5*(getchar()-'1'));}

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!

Jerry Coffin
fonte
1
Os jogadores de código +1 geralmente não se importam se o seu código c for compilado com avisos , desde que atenda às especificações. Assim, você pode omitir o #includee main()'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.
Digital Trauma
Eu não entendo o comprimento, e não vejo onde haveria 7 caracteres.
Nicolas Barbulesco 26/06
@NicolasBarbulesco: São 111 caracteres - mas se tratarmos o 111como binário, isso seria convertido 7em decimal.
22814 Jerry Coffin
Jerry, existe um código de golfe em sua cabeça!
Nicolas Barbulesco
3

dizer bash (OS X): 3 8

"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:

say|read

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

PrimoCocaína
fonte
não deveria ser 5?
rpax
@rpax Eu não acredito que a entrada seja contada como um caractere, é?
CousinCocaine
1
Isso é inteligente. Mas isso perde a entrada.
Nicolas Barbulesco
1
Infelizmente, essa não é uma resposta válida porque: Ele nunca aceita entrada do usuário E só funciona se o número for 4. #
1155 Jon Jon
1
O comentário de Chipperyman nesta resposta de CousinCocaine é verdadeiro. Mas também é verdade para a resposta de @RegisteredUser . No entanto, Chipperyman rejeitou esta resposta por CousinCocaine e declarou a resposta pelo vencedor do usuário registrado, por exemplo. Além disso, a resposta do Usuário Registrado é uma réplica desta resposta da CousinCocaine. Isso é mais do que injusto.
Nicolas Barbulesco
2

VBScript 98 80 75

msgbox split(" one two three four five six seven eight nine")(inputbox(""))
confortavelmente
fonte
2

J - 68 ou 60 57 ou 53 bytes

Versão interativa (stdin):

>one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1

Versão da função:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:

Explicação:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:
                                                   <: Decrease by one
                                                 {~   Get the correct string
                                               >@     Unbox

".(1!:1)1 lê uma string e a converte em número inteiro

seequ
fonte
Você pode salvar um caractere escrevendo-o como train ( (;:'one two blah')>@{~<:) e outros seis usando o gerúndio em one`two`blahvez de ;:.
algorithmshark
@algorithmshark Thanks! Ainda estou aprendendo J. Embora a versão de trem não exija que o texto seja de classificação infinita (edit: aparentemente não ... por que não?) E as citações extras da versão gerúndio (edit: oh, ele cria uma lista de caixas)?
21414
Uma bifurcação pode ter um substantivo no argumento esquerdo, que é uma abreviação de um verbo constante que produz esse substantivo com classificação infinita (qv no Dicionário ). E não, não há aspas extras no gerúndio: nomes indefinidos são tratados como referências a verbos, e o gerúndio para isso é apenas uma string em caixa contendo o nome.
algorithmshark
Além disso, você não precisa escrever a versão STDIN como uma expressão verbal: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1é 3 caracteres mais curto.
algorithmshark
1
@algorithmshark Haha, por que não fiz dessa maneira?
seequ
2

Perl 36 (58 autônomo)

use Number::Spell;say spell_number<>

Ou, sem módulos adicionais:

say qw(one two three four five six seven eight nine)[<>-1]
el.pescado
fonte
Seu primeiro script não funciona no meu Mac. 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.
Nicolas Barbulesco 26/06
Seu segundo script não funciona no meu Mac. 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.
Nicolas Barbulesco 26/06
2

Em AppleScript; 123 caracteres.

{"one","two","three","four","five","six","seven","eight","nine"}'s item((display dialog""default answer"")'s text returned)

Este script recebe a entrada em um diálogo. Em seguida, fornece a saída no resultado do AppleScript  .

Exemplo:

  • Entrada : 6
  • Resultado : "six"

Aqui está uma versão melhor:

set l to {"one","two","three","four","five","six","seven","eight","nine"}
set n to text returned of (display dialog "?" default answer "")
display dialog (l's item n) buttons ("OK") default button 1

Esta versão exibe a saída em uma boa caixa de diálogo.

Exemplo:

  • Entrada : 9
  • Resultado : nine

[Resposta editada; melhorou ligeiramente o diálogo para a entrada; ainda 124 caracteres. Resposta editada novamente; agora 1 char a menos! ]

Nicolas Barbulesco
fonte
1
set n to text returned of... Uau.
seequ
2

Powershell - 91 74

[Enum]::ToObject([System.DirectoryServices.ActiveDirectory.HourOfDay],[Console]::Read()-48)

Descobriu como transmitir para remover a chamada Enum e ToObject:

[System.DirectoryServices.ActiveDirectory.HourOfDay]([Console]::Read()-48)

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 ...

rene
fonte
2

CJam - 50

Esta é uma solução ASCII simples que usa solicitações HTTP (isso é permitido na pergunta):

"aj21.com/"r+g

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 .

aditsu
fonte
1
Por favor, adicione um comentário se estiver com voto negativo.
Aditsu
-1, essa é uma brecha padrão .
nyuszika7h
3
@ nyuszika7h é especificamente permitido nesta pergunta
aditsu
1
Desculpe, eu perdi isso. Não posso desfazer meu voto negativo até que a resposta seja editada.
nyuszika7h
1
@ nyuszika7h editada
aditsu
2

Lote - 86

Muito mais curto que o outro lote, e surpreendentemente competitivo.

for /f "tokens=%1" %%1 in ("one two three four five six seven eight nine") do echo>%%1

Usado como filename.bat numbere a saída está na forma de um arquivo com o nome do número correto.

Furioso
fonte
2

Ruby 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]
Mhmd
fonte
1
Você pode cortar mais alguns bytes substituindo 9 diretamente no lugar de x
Sr. Alien
6
Não vejo onde esse código recebe entrada. E por que escrever 9-1quando você pode apenas dizer 8? Claro que ambos 9-1e 8estão errados; esse script gera "nove" o tempo todo e ignora a entrada.
precisa
2

BASH 9

réplica Linux sem vergonha da resposta da cousincoicane

spd-say 1

fala um

Usuário Registrado
fonte
1
Isso não funcionaria apenas se a entrada fosse 1?
Jon
1
@Chipperyman ele funciona para qualquer número
Usuário registrado
Limite, mas inteligente!
Nicolas Barbulesco 26/06
Isso perde a entrada.
Nicolas Barbulesco 26/06
@nicolasbarbulesco yes. mas havia muitas outras respostas que não entendiam, então fui adiante com isso.
Usuário registrado
2

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 -rpara reconstruir o programa GolfScript real de 50 bytes a partir do dump hexadecimal:

0000000: 7e6e 270b 97eb 442f e166 9894 9f00 c63c  ~n'...D/.f.....<
0000010: 8128 73a3 9b55 5065 a9fb f06a 2727 ff16  .(s..UPe...j''..
0000020: 277b 6261 7365 7d2f 2b6e 2f3d 7b39 392b  '{base}/+n/={99+
0000030: 7d25                                     }%

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 letra opara uma nova linha, que eu nestou 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 à letra m, que está convenientemente ausente dos nomes dos números.)

Aqui está uma versão descodificada do programa:

~       # eval the input, turning it into a number
n       # push a newline onto the stack; we'll need it later

# this is the byte string encoding the number names:
"\x0B\x97\xEBD/\xE1f\x98\x94\x9F\x00\xC6<\x81(s\xA3\x9BUPe\xA9\xFB\xF0j"

# convert the encoded string from base 255 to base 22
# (and, incidentally, from a string to an array):
"\xFF\x16" {base}/

+       # prepend the newline pushed earlier to the array, re-stringifying it
n/      # split the resulting string at newlines
=       # pick the substring corresponding to the input number
{99+}%  # add 99 to the character values in the chosen substring
Ilmari Karonen
fonte