Convierta 1, 2, 3, 4, 5, 6, 7, 8 y 9 a "uno", "dos", "tres", etc.

47

Ganador: ¡ la respuesta contundente del profesorfish ! ¡Un total de 9 bytes! ¡Guauu!

Puede continuar enviando su respuesta, sin embargo, ya no puede ganar. Publicación original mantenida para la posteridad:


Su objetivo es convertir un número entero entre 1-9 en la palabra que representa.

  • No tendrá que preocuparse por los decimales.
  • El usuario ingresará un número. Suponga que nunca ingresarán nada de 10 o más
  • El usuario debe escribir el número en algún momento, sin embargo , el método que lea el programa no importa. Puede ser con stdin, leer un archivo de texto, etc., sin embargo, el usuario debe presionar el botón 9 en su teclado (por ejemplo) en algún momento
  • No distingue entre mayúsculas y minúsculas (es decir, "uno", "Uno", "oNe", "OnE", etc., todos son aceptables)
  • Se permiten solicitudes HTTP / etc., sin embargo , cualquier código ejecutado por el servidor al que se hace la solicitud cuenta para el recuento de bytes de su código final (p. Ej., Si un programa C ++ realiza una solicitud HTTP, el código PHP utilizado en la solicitud HTTP cuenta )
  • Cualquier cosa que pueda compilarse y ejecutarse es aceptable

  • Este concurso finalizó el 27 de junio de 2014 (7 días después de la publicación).
  • Este es un , por lo que gana el código más corto
Jon
fuente
2
¿Es one aceptable el espacio en blanco final (es decir )?
grc
1
@grc Sí, siempre que el programa emita la palabra.
Jon
1
debe especificar que solo se imprima el número dado y no los otros números.
Pinna_be
1
@Pinna_be, por ejemplo, si ingreso 3, no puede emitir one two three four five six seven eight nineaunque técnicamente genere three. Del mismo modo, no puede emitir three seven, etc.
Jon
1
Esta pregunta fue bastante buena. Pero no me gusta agregar el límite de fecha. Especialmente, el límite de fecha se ha agregado justo antes del límite de fecha, no 7 días antes.
Nicolas Barbulesco

Respuestas:

19

Bash (con bsdgames), 9

number -l

Lee desde la entrada estándar.

No sé por qué hay una utilidad para esto, pero lo que sea.


fuente
2
No estoy seguro de que me guste instalar bsdgames y luego llamarlo "bash", aunque admito que mi reserva es subjetiva.
Paul Draper
@PaulDraper Yo tampoco. No publiqué esto como una respuesta seria, creo que una de las otras respuestas merecía ser aceptada
55
¿No es esto una escapatoria estándar?
Justin
2
@Quincunx sí, básicamente lo es. Aunque la mayoría de las cosas son utilidades externas en Bash, no consideraría el paquete bsdgames como algo muy permisible (a diferencia de grep, wget, coreutils, sed, bc ...).
132

Pitón 2, 64

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

Así es como se ve la cadena con algunos espacios en blanco adicionales (intente leer verticalmente):

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

Como se explica en los comentarios a continuación, [input()::9]comienza en el índice dado y selecciona cada noveno carácter posterior.

grc
fuente
99
Oh, mierda, me gusta esto. Probablemente valga la pena señalar que este es Python 2, por cierto.
undergroundmonorail
3
¡Explique por favor! :)
Christofer Ohlsson
66
@ChristoferOlsson input()::9es un rango desde input()el final de la cadena en pasos de 9, como 1,10,19,28,37o 3,12,21,30,39, que son exactamente los índices en los que se encuentran las letras de la palabra correspondiente.
Martin Ender
1
@ m.buettner gracias! Eso es bueno.
Christofer Ohlsson
66
¿No es algo así como lo que hace un cifrado de valla? (+1 para una solución ordenada por cierto.)
Lou
18

Lisp común - 22 bytes

Aquí hay uno general (no solo para uno-diez):

(format nil"~R"(read))

Oh, quieres ordinales (primero, segundo, ... trescientos ...)? ¡Okay!

(format nil"~:R"(read))
filcab
fuente
10
¿No es esta una escapatoria estándar?
seequ
2
Escapatoria en qué sentido? Está claramente definido en Hyperspec
filcab
3
Ya sea que se trate de una laguna estándar o no, es lo que vine a publicar aquí también. +1 :)
Joshua Taylor
55
@TheRare Mirando los comentarios a esa respuesta, no creo que haya un fuerte consenso de la comunidad de que esto sea un vacío legal. Creo que las preguntas deben prohibir explícitamente el uso de este tipo de función incorporada si no se van a utilizar.
Trauma digital
16

BASH 51

Así que hice otra usando mi segunda idea más la ayuda de otros:

set one two three four five six seven eight nine

$X

Donde 'X' es el número que deseas.


BASH 48 (67)

67 con \nsaltos de línea

No estoy seguro de si esto cuenta totalmente, porque está leyendo un archivo, pero:

sed -n Xp a

Donde "X" es la entrada y donde ahay un archivo con:

one
two
three
four
five
six
seven
eight
nine

El archivo tiene 36 caracteres y el comando bash es 13.

Cómo funciona:

Cada línea en el archivo está numerada, comenzando con 1. Entonces 'uno' está en la primera línea, 'dos' en la segunda. El comando sed -n 'Xp' adice: "Imprima lo que aparece en la línea 'X' del archivo 'a'" sedes un editor de flujo de Unix. -nsignifica estar en silencio, o esencialmente ignorar todo lo demás. Xpsignifica imprimir lo que está en la línea 'X'.

Eric Lagergren
fuente
2
Buena primera respuesta! Gracias por tomarse el tiempo para descubrir cómo formateamos nuestras respuestas en este sitio. ¡Bienvenido a Programming Puzzles y Code Golf!
Justin
2
No contó los avances de línea a.
Dennis
1
Un byte menos que antes, acepta un argumento de línea de comandos y no requiere archivos adicionales: pastebin.com/qdbXKQGP Bash se quejará del delimitador heredoc faltante, pero funcionará bien con Dash y Zsh.
Dennis
1
@ Dennis oh genial, me gusta. ¿Se supone que debo editar mi respuesta con la tuya ahora? Lo siento, soy nuevo en el código de golf.
Eric Lagergren
1
Puedes omitir las 'comillas. También puede intentar usar una cadena here en lugar del archivo externo. Pero realmente debe contar los saltos de línea en su archivo.
Trauma digital
16

C # - 127 (86/46)

Si solo toma la parte ejecutable ...

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

y si HourOfDayhubiera sido parte del espacio de nombres del Sistema, necesitaría 46 caracteres. Desafortunadamente se sienta en System.DirectoryServices.ActiveDirectorylo que lo hace 86 ... el otro ruido lo estropea.

Esto es compilable y ejecutable desde la línea de comandos (127 caracteres):

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

si se guarda en un archivo llamado cg2.cs

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

¿Como funciona esto?

HourOfDay es un tipo de enumeración, por lo que podemos usar nombres en lugar de constantes mágicas. Los tipos de enumeración tienen una implementación ToString () que le da el nombre del valor . Puedes lanzar un int a una enumeración. Console.Read () lee un carácter del flujo de entrada representado como un entero. escribiendo '1' da 49 , resta 48 para obtener 1, reparto / caja HourOfDaypara devolver 'Uno'.

Echa un vistazo a la versión Powershell de este mismo truco

René
fuente
Como funciona esto ? Digamos que ingreso 9. ¿Qué hace el programa entonces?
Nicolas Barbulesco
¿Qué hace esto -48aquí?
Nicolas Barbulesco
2
@NicolasBarbulesco agregó un ¿Cómo funciona esto? párrafo. ¿Tiene sentido?
René
1
@NicolasBarbulesco: está ordenado alfabéticamente. Lo cual tiene sentido en todos los contextos excepto "Estas palabras son números". Como estoy seguro de que la documentación se genera automáticamente, no tendría sentido poner un caso especial en un artículo.
Bobson
13

Befunge 98, 116 105 103 bytes

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

Befunge no fue hecho para esto ...

Explicación:

&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
fuente
8
@ Dennis No puedo ver cómo eso podría ser tan difícil. Simplemente tome el archivo, convertirlo en una char[][], mantener un xy yubicación, y ejecutar el personaje en ese lugar. Lo más difícil sería definir la operación para cada personaje posible.
Justin
1
Puede guardar fácilmente dos bytes con a &1-.
har-wradim
10

Javascript 68

Atob / btoa puede ser una herramienta de compresión para hombres pobres (pero si quieres probar esto en la consola, no puedes copiar desde el texto formateado que ves de inmediato. Ve a 'editar' y copia desde el panel de origen)

Al editor Markdown no le gustan algunos de los caracteres de esta respuesta: algunos se pierden al guardar. Aún así, creo que es un problema de editor, no mío. Los caracteres perdidos son caracteres Unicode de 8 bits perfectamente válidos.
(De lo contrario, me equivoco, si este tema ya se debatió en meta, avíseme) Aquí está la versión con caracteres ofensivos escapados, cada secuencia \ xNN debe contar 1

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

Prueba simple

En la consola de 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
fuente
Intenté algo similar pero no pude encontrar una cadena base64 válida que comience con un número. Sin embargo, creo que tu respuesta ha sido corrompida por stackexchange.
nderscore
@nderscore, maldita sea tu derecho. Modificando la publicación, todavía es válida según mí
edc65
1
Con la versión que tiene los caracteres escapados, todo funciona excepto 3 y 8, la salida Treey EightF.
Justin
3
@Quincunx 'Árbol' soy yo no hablo Inglés
edc65
10

Javascript 73

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

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])
nderscore
fuente
¿Técnicamente no alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])sería lo mismo pero te ahorraría 8 bytes? El usuario todavía ingresa el número que desea ...
Eric Lagergren
@eric_lagergren ¿quiere decir que el usuario tendría que cambiar el número en la fuente? No creo que eso cuente como entrada.
nderscore
Oh, está bien, entiendo lo que quieres decir. Supongo que si lo ejecutó como un comando en la consola, sería parte de la entrada en lugar de la fuente.
Eric Lagergren
7

Perl, 55

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

Se ejecuta con la opción -p(+1 byte), por ejemplo:

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

Se espera la entrada en STDIN y la salida se escribe en STDOUT.

El código solo genera una matriz y selecciona el elemento correcto. La opción -pse encarga de leer la línea de entrada $_e imprime el resultado $_.

Variaciones:

  • Con una nueva línea al final (+3):

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

    o (mismo recuento de bytes):

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

Actualizar:

  • Usando palabras desnudas en lugar de qw[...](gracias Zaid).

  • El índice negativo guarda un byte (gracias aragaer).

Heiko Oberdiek
fuente
1
Guarde un par de personajes:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid
2
@Zaid: Gracias, ahorró dos bytes. (Estoy acostumbrado use strict)
Heiko Oberdiek
No me gusta ese "-1". $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- Un personaje más corto.
aragaer
@aragaer: Gracias, buena idea.
Heiko Oberdiek
6

Oracle SQL - 46

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

Demostración

Esto incluye una escapatoria estándar , lo admito, pero el SQL es más corto que Golfscript; No pude resistir!

Funciona mediante (ab) utilizando los modelos de formato de fecha y hora de Oracle . TO_DATE(n, 'j')convierte un número en un día juliano , el número de días desde el 1 de enero de 4712 a. C. TO_CHAR(<date>, 'jsp')convierte esto nuevamente en el entero (aunque como una cadena). El sp, es un sufijo de elemento de formato que deletrea el número. Esto realmente funcionará con bastantes números.

La &1es una variable de sustitución que solo funcionará con clientes que la acepten, por ejemplo, SQL * Plus.

Ben
fuente
Tengo una relación de amor / odio con el RDBMS de Oracle, pero esto es bueno.
René
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=

Lo anterior usa la notación ^ y M, ya que algunos caracteres no se pueden imprimir.

Al costo de 9 bytes más, se pueden evitar los caracteres no imprimibles:

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

Pruébalo en línea.

Cómo 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=

Ejemplo

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five
Dennis
fuente
Wow, nuestras respuestas son idénticas, incluso en longitud (supongo que el usuario ingresa una cadena).
Justin
1
@Quincunx: ¡Mentes iguales piensan genial! : P Pero leer la entrada del usuario costará dos bytes en CJam, así que tendré que pensar en otra cosa ...
Dennis
@Quincunx: También debería funcionar con GolfScript, aunque probablemente no guardará bytes. Volcado de Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis
Esto es lo que pude encontrar; es más largo: golfscript.apphb.com/…
Justin
¿Sabes lo que la codificación golfscript espera para los caracteres que no son ascii? Parece que no es utf-8
Justin
5

GolfScript, 51 bytes

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

Es una tabla de búsqueda simple. Se evalúa la entrada ( ~), se crea una matriz de valores y se encuentra el índice.

Pruébalo aquí

Justin
fuente
El usuario debe ingresar una cadena, no puede tenerla codificada. Además, su Try it hereenlace tiene un código diferente que el código pegado.
Jon
@Chipperyman El usuario ingresa una cadena en este programa. La Try it herediferencia en el código del enlace se debe a que la página web no admite la entrada del usuario. Cambie la cadena después de ;, esto es idéntico a la entrada del usuario.
Justin
Ah, ya veo. No conozco muy bien golfscript, gracias por hacérmelo saber.
Jon
2
@Chipperyman: GolfScript coloca el contenido de STDIN en la pila antes de ejecutar el script en sí.
Dennis
2
Ja! ¡Puedo vencerte por un byte ! ;-)
Ilmari Karonen
4

Perl, 60 bytes

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

Requiere el -pconmutador (dos bytes).

Ejemplo

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

Cómo funciona

  • -plee desde STDIN y guarda el resultado en $_.

  • =~/.[a-z]*/g divide la palabra básica anterior en subcadenas de una letra (mayúscula) seguida de cualquier número de letras minúsculas.

  • (…) recoge las subcadenas en una matriz.

  • [$_] recupera la subcadena correspondiente a la entrada del usuario.

  • $_=…guarda el resultado en $_.

  • -pimprime el valor de $_.

Dennis
fuente
2
Me gusta el truco regex. +1
seequ
3

Lote DOS: 162 caracteres (incluidos los saltos de línea)

Esta respuesta fue inspirada por la respuesta de Python de @ grc, aunque tenía algo similar en 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:

[Nombre de archivo] [número]

Por ejemplo, si el código está en un archivo llamado speak.bat y desea ver el número "cinco", lo ejecutará como:

speak 5

Además, la salida es de arriba a abajo, ¡no de izquierda a derecha! Entonces en lugar de

cinco

ya verás

f
i
v
e

Ruslan
fuente
3

Bash + coreutils, 64

Concepto de compresión no competitiva

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

Es posible que algunos de los personajes exóticos no se reproduzcan bien, por lo que este script puede reconstruirse a partir de su representación base64:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Salida de ejemplo

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

Explicación

Se me ocurrió que la cadena one two three four five six seven eight ninecontiene solo las letras efghinorstuvwxy un separador de espacio: 15 valores de caracteres en total. Por lo tanto, cada carácter puede representarse potencialmente en 4 bits o 2 caracteres por 1 byte. Podemos usar la representación hexadecimal de un byte como una forma fácil de dividir cada byte en dos dígitos hexadecimales. Luego podemos transformar los dígitos hexadecimales a las letras que necesitamos usando tro similar. La suerte quiso que rstuvwxson consecutivos, por lo que puede expresarse como r-xa tr. La codificación está dispuesto de tal manera que ey fse deja como está, y que las palabras son salto de línea separada, por lo que podemos utilizar sedpara ouptut sólo la línea que necesitamos.

Este proceso de decodificación termina usando una cantidad considerable de espacio extra, por lo que hace que esta respuesta no sea competitiva como una respuesta estilo shell-script, pero puede ser un concepto útil en otros idiomas.

Trauma digital
fuente
3

(puro) Bash, 64

Toma la entrada como su primer argumento, suponiendo una entrada válida.

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

Crea una matriz vy luego accede al elemento especificado en la entrada. Como las matrices están indexadas a cero, tuve que agregar un elemento 0 como marcador de posición. Alternativamente (thnx @DennisWilliamson por señalar esto):

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

fuente
2
El mismo recuento de personajes: v=(one two three four five six seven eight nine)yecho ${v[$1-1]}
Dennis Williamson
3

Python 2.x - sesenta y cinco 64

No tan bueno como la respuesta de @grc, pero ciertamente más legible :-)

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

Un char menos, gracias a @flornquake

'nine eight seven six five four three two one'.split()[-input()]
Willem
fuente
Este también es bueno. :-) Funciona.
Nicolas Barbulesco
3
Puede guardar un personaje como este:'nine eight seven six five four three two one'.split()[-input()]
flornquake
Esa es una buena!
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é
fuente
3

C 111

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

La longitud que aquí se ha diseñado cuidadosamente para que pueda interpretarlo como binario y convertir que a decimal. ¡Con solo 7 personajes, estoy seguro de que tengo un ganador!

Jerry Coffin
fuente
1
A los golfistas de código +1 generalmente no les importa si su código c se compila con advertencias , siempre que cumpla con las especificaciones. Así se puede omitir el #includee main()'s tipo de retorno. También un poco de refactorización de la expresión: main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}. 86 caracteres por mi cuenta.
Trauma digital
No entiendo las cosas de longitud, y no veo dónde habría 7 caracteres.
Nicolas Barbulesco
@NicolasBarbulesco: Son 111 caracteres, pero si tratamos el 111binario, eso se convertiría 7en decimal.
Jerry Coffin
¡Jerry, hay código de golf corriendo en tu cabeza!
Nicolas Barbulesco
3

bash say (OS X): 3 8

"Su objetivo es convertir un número entero entre 1-9 en la palabra que representa"

La última vez que lo revisé, las palabras habladas también son palabras. Intento anterior (no acepta entrada)

say 4

Editar, debe poder leer la entrada:

say|read

Escriba cualquier número y saldrá la palabra. Sé que la fecha de finalización se debe, pero en mi opinión, debería haber ganado el concurso.

Archivo de audio de ejemplo: four.aiff

PrimoCocaína
fuente
no debería ser 5?
rpax
@rpax No creo que la entrada se cuente como un personaje, ¿verdad?
CousinCocaine
1
Esto es inteligente Pero esto pierde la entrada.
Nicolas Barbulesco
1
Desafortunadamente, esta no es una respuesta válida porque: nunca acepta la entrada del usuario Y solo funciona si el número es 4.
Jon
1
El comentario de Chipperyman sobre esta respuesta de CousinCocaine es cierto. Pero también es cierto para la respuesta de @RegisteredUser . Sin embargo, Chipperyman ha rechazado esta respuesta de CousinCocaine y ha declarado la respuesta del Usuario Registrado ganador ex æquo. Además, la respuesta del usuario registrado es una réplica de esta respuesta de CousinCocaine. Esto es más que injusto.
Nicolas Barbulesco
2

VBScript 98 80 75

msgbox split(" one two three four five six seven eight nine")(inputbox(""))
cómodamentedrei
fuente
2

J - 68 o 60 57 o 53 bytes

Versión interactiva (stdin):

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

Versión de la función:

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

Explicación:

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

".(1!:1)1 lee una cadena y la convierte a entero

seequ
fuente
Puede guardar un carácter escribiéndolo como un tren ( (;:'one two blah')>@{~<:) y otros seis utilizando el gerundio en one`two`blahlugar de ;:.
algorithmshark
@algorithmshark ¡Gracias! Todavía estoy aprendiendo J. Aunque, la versión del tren no requeriría que el texto fuera de rango infinito (editar: aparentemente no ... ¿por qué no?) Y la versión gerundia cita extra (editar: oh, crea una lista de cajas)?
seequ
Una bifurcación puede tener un sustantivo en el argumento izquierdo, que es la abreviatura de un verbo constante que produce ese sustantivo con rango infinito (qv el Diccionario ). Y no, no hay comillas adicionales en el gerundio: los nombres indefinidos se tratan como referencias a verbos, y el gerundio para eso es solo una cadena en caja que contiene el nombre.
algorithmshark
Además, no tiene que escribir la versión STDIN como una expresión verbal: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1es 3 caracteres más cortos.
algorithmshark
1
@algorithmshark Jaja, ¿por qué no lo hice así?
seequ
2

Perl 36 (58 independiente)

use Number::Spell;say spell_number<>

O, sin módulos adicionales:

say qw(one two three four five six seven eight nine)[<>-1]
el.pescado
fuente
Tu primer script no funciona, en mi 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
Su segundo script no funciona, en mi 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
2

En AppleScript; 123 caracteres

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

Este script toma la entrada en un diálogo. Luego da la salida en el resultado de AppleScript  .

Ejemplo:

  • Entrada: 6
  • Salida: "six"

Aquí hay una versión más bonita:

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 versión muestra la salida en un bonito diálogo.

Ejemplo:

  • Entrada: 9
  • Salida: nine

[Respuesta editada; mejoró ligeramente el diálogo para la entrada; Todavía 124 caracteres. Respuesta editada nuevamente; ahora 1 char menos! ]

Nicolas Barbulesco
fuente
1
set n to text returned of... Guau.
seequ
2

Powershell - 91 74

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

Descubrí cómo emitir para eliminar la llamada Enum y ToObject:

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

¿Como funciona esto?

HourOfDay es un tipo de enumeración, por lo que podemos usar nombres en lugar de constantes mágicas. Los tipos de enumeración tienen una implementación ToString () que le da el nombre del valor constante. Puedes lanzar un int a una enumeración. Console.Read () lee un carácter del flujo de entrada representado como un entero. escribir '1' da 49, restar 48 para obtener 1, lanzar a HourOfDay para devolver 'One'.

Debido a que powershell hace un ToString en todos los objetos que se escriben en la secuencia de salida y no necesita la pelusa para convertir esto en un ejecutable, todo lo que se necesita además de powershell ...

René
fuente
2

CJam - 50

Esta es una solución ASCII simple que utiliza solicitudes HTTP (esto está permitido en la pregunta):

"aj21.com/"r+g

En el servidor hay 9 archivos de texto sin formato denominados 1, 2, ..., 9, cada uno con la palabra correspondiente.

Tamaño total: 14 + 3 ("uno") + 3 ("dos") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
Se puede jugar más al golf utilizando un dominio más corto.

El intérprete en línea no admite solicitudes HTTP, por lo que el programa debe ejecutarse utilizando el intérprete de Java .

aditsu
fuente
1
Por favor agregue un comentario si vota abajo.
aditsu
-1, esta es una escapatoria estándar .
nyuszika7h
3
@ nyuszika7h está específicamente permitido en esta pregunta
aditsu
1
Lo siento, me perdí eso. No puedo deshacer mi voto negativo ahora hasta que se edite la respuesta.
nyuszika7h
1
@ nyuszika7h editado
aditsu
2

Lote - 86

Mucho más corto que el otro lote de respuesta, y en realidad sorprendentemente competitivo.

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

Se usa como filename.bat number, y la salida tiene la forma de un archivo con el nombre del número correcto.

Οurous
fuente
2

Rubí 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]
Mhmd
fuente
1
Puede cortar unos pocos bytes más sustituyendo 9 directamente en el lugar de x
Mr. Alien
66
No veo dónde entra este código en la entrada. ¿Y por qué escribir 9-1cuando solo puedes decir 8? Por supuesto ambos 9-1y 8están equivocados; este script genera "nueve" todo el tiempo e ignora la entrada.
Ray Toal
2

BASH 9

descarada réplica de Linux de la respuesta de cousincoicane

spd-say 1

habla uno

usuario registrado
fuente
1
¿No funcionaría esto solo si la entrada fuera 1?
Jon
1
@Chipperyman funciona para cualquier número
Usuario registrado
Límite, pero inteligente!
Nicolas Barbulesco
Esto pierde la entrada.
Nicolas Barbulesco
@nicolasbarbulesco sí. pero había muchas otras respuestas que no entraban, así que seguí adelante con esto.
Usuario registrado
2

GolfScript, 50 bytes

Quería ver si podía superar la solución de GolfScript autónoma de 51 bytes de Quincunx . Resulta que, con suficientes trucos, sí, puedo hacerlo, por un byte.

Dado que uno de los trucos que estoy usando es el uso de bytes fuera del rango ASCII imprimible, el programa resultante no se puede pegar directamente aquí. En cambio, estoy proporcionando un volcado hexadecimal; los usuarios en sistemas Unixish pueden usar xxd -rpara reconstruir el programa GolfScript de 50 bytes real del volcado 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                                     }%

El truco básico utilizado para generar este programa es simple: comprimo el literal de cadena larga que constituye la mayor parte del código de Quincunx restando 99 (el código ASCII de la letra c) de los valores de los caracteres, interpretando los valores resultantes como un número en la base 22 (suficiente para codificar las letras hasta x) y luego volver a codificar el número resultante en la base 255 para producir la cadena de bytes no imprimible que constituye la mayor parte de la primera mitad de mi programa. El resto del programa luego invierte este proceso, decodificando la cadena nuevamente en algo imprimible.

(Dado que la letra más baja realmente presente en los nombres de los números es e, podría haber acortado aún más la cadena de bytes restando 101 de los códigos ASCII y usando la base 20. Sin embargo, restando 101 habría mapeado la letra oa una nueva línea, que yo nEstoy usando como delimitador de números porque está convenientemente disponible como la constante incorporada en GolfScript. Trabajar alrededor de eso me costaría más que un byte que ahorraría usar una base más baja. El uso del desplazamiento 99 deja la nueva línea correspondiente a la letra m, que está convenientemente ausente de los nombres de los números).

Aquí hay una versión de golf del 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
fuente