Converti 1, 2, 3, 4, 5, 6, 7, 8 e 9 in "uno", "due", "tre", ecc.


47

Vincitore: la risposta bash di professorfish ! Un intero 9 byte! Wow!

Puoi continuare a inviare la tua risposta, tuttavia non puoi più vincere. Posta originale conservata per i posteri:


Il tuo obiettivo è convertire un numero intero compreso tra 1 e 9 nella parola che rappresenta.

  • Non dovrai preoccuparti dei decimali
  • L'utente inserirà un numero. Supponiamo che non inseriranno mai nulla di 10 o superiore
  • L'utente deve digitare il numero a un certo punto, tuttavia il metodo che il programma legge non ha importanza. Può essere con stdin, leggere un file di testo, ecc. Tuttavia l'utente deve premere il pulsante 9 sulla tastiera (ad esempio) ad un certo punto
  • Non fa distinzione tra maiuscole e minuscole (vale a dire, "uno", "Uno", "oNe", "OnE", ecc. Sono tutti accettabili)
  • Sono consentite richieste HTTP / etc, tuttavia qualsiasi codice eseguito dal server per cui viene fatta la richiesta viene conteggiato ai fini del conteggio byte del codice finale (ad es. Se un programma C ++ avesse effettuato una richiesta HTTP, il codice PHP utilizzato nei conteggi richieste HTTP )
  • Tutto ciò che può essere compilato ed eseguito è accettabile

  • Questo concorso si è concluso il 27 giugno 2014 (7 giorni dalla pubblicazione).
  • Questo è un , quindi vince il codice più corto

2
Lo spazio bianco finale (ovvero one ) è accettabile?
grc

1
@grc Sì, purché il programma emetta la parola.
Jon,

1
è necessario specificare che è possibile stampare solo il numero indicato e non gli altri numeri.
Pinna_be,

1
@Pinna_be per esempio, se inserisco 3, non puoi produrre one two three four five six seven eight nineanche se tecnicamente hai prodotto three. Allo stesso modo, non puoi produrre three seven, ecc.
Jon

1
Questa domanda è stata molto carina. Ma non mi piace l'aggiunta del limite di date. In particolare, il limite di date è stato aggiunto poco prima del limite di date, non 7 giorni prima.
Nicolas Barbulesco,

Risposte:


19

Bash (con bsdgames), 9

number -l

Legge da input standard.

Non so perché ci sia un'utilità per questo, ma comunque.


2
Non sono sicuro che mi piace installare bsdgames e poi chiamarlo "bash", anche se ammetto che la mia prenotazione è soggettiva.
Paul Draper,

@PaulDraper Nemmeno io. Non l'ho pubblicato come una risposta seria, penso che una delle altre risposte meritasse di essere accettata

5
Non è una scappatoia standard?
Giustino,

2
@Quincunx sì, praticamente lo è. Sebbene la maggior parte delle cose siano utilità esterne in Bash, non considererei il pacchetto bsdgames come qualcosa di molto permesso (a differenza di grep, wget, coreutils, sed, bc ...).

132

Python 2, 64

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

Ecco come appare la stringa con alcuni spazi bianchi extra (prova a leggere in verticale):

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

Come spiegato nei commenti seguenti, [input()::9]inizia dall'indice indicato e seleziona ogni nono carattere successivo.


9
Oh merda, mi piace questo. Probabilmente vale la pena sottolineare che questo è Python 2, comunque.
undergroundmonorail,

3
Spiega per favore! :)
Christofer Ohlsson,

6
@ChristoferOlsson input()::9è un intervallo dalla input()fine della stringa in passi di 9, come 1,10,19,28,37o 3,12,21,30,39, che sono esattamente gli indici in cui si trovano le lettere per la parola corrispondente.
Martin Ender,

1
@m.buettner grazie! Bello.
Christofer Ohlsson,

6
Non è qualcosa di simile a quello che fa un codice di recinzione? (+1 per una soluzione pulita a proposito.)
Lou

18

Lisp comune - 22 byte

Eccone uno generale (non solo per uno-dieci):

(format nil"~R"(read))

Oh, vuoi ordinali (primo, secondo, ... trecentesimo ...)? Ok!

(format nil"~:R"(read))

10
Non è una scappatoia standard?
Seequ,

2
Scappatoia in che senso? È chiaramente definito in Hyperspec: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab


3
Che si tratti di una scappatoia standard o meno, è anche quello che sono venuto qui per pubblicare. +1 :)
Joshua Taylor,

5
@TheRare Guardando i commenti a quella risposta, non credo che ci sia un forte consenso della comunità sul fatto che questa sia una scappatoia. La mia sensazione è che le domande debbano vietare esplicitamente l'uso di questo tipo di funzione incorporata se non devono essere utilizzate.
Digital Trauma,

16

BASH 51

Quindi ne ho realizzato un altro usando la mia seconda idea più l'aiuto di altri:

set one two three four five six seven eight nine

$X

Dove "X" è il numero desiderato.


BASH 48 (67)

67 con \ninterruzioni di riga

Non sono sicuro se questo conta davvero, perché sta leggendo da un file, ma:

sed -n Xp a

Dove "X" è l'input e dove si atrova un file con:

one
two
three
four
five
six
seven
eight
nine

Il file è di 36 caratteri e il comando bash è 13.

Come funziona:

Ogni riga nel file è numerata, a partire da 1. Quindi 'one' è sulla 1a riga, 'two' sulla 2a. Il comando, sed -n 'Xp' adice "Stampa ciò che è elencato sulla riga 'X' del file 'a'" sedè un editor di stream Unix. -nsignifica tacere o essenzialmente ignorare tutto il resto. Xpsignifica stampare ciò che è in linea 'X'.


2
Bella prima risposta! Grazie per aver dedicato del tempo a capire come formattare le nostre risposte su questo sito. Benvenuti in Puzzle di programmazione e Code Golf!
Giustino il

2
Non hai conteggiato gli avanzamenti di riga a.
Dennis,

1
Un byte in meno rispetto a prima, accetta un argomento da riga di comando e non richiede file aggiuntivi: pastebin.com/qdbXKQGP Bash si lamenterà del delimitatore ereditario mancante, ma funzionerà perfettamente con Dash e Zsh.
Dennis,

1
@Dennis oh cool mi piace. Dovrei modificare la mia risposta con la tua ora? Mi dispiace, sono nuovo nel codice golf.
Eric Lagergren,

1
Puoi omettere le 'virgolette. Potresti anche provare a usare una stringa qui invece del file esterno. Ma dovresti davvero contare le interruzioni di riga nel tuo file.
Digital Trauma,

16

C # - 127 (86/46)

Se prendi solo la parte eseguibile ...

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

e se HourOfDayfosse stato parte dello spazio dei nomi di sistema avresti bisogno di 46 caratteri. Sfortunatamente si trova nel System.DirectoryServices.ActiveDirectoryche lo rende 86 ... l'altro rumore lo rovina.

Questo è compilabile ed eseguibile dalla riga di comando (127 caratteri):

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

se salvato in un file chiamato cg2.cs

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

Come funziona?

HourOfDay è un tipo enumico quindi possiamo usare nomi invece di costanti magiche. I tipi di Enum hanno un'implementazione ToString () che ti dà il nome del valore . Puoi lanciare un int in un enum. Console.Read () legge un carattere dal flusso di input rappresentato come numero intero. digitando '1' si ottiene 49 , sottrai 48 per ottenere 1, cast / box HourOfDayper restituire 'One'.

Dai un'occhiata alla versione Powershell di questo stesso trucco


Come funziona ? Diciamo che inserisco 9. Cosa fa quindi il programma?
Nicolas Barbulesco,


Cosa fa questo -48qui?
Nicolas Barbulesco,

2
@NicolasBarbulesco ha aggiunto un Come funziona? paragrafo. Ha senso?
rene,

1
@NicolasBarbulesco - È in ordine alfabetico. Il che ha senso in ogni contesto tranne "Queste parole sono numeri". Dal momento che sono sicuro che la documentazione viene generata automaticamente, non avrebbe senso un caso speciale nell'articolo.
Bobson,

13

Befunge 98, 116 105 103 byte

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

Befunge non è stato creato per questo ...

Spiegazione:

&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

8
@Dennis Non riesco a vedere come potrebbe essere così difficile. Basta prendere il file, trasformarlo in un char[][], mantenere una xe yposizione, ed eseguire il personaggio in quella posizione. La cosa più difficile sarebbe definire l'operazione per ogni possibile personaggio.
Giustino,

1
È possibile salvare facilmente due byte con a &1-.
har-wradim,

10

Javascript 68

Atob / btoa può essere uno strumento di compressione per un uomo povero (ma se vuoi provarlo in console, non puoi copiare dal testo formattato che vedi in una sola volta. Vai su "modifica" e copia dal pannello sorgente)

L'editor di Markdown non ama alcuni dei personaggi in questa risposta: alcuni personaggi si perdono durante il salvataggio. Tuttavia, penso che sia un problema dell'editor, non mio. I personaggi persi sono caratteri Unicode a 8 bit perfettamente validi.
(Oppure mi sbaglio, se questo problema è già stato discusso in meta, fammi sapere) Ecco la versione con caratteri offensivi fuggiti, ogni sequenza \ xNN dovrebbe contare 1

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

Test semplice

Nella console di 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])

Ho provato qualcosa di simile ma non sono riuscito a capire una stringa base64 valida che inizia con un numero. Penso che la tua risposta sia stata corrotta da StackExchange.
nderscore,

@nderscore, dannazione, va bene. La modifica del post è ancora valida secondo me
edc65,

1
Con la versione con i caratteri di escape, tutto funziona tranne 3 e 8, l'output Treee EightF.
Giustino,

3
@Quincunx 'Tree' sono io che non parlo inglese
edc65,

10

Javascript 73

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

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])

Tecnicamente non alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])sarebbe la stessa cosa ma risparmieresti 8 byte? L'utente inserisce ancora il numero che desidera ...
Eric Lagergren,

@eric_lagergren vuoi dire che l'utente dovrebbe cambiare il numero nella fonte? Non penso che conterebbe come input.
nderscore,

Oh, okay, capisco cosa intendi. Suppongo che se lo avessi eseguito come un comando nella console sarebbe parte dell'input rispetto alla sorgente.
Eric Lagergren,

7

Perl, 55

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

Viene eseguito con l'opzione -p(+1 byte), ad esempio:

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

L'ingresso è previsto in STDIN e l'output è scritto in STDOUT.

Il codice genera solo un array e seleziona l'elemento giusto. L'opzione -psi occupa della lettura della riga di input $_e stampa il risultato $_.

variazioni:

  • Con la nuova riga finale (+3):

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

    o (stesso conteggio byte):

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

Aggiornare:

  • Usando parole nude invece di qw[...](grazie Zaid).

  • L'indice negativo salva un byte (grazie aragaer).


1
Salva un paio di personaggi:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid,

2
@Zaid: grazie, ha salvato due byte. (Sono abituato a use strict).
Heiko Oberdiek,

Non mi piace "-1". $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- un personaggio più corto.
Aragaer,

@aragaer: grazie, bella idea.
Heiko Oberdiek,

6

Oracle SQL - 46

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

Dimostrazione

Ciò include una scappatoia standard , lo ammetto, ma l'SQL è più corto di Golfscript; Non ho resistito!

Funziona con (ab) utilizzando i modelli di formato datetime di Oracle . TO_DATE(n, 'j')converte un numero in un giorno giuliano , il numero di giorni dal 1 ° gennaio 4712 a.C. TO_CHAR(<date>, 'jsp')lo converte nuovamente nell'intero (anche se come una stringa). Il sp, è un suffisso di elemento di formato che indica il numero. Funzionerà effettivamente con un bel numero di numeri.

Il &1è una variabile di sostituzione che sarà solo lavoro con i clienti che accettano, ad esempio SQL * Plus.


Ho una relazione di amore / odio con RDBMS di Oracle ma questo è carino.
rene,

6

CJam, 45 43 byte

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

Quanto sopra usa la notazione ^ e M, poiché alcuni caratteri non sono stampabili.

Al costo di altri 9 byte, è possibile evitare i caratteri non stampabili:

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

Provalo online.

Come funziona

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

Esempio

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five

Caspita, le nostre risposte sono identiche, anche di lunghezza (suppongo che l'utente inserisca una stringa).
Justin,

1
@Quincunx: le menti allo stesso modo pensano alla grande! : P Ma leggere l'input dell'utente costerà due byte in CJam, quindi dovrò pensare a qualcos'altro ...
Dennis

@Quincunx: dovrebbe funzionare anche con GolfScript, anche se probabilmente non salverà byte. Discarica Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis,

Questo è quello che sono riuscito a inventare; è più lungo: golfscript.apphb.com/…
Justin il

Sai cosa si aspetta la codifica golfscript per i caratteri non ascii? Sembra non essere utf-8
Justin il

5

GolfScript, 51 byte

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

È una semplice tabella di ricerca. L'input viene valutato ( ~), viene creata una matrice di valori e viene trovato l'indice.

Provalo qui


L'utente deve inserire una stringa, non è possibile averla codificata. Inoltre, il tuo Try it herelink ha un codice diverso rispetto al codice incollato.
Jon,

@Chipperyman L'utente inserisce una stringa in questo programma. La Try it heredifferenza di collegamento nel codice è perché la pagina Web non supporta l'input dell'utente. Cambia la stringa dopo il ;, questo è identico all'input dell'utente.
Giustino,

Ah, capisco. Non conosco molto bene il golfscript, grazie per avermelo fatto notare.
Jon,

2
@Chipperyman: GolfScript posiziona il contenuto di STDIN nello stack prima di eseguire lo script stesso.
Dennis,

2
Hah! Posso batterti di un byte ! ;-)
Ilmari Karonen il

4

Perl, 60 byte

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

Richiede l' -popzione (due byte).

Esempio

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

Come funziona

  • -plegge da STDIN e salva il risultato in $_.

  • =~/.[a-z]*/g divide la parola nuda precedente in sottostringhe di una lettera (maiuscola) seguita da un numero qualsiasi di lettere minuscole.

  • (…) raccoglie le sottostringhe in un array.

  • [$_] recupera la sottostringa corrispondente all'input dell'utente.

  • $_=…salva il risultato in $_.

  • -pstampa il valore di $_.


2
Mi piace il trucco regex. +1
seequ

3

DOS Batch - 162 caratteri (incl. Interruzioni di riga)

Questa risposta è stata ispirata dalla risposta Python di @grc, anche se avevo in mente qualcosa di simile.

@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 file] [numero]

Ad esempio, se il codice si trova in un file chiamato speak.bat e si desidera vedere il numero "cinque", lo si eseguirà come:

speak 5

Inoltre, l'output è dall'alto verso il basso, non da sinistra a destra! Quindi invece di

cinque

vedrai

f
i
v
e


3

Bash + coreutils, 64

Concetto di compressione non competitiva

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

Alcuni dei personaggi esotici qui potrebbero non essere riprodotti bene, quindi questa sceneggiatura potrebbe essere ricostruita dalla sua rappresentazione base64:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Esempio di output

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

Spiegazione

Mi è venuto in mente che la stringa one two three four five six seven eight ninecontiene solo le lettere efghinorstuvwxe un separatore di spazi - 15 valori di caratteri in totale. Pertanto, ogni carattere può potenzialmente essere rappresentato in 4 bit o 2 caratteri per 1 byte. Possiamo usare la rappresentazione esadecimale di un byte come un modo semplice per dividere ogni byte in due cifre esadecimali. Possiamo quindi trasformare le cifre esadecimali in lettere necessarie tro simili. Come sarebbe fortuna, rstuvwxsono consecutivi, quindi può essere espresso come r-xa tr. La codifica è disposto in modo tale che ee fsono lasciati così com'è, e che le parole sono linea-break separati, in modo da poter utilizzare sedper Ouptut solo la linea abbiamo bisogno.

Questo processo di decodifica finisce per usare una buona quantità di spazio extra, quindi rende questa risposta non competitiva come una risposta in stile shell-script, ma può essere un concetto utile in altre lingue.


3

(puro) Bash, 64

Prende l'input come primo argomento, assumendo input validi.

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

Crea un array v, quindi accede all'elemento specificato sull'input. Poiché le matrici sono indicizzate a zero, ho dovuto aggiungere un 0 ° elemento come segnaposto. In alternativa (thnx @DennisWilliamson per averlo segnalato):

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

2
Stesso numero di personaggi: v=(one two three four five six seven eight nine)eecho ${v[$1-1]}
Dennis Williamson il

3

Python 2.x - 65 64

Non buono come la risposta di @grc, ma sicuramente più leggibile :-)

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

Un carattere in meno, grazie a @flornquake

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

Anche questo è carino. :-) Funziona.
Nicolas Barbulesco,

3
Puoi salvare un personaggio in questo modo:'nine eight seven six five four three two one'.split()[-input()]
flornquake il

Questo è bello!
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]);
    }}

3

C 111

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

La lunghezza qui è accuratamente progettato in modo da posso interpretarlo come binario e convertito che in decimale. Con solo 7 personaggi, sono sicuro di avere un vincitore!


1
+1 I golfisti del codice generalmente non si preoccupano se il codice c viene compilato con avvisi , purché soddisfi le specifiche. Così si può omettere il #includee main()'s tipo di ritorno. Anche un po 'di refactoring della vostra espressione: main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}. 86 caratteri dal mio conteggio.
Digital Trauma,

Non capisco la lunghezza e non vedo dove ci sarebbero 7 caratteri.
Nicolas Barbulesco,

@NicolasBarbulesco: sono 111 caratteri, ma se trattiamo 111come binario, questo si convertirà 7in decimale.
Jerry Coffin,

Jerry, c'è un codice golf che corre nella tua testa!
Nicolas Barbulesco,

3

bash dire (OS X): 3 8

"Il tuo obiettivo è convertire un numero intero tra 1-9 nella parola che rappresenta"

L'ultima volta che ho controllato, anche le parole pronunciate sono parole. Tentativo precedente (non accetta input)

say 4

Modifica, deve essere in grado di leggere l'input:

say|read

Digita un numero qualsiasi e la parola esce. So che la data di fine è prevista, ma secondo me avrei dovuto vincere il concorso.

Esempio di file audio: four.aiff


non dovrebbe essere 5?
rpax,

@rpax Non credo che l'input sia conteggiato come un personaggio, vero?
Cugina Cocaina,

1
Questo è intelligente. Ma questo manca l'input.
Nicolas Barbulesco,

1
Sfortunatamente questa non è una risposta valida perché: Non accetta mai input da parte dell'utente E funziona solo se il numero è 4.
Jon

1
Il commento di Chipperyman su questa risposta di CousinCocaine è vero. Ma è vero anche per la risposta di @RegisteredUser . Tuttavia, Chipperyman ha respinto questa risposta da CousinCocaine e ha dichiarato la risposta del vincitore del Registered User ex æquo. Inoltre, la risposta dell'utente registrato è una replica di questa risposta di CousinCocaine. Questo è più che ingiusto.
Nicolas Barbulesco,

2

VBScript 98 80 75

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

2

J - 68 o 60 57 o 53 byte

Versione interattiva (stdin):

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

Versione di funzione:

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

Spiegazione:

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

".(1!:1)1 legge una stringa e la converte in numero intero


Puoi salvare un carattere scrivendolo come un treno ( (;:'one two blah')>@{~<:) e altri sei usando il gerundio one`two`blahinvece di ;:.
algoritmo

@algorithmshark Grazie! Sto ancora imparando J. Anche se, la versione del treno non richiede che il testo abbia un rango infinito (modifica: apparentemente no ... perché no?) E le virgolette extra della versione gerundio (modifica: oh, crea un elenco di scatole)?
Seequ,

Un fork può avere un sostantivo nell'argomento sinistro, che è una scorciatoia per un verbo costante che produce quel sostantivo con rango infinito (qv il Dizionario ). E no, nessuna citazione aggiuntiva sul gerundio: i nomi indefiniti sono trattati come riferimenti ai verbi, e il gerundio è solo una stringa in scatola che contiene il nome.
algoritmo

Inoltre, non è necessario scrivere la versione STDIN come espressione verbale: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1è 3 caratteri più corta.
algoritmo

1
@algorithmshark Haha, perché non l'ho fatto in quel modo?
Seequ,

2

Perl 36 (58 standalone)

use Number::Spell;say spell_number<>

Oppure, senza moduli aggiuntivi:

say qw(one two three four five six seven eight nine)[<>-1]

Il tuo primo script non funziona, sul mio 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,

Il tuo secondo script non funziona, sul mio 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

In AppleScript; 123 caratteri.

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

Questo script accetta l'input in una finestra di dialogo. Quindi fornisce l'output nel risultato di AppleScript  .

Esempio :

  • Input: 6
  • Produzione : "six"

Ecco una versione migliore:

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

Questa versione visualizza l'output in una bella finestra di dialogo.

Esempio :

  • Input: 9
  • Produzione : nine

[Risposta modificata; leggermente migliorato il dialogo per l'input; ancora 124 caratteri. Risposta modificata di nuovo; ora 1 carattere in meno! ]


1
set n to text returned of... Wow.
Seequ,

2

Powershell - 91 74

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

Scopri come eseguire il cast per rimuovere la chiamata Enum e ToObject:

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

Come funziona?

HourOfDay è un tipo enum, quindi possiamo usare nomi invece di costanti magiche. I tipi di enum hanno un'implementazione ToString () che ti dà il nome del valore costante. Puoi lanciare un int in un enum. Console.Read () legge un carattere dal flusso di input rappresentato come numero intero. digitando '1' si ottiene 49, si sottrae 48 per ottenere 1, si lancia in HourOfDay per restituire 'One'.

Poiché PowerShell esegue una ToString su tutti gli oggetti scritti nel flusso di output e non ha bisogno della lanugine per trasformarlo in un eseguibile, tutto ciò che è necessario oltre a PowerShell ...


2

CJam - 50

Questa è una semplice soluzione ASCII che utilizza richieste HTTP (ciò è consentito nella domanda):

"aj21.com/"r+g

Sul server ci sono 9 file di testo semplice denominati 1, 2, ..., 9, ciascuno contenente la parola corrispondente.

Dimensione totale: 14 + 3 ("uno") + 3 ("due") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
Si può giocare a golf più usando un dominio più corto.

L'interprete online non supporta le richieste HTTP, quindi il programma deve essere eseguito utilizzando l' interprete java .


1
Si prega di aggiungere un commento se si effettua il downvoting.
aditsu,

-1, questa è una scappatoia standard .
nyuszika7h,

3
@ nyuszika7h è espressamente consentito in questa domanda
aditsu,

1
Scusa, mi sono perso. Non posso annullare il mio downvote ora fino a quando la risposta non viene modificata.
nyuszika7h,

1
@ nyuszika7h modificato
aditsu il

2

Lotto - 86

Molto più breve dell'altra risposta in lotti, e in realtà sorprendentemente competitivo.

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

Usato come filename.bat numbere l'output è sotto forma di un file con il nome del numero corretto.


2

Ruby 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]

1
Puoi tagliare qualche altro byte sostituendo 9 direttamente al posto di x
Mr. Alien,

6
Non vedo da dove viene inserito questo codice. E perché scrivere 9-1quando puoi semplicemente dire 8? Naturalmente entrambi 9-1e 8si sbagliano; questo script genera sempre "nove" e ignora l'input.
Ray Toal,


2

GolfScript, 50 byte

Volevo vedere se riuscivo a battere la soluzione GolfScript autonoma di 51 byte di Quincunx . Si scopre che, con abbastanza trucchi, sì, posso - di un byte.

Poiché uno dei trucchi che sto usando è l'uso di byte al di fuori dell'intervallo ASCII stampabile, il programma risultante non può essere incollato direttamente qui. Invece, sto fornendo una discarica esadecimale; gli utenti dei sistemi Unixish possono utilizzare xxd -rper ricostruire il vero programma GolfScript a 50 byte dal dump esadecimale:

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                                     }%

Il trucco di base utilizzato per generare questo programma è semplice: comprimo il letterale stringa lunga che costituisce la maggior parte del codice di Quincunx sottraendo 99 (il codice ASCII della lettera c) dai valori dei caratteri, interpretando i valori risultanti come un numero nella base 22 (abbastanza per codificare le lettere fino a x) e quindi ricodificare il numero risultante in base 255 per produrre la stringa di byte non stampabile che costituisce la maggior parte della prima metà del mio programma. Il resto del programma inverte quindi questo processo, decodificando la stringa in qualcosa di stampabile.

(Dato che la lettera più bassa effettivamente presente nei nomi dei numeri è e, avrei potuto abbreviare ulteriormente la stringa di byte sottraendo 101 dai codici ASCII e usando la base 20. Tuttavia, sottraendo 101 avrei mappato la lettera osu una nuova riga, che ho nsto usando come delimitatore di numeri perché è convenientemente disponibile come costante incorporata in GolfScript. Lavorare intorno mi costerebbe di più di un byte che risparmierebbe usando una base inferiore. L'uso dell'offset 99 lascia la nuova riga corrispondente alla lettera m, che è convenientemente assente dai nomi dei numeri.)

Ecco una versione decodificata del programma:

~       # 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.