Konvertieren Sie 1, 2, 3, 4, 5, 6, 7, 8 und 9 in "eins", "zwei", "drei" usw

47

Gewinner: Professorfishs heftige Antwort ! Ganze 9 Bytes! Beeindruckend!

Sie können Ihre Antwort weiterhin übermitteln, jedoch nicht mehr gewinnen. Originalpost für die Nachwelt aufbewahrt:


Ihr Ziel ist es, eine ganze Zahl zwischen 1 und 9 in das Wort umzuwandeln, das es darstellt.

  • Sie müssen sich keine Gedanken über Dezimalstellen machen
  • Der Benutzer gibt eine Nummer ein. Angenommen, sie geben niemals 10 oder höher ein
  • Der Benutzer muss die Nummer zu einem bestimmten Zeitpunkt geben, aber das Verfahren des Programm liest es spielt keine Rolle. Dies kann mit stdin, Lesen einer Textdatei usw. geschehen. Der Benutzer muss jedoch irgendwann die Taste 9 auf seiner Tastatur drücken
  • Es wird nicht zwischen Groß- und Kleinschreibung unterschieden (dh "Eins", "Eins", "Eins", usw. sind alle akzeptabel).
  • HTTP / etc-Anforderungen sind zulässig, jedoch zählt jeder Code, der vom Server ausgeführt wird, für die Bytezahl Ihres endgültigen Codes (z. B. wenn ich von einem C ++ - Programm eine HTTP-Anforderung erstellt habe, zählt der in der HTTP-Anforderung verwendete PHP-Code) )
  • Alles, was kompiliert und ausgeführt werden kann, ist akzeptabel

  • Dieser Wettbewerb ist am 27. Juni 2014 (7 Tage nach Veröffentlichung) zu Ende gegangen.
  • Dies ist ein , also gewinnt der kürzeste Code
Jon
quelle
2
Ist abschließendes Leerzeichen one akzeptabel?
Grc
1
@grc Ja, solange das Programm das Wort ausgibt.
Jon
1
Sie sollten angeben, dass nur die angegebene Nummer gedruckt werden darf und nicht die anderen Nummern.
Pinna_be
1
@Pinna_be zum Beispiel, wenn ich eingebe 3, können Sie nicht ausgeben one two three four five six seven eight nine, obwohl Sie technisch ausgeben three. Ebenso können Sie nicht ausgeben three seven, etc.
Jon
1
Diese Frage war ganz nett. Aber ich mag es nicht, das Datumslimit hinzuzufügen. Insbesondere wurde das Datumslimit unmittelbar vor dem Datumslimit und nicht 7 Tage zuvor hinzugefügt.
Nicolas Barbulesco

Antworten:

19

Bash (mit bsdgames), 9

number -l

Liest von der Standardeingabe.

Ich weiß nicht, warum es dafür einen Nutzen gibt, aber was auch immer.


quelle
2
Ich bin mir nicht sicher, ob ich gerne bsdgames installiere und es dann "bash" nenne, obwohl ich zugeben werde, dass meine Reservierung subjektiv ist.
Paul Draper
@ PaulDraper Ich auch nicht. Ich habe dies nicht als ernsthafte Antwort gepostet, ich denke, eine der anderen Antworten hat es verdient, akzeptiert zu werden
5
Ist das nicht eine Standardlücke?
Justin
2
@Quincunx ja, das ist es im Grunde. Obwohl die meisten Dinge externe Dienstprogramme in Bash sind, würde ich das Paket bsdgames nicht als etwas sehr Zulässiges betrachten (im Gegensatz zu grep, wget, coreutils, sed, bc ...).
132

Python 2, 64

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

So sieht die Zeichenfolge mit einem zusätzlichen Leerzeichen aus (versuchen Sie, vertikal zu lesen):

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

[input()::9]Beginnt, wie in den Kommentaren unten erläutert, am angegebenen Index und wählt jedes neunte nachfolgende Zeichen aus.

grc
quelle
9
Oh, Scheiße, das gefällt mir. Es lohnt sich wahrscheinlich darauf hinzuweisen, dass dies übrigens Python 2 ist.
Undergroundmonorail
3
Erkläre bitte! :)
Christofer Ohlsson
6
@ChristoferOlsson input()::9ist ein Bereich von input()bis zum Ende der Zeichenfolge in Schritten von 9, wie 1,10,19,28,37oder 3,12,21,30,39, die genau die Indizes sind, an denen die Buchstaben für das entsprechende Wort gefunden werden.
Martin Ender
1
@m.buettner danke! Das ist schön.
Christofer Ohlsson
6
Ist das nicht so etwas wie eine Zaun-Chiffre? (+1 für eine saubere Lösung übrigens.)
Lou
18

Common Lisp - 22 Bytes

Hier ist eine allgemeine (nicht nur für eine Zehn):

(format nil"~R"(read))

Oh, Sie möchten Ordnungszahlen (erstens, zweitens, ... dreihundertstel ...)? Okay!

(format nil"~:R"(read))
Filcab
quelle
10
Ist das nicht eine Standardlücke?
Siehe auch
2
Lücke in welchem ​​Sinne? Es ist in Hyperspec klar definiert: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab
3
Egal, ob es sich um eine Standardlücke handelt oder nicht, ich bin auch hierher gekommen, um etwas zu posten. +1 :)
Joshua Taylor
5
@TheRare Wenn ich die Kommentare zu dieser Antwort betrachte, glaube ich nicht, dass es einen starken Konsens in der Community gibt, dass dies eine Lücke ist. Ich bin der Meinung, dass Fragen die Verwendung dieser Art von eingebauter Funktion explizit verbieten müssen, wenn sie nicht verwendet werden sollen.
Digitales Trauma
16

BASH 51

Also habe ich mit meiner zweiten Idee und Hilfe von anderen eine neue Idee gemacht:

set one two three four five six seven eight nine

$X

Wobei 'X' die gewünschte Zahl ist.


BASH 48 (67)

67 mit \nZeilenumbrüchen

Ich bin mir nicht sicher, ob dies wirklich zählt, weil es aus einer Datei liest, aber:

sed -n Xp a

Wo ist "X" die Eingabe und wo aist eine Datei mit:

one
two
three
four
five
six
seven
eight
nine

Die Datei hat 36 Zeichen und der Bash-Befehl ist 13.

Wie es funktioniert:

Jede Zeile in der Datei ist beginnend mit 1 nummeriert. In der 1. Zeile steht also "Eins", in der 2. Zeile "Zwei". Der Befehl sed -n 'Xp' a"Bitte drucken Sie, was in Zeile 'X' der Datei 'a' steht" sedist ein Unix-Stream-Editor. -nbedeutet, still zu sein oder alles andere im Wesentlichen zu ignorieren. Xpbedeutet, drucken, was in der Zeile 'X' steht.

Eric Lagergren
quelle
2
Schöne erste Antwort! Vielen Dank, dass Sie sich die Zeit genommen haben, herauszufinden, wie wir unsere Antworten auf dieser Website formatieren. Willkommen bei Programming Puzzles und Code Golf!
Justin
2
Sie haben die Zeilenvorschübe nicht mitgezählt a.
Dennis
1
Ein Byte weniger als zuvor, akzeptiert ein Befehlszeilenargument und benötigt keine zusätzlichen Dateien: pastebin.com/qdbXKQGP Bash wird sich über das fehlende Heredoc-Trennzeichen beschweren, aber es wird gut mit Dash und Zsh laufen.
Dennis
1
@ Tennis oh cool ich mag es. Soll ich meine Antwort jetzt mit deiner bearbeiten? Tut mir leid, ich bin neu im Code Golf.
Eric Lagergren
1
Sie können die 'Anführungszeichen weglassen . Sie können auch versuchen, anstelle der externen Datei eine Here-Zeichenfolge zu verwenden. Aber Sie sollten wirklich die Zeilenumbrüche in Ihrer Datei zählen.
Digital Trauma
16

C # - 127 (86/46)

Wenn Sie nur den ausführbaren Teil nehmen ...

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

und wenn HourOfDayes Teil des System-Namespace gewesen wäre, bräuchten Sie 46 Zeichen. Leider sitzt es in System.DirectoryServices.ActiveDirectorydem es 86 macht ... der andere Lärm verdirbt es.

Dies kann von der Kommandozeile aus kompiliert und ausgeführt werden (127 Zeichen):

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

Wenn in einer Datei mit dem Namen cg2.cs gespeichert

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

Wie funktioniert das?

HourOfDay ist ein Aufzählungstyp, sodass wir Namen anstelle von magischen Konstanten verwenden können. Aufzählungstypen verfügen über eine ToString () - Implementierung, die den Namen des Werts angibt . Sie können ein Int in eine Enumeration umwandeln. Console.Read () liest ein Zeichen aus dem als Ganzzahl dargestellten Eingabestream. Wenn Sie '1' eingeben, erhalten Sie 49 , subtrahieren Sie 48, um 1 zu erhalten HourOfDay.

Schauen Sie sich die Powershell-Version dieses Tricks an

rene
quelle
Wie funktioniert das ? Angenommen, ich gebe 9 ein. Was macht das Programm dann?
Nicolas Barbulesco
Was macht das -48hier?
Nicolas Barbulesco
2
@NicolasBarbulesco hat hinzugefügt Wie funktioniert das? Absatz. Macht das Sinn?
Rene
1
@NicolasBarbulesco - Es ist alphabetisch sortiert. Was außer "Diese Wörter sind Zahlen" in jedem Kontext Sinn macht. Da ich mir sicher bin, dass die Dokumentation automatisch generiert wird, wäre es im Einzelfall nicht sinnvoll, einen Artikel zu erstellen.
Bobson
13

Befunge 98, 116 105 103 Bytes

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

Befunge wurde dafür nicht gemacht ...

Erläuterung:

&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
quelle
8
@Dennis Ich kann nicht sehen, wie schwer das sein könnte. Nimm einfach die Datei, verwandle sie in eine char[][], behalte einen xund einen yOrt und führe den Charakter an diesem Ort aus. Das Schwierigste wäre, die Operation für jeden möglichen Charakter zu definieren.
Justin
1
Mit a können Sie problemlos zwei Bytes speichern &1-.
Har-Wradim
10

Javascript 68

Atob / btoa kann ein schlechtes Komprimierungswerkzeug sein (aber wenn Sie dies in der Konsole ausprobieren möchten, können Sie nicht aus dem formatierten Text kopieren, den Sie auf einmal sehen. Gehen Sie zu "Bearbeiten" und kopieren Sie ihn aus dem Quellbereich.)

Der Markdown-Editor mag einige der Zeichen in dieser Antwort nicht: Einige Zeichen gehen beim Speichern verloren. Trotzdem denke ich, dass es ein Editorproblem ist, nicht meins. Die verlorenen Zeichen sind absolut gültige 8-Bit-Unicode-Zeichen.
(Sonst irre ich mich, wenn dieses Problem bereits in Meta diskutiert wurde, lass es mich wissen.) Hier ist die Version, in der beleidigende Zeichen maskiert sind. Jede Sequenz \ xNN sollte 1 zählen

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

Einfacher Test

In der Firefox-Konsole:

[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
quelle
Ich habe etwas Ähnliches versucht, konnte aber keine gültige base64-Zeichenfolge finden, die mit einer Zahl beginnt. Ich denke, dass Ihre Antwort durch StackExchange beschädigt wurde.
Nderscore
@nderscore, verdammt noch mal. Die Änderung des Beitrags ist nach meiner
Einschätzung
1
Bei der Version mit den maskierten Zeichen funktioniert alles außer 3 und 8, der Ausgabe Treeund EightF.
Justin
3
@Quincunx 'Tree' ist mir nicht Englisch zu sprechen
edc65
10

Javascript 73

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

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])
nderscore
quelle
Technisch wäre das nicht alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])dasselbe, aber Sie sparen 8 Bytes? Der Benutzer gibt immer noch die gewünschte Nummer ein ...
Eric Lagergren
@eric_lagergren Müsste der Benutzer die Nummer in der Quelle ändern? Ich glaube nicht, dass das als Input zählt.
nderscore
Oh, okay, ich verstehe, was du meinst. Ich nehme an, wenn Sie es wie einen Befehl in der Konsole ausführen, ist es im Gegensatz zur Quelle Teil der Eingabe.
Eric Lagergren
7

Perl, 55

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

Es wird mit der Option -p(+1 Byte) ausgeführt, zB:

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

Die Eingabe wird in STDIN erwartet und die Ausgabe wird in STDOUT geschrieben.

Der Code generiert lediglich ein Array und wählt das richtige Element aus. Option -pübernimmt das Einlesen der Eingabezeile $_und druckt das Ergebnis aus $_.

Variationen:

  • Mit nachfolgender neuer Zeile (+3):

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

    oder (gleiche Byteanzahl):

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

Aktualisieren:

  • Mit bloßen Worten statt qw[...](danke Zaid).

  • Negativer Index speichert ein Byte (danke aragaer).

Heiko Oberdiek
quelle
1
Speichern Sie ein paar Zeichen:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid
2
@Zaid: Danke, es hat zwei Bytes gespart. (Ich bin es gewohnt use strict).
Heiko Oberdiek
Ich mag das "-1" nicht. $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- Ein Zeichen kürzer.
Aragaer
@aragaer: Danke, nette Idee.
Heiko Oberdiek
6

Oracle SQL - 46

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

Demonstration

Ich gebe zu, dass dies eine Standardlücke beinhaltet , aber die SQL ist kürzer als Golfscript. Ich konnte nicht widerstehen!

Es funktioniert durch (ab) Verwenden der datetime - Formatmodelle von Oracle . TO_DATE(n, 'j')konvertiert eine Zahl in einen julianischen Tag , die Anzahl der Tage seit dem 1. Januar 4712 v. TO_CHAR(<date>, 'jsp')konvertiert diese zurück in die Ganzzahl (allerdings als String). Das sp, ist ein Format-Elementsuffix , das die Zahl buchstabiert. Dies funktioniert tatsächlich mit ziemlich vielen Zahlen.

Dies &1ist eine Substitutionsvariable, die nur mit Clients funktioniert, die sie akzeptieren, z. B. SQL * Plus.

Ben
quelle
Ich habe eine Hassliebe zu Oracle's RDBMS, aber das ist nett.
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=

Das oben genannte verwendet ^ und M-Notation, da einige Zeichen nicht druckbar sind.

Auf Kosten von 9 weiteren Bytes können nicht druckbare Zeichen vermieden werden:

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

Probieren Sie es online aus.

Wie es funktioniert

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

Beispiel

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five
Dennis
quelle
Wow, unsere Antworten sind auch in der Länge identisch (ich gehe davon aus, dass der Benutzer eine Zeichenfolge eingibt).
Justin
1
@ Quincunx: Gleichgesinnte denken großartig! : P Aber das Lesen von Benutzereingaben kostet in CJam zwei Bytes, also muss ich mir etwas anderes überlegen ...
Dennis
@ Quincunx: Es sollte auch mit GolfScript funktionieren, obwohl es wahrscheinlich keine Bytes speichert. Base64-Dump:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis
Das ist es, worauf ich gekommen bin; es ist länger: golfscript.apphb.com/…
Justin
Wissen Sie, welche Codierung golfscript für Nicht-ASCII-Zeichen erwartet? Es scheint nicht utf-8 zu sein
Justin
5

GolfScript, 51 Bytes

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

Es ist eine einfache Nachschlagetabelle. Die Eingabe wird ausgewertet ( ~), ein Array der Werte erstellt und der Index gefunden.

Probieren Sie es hier aus

Justin
quelle
Der Benutzer muss eine Zeichenfolge eingeben, sie kann nicht fest codiert werden. Außerdem hat Ihr Try it hereLink einen anderen Code als der eingefügte Code.
Jon
@Chipperyman Der Benutzer gibt in diesem Programm eine Zeichenfolge ein. Der Try it hereUnterschied des Links im Code besteht darin, dass die Webseite keine Benutzereingaben unterstützt. Ändern Sie die Zeichenfolge nach ;, dies ist identisch mit der Benutzereingabe.
Justin
Ah ich sehe. Ich kenne golfscript nicht sehr gut, danke, dass Sie es mir mitgeteilt haben.
Jon
2
@Chipperyman: GolfScript legt den Inhalt von STDIN auf dem Stapel ab, bevor das Skript selbst ausgeführt wird.
Dennis
2
Hah! Ich kann dich um ein Byte schlagen ! ;-)
Ilmari Karonen
4

Perl, 60 Bytes

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

Benötigt den -pSchalter (zwei Bytes).

Beispiel

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

Wie es funktioniert

  • -pliest aus STDIN und speichert das Ergebnis in $_.

  • =~/.[a-z]*/g Teilt das vorhergehende Bareword in Teilzeichenfolgen aus einem (Groß-) Buchstaben, gefolgt von einer beliebigen Anzahl von Kleinbuchstaben.

  • (…) sammelt die Teilzeichenfolgen in einem Array.

  • [$_] Ruft den Teilstring ab, der der Benutzereingabe entspricht.

  • $_=…speichert das Ergebnis in $_.

  • -pdruckt den Wert von $_.

Dennis
quelle
2
Ich mag den Regex-Trick. +1
siehe auch
3

DOS Batch - 162 Zeichen (inkl. Zeilenumbrüche)

Diese Antwort wurde von @ grcs Python-Antwort inspiriert, obwohl ich etwas Ähnliches vorhatte.

@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

Verwendungszweck:

[Dateiname] [Nummer]

Wenn sich der Code beispielsweise in einer Datei mit dem Namen speak.bat befindet und Sie die Nummer "five" sehen möchten, würden Sie ihn wie folgt ausführen:

speak 5

Außerdem erfolgt die Ausgabe von oben nach unten und nicht von links nach rechts! Also statt

fünf

du wirst sehen

f
i
v
e

Ruslan
quelle
3

Bash + Coreutils, 64

Nicht wettbewerbsfähiges Komprimierungskonzept

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

Einige der exotischen Zeichen hier werden möglicherweise nicht richtig dargestellt, sodass dieses Skript möglicherweise aus seiner base64-Darstellung rekonstruiert wird:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Beispielausgabe

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

Erläuterung

Mir ist aufgefallen, dass die Zeichenfolge one two three four five six seven eight ninenur die Buchstaben efghinorstuvwxund ein Leerzeichen enthält - insgesamt 15 Zeichen. Somit kann jedes Zeichen möglicherweise in 4 Bits oder 2 Zeichen pro 1 Byte dargestellt werden. Wir können die hexadezimale Darstellung eines Bytes verwenden, um jedes Byte auf einfache Weise in zwei hexadezimale Ziffern aufzuteilen. Wir können dann die hexadezimalen Ziffern wieder in die Buchstaben umwandeln, die wir benötigen troder ähnliches. Wie es der Zufall wollte, rstuvwxsind in Folge, so ausgedrückt werden kann als r-xauf tr. Die Kodierung ist so angeordnet , dass eund fbleiben , wie sie ist, und dass die Worte Zeilenumbruch getrennt sind, so dass wir verwenden können , sedbrauchen wir nur die Linie ouptut.

Dieser Dekodierungsprozess benötigt eine Menge zusätzlichen Speicherplatz. Daher ist diese Antwort als Antwort im Shell-Skript-Stil nicht konkurrenzfähig, kann aber in anderen Sprachen ein nützliches Konzept sein.

Digitales Trauma
quelle
3

(rein) Bash, 64

Nimmt die Eingabe als erstes Argument an, wobei eine gültige Eingabe vorausgesetzt wird.

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

Erstellt ein Array vund greift dann auf das in der Eingabe angegebene Element zu. Da Arrays mit Nullen indiziert sind, musste ich ein 0. Element als Platzhalter hinzufügen. Alternativ (Danke an @DennisWilliamson für diesen Hinweis):

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

quelle
2
Gleiche Anzahl von Zeichen: v=(one two three four five six seven eight nine)undecho ${v[$1-1]}
Dennis Williamson
3

Python 2.x - 65 64

Nicht so gut wie @grcs Antwort, aber besser lesbar :-)

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

Ein Zeichen weniger dank @flornquake

'nine eight seven six five four three two one'.split()[-input()]
Willem
quelle
Dieser ist auch schön. :-) Es klappt.
Nicolas Barbulesco
3
Sie können ein Zeichen wie dieses speichern:'nine eight seven six five four three two one'.split()[-input()]
Flornquake
Das ist eine schöne!
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]);
    }}
Baby
quelle
3

C 111

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

Die Länge wird hier sorgfältig konstruiert , damit ich es als binäres und convert interpretieren kann , dass in Dezimalzahlen. Mit nur 7 Zeichen bin ich zuversichtlich, dass ich einen Gewinner habe!

Jerry Sarg
quelle
1
+1 Code-Golfer haben im Allgemeinen nichts dagegen, wenn Ihr C-Code mit Warnungen kompiliert wird , solange er den Spezifikationen entspricht. Sie können also den Rückgabetyp #includeund weglassen main(). Auch biss ein von Refactoring des Ausdrucks: main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}. 86 Zeichen nach meiner Zählung.
Digital Trauma
Ich verstehe die Länge nicht und sehe nicht, wo es 7 Zeichen geben würde.
Nicolas Barbulesco
@NicolasBarbulesco: Es sind 111 Zeichen - aber wenn wir das 111als binär behandeln , würde das 7in dezimal konvertieren .
Jerry Coffin
Jerry, da läuft Codegolf in deinem Kopf!
Nicolas Barbulesco
3

bash say (OS X): 3 8

"Ihr Ziel ist es, eine ganze Zahl zwischen 1 und 9 in das Wort umzuwandeln, das es darstellt."

Als ich das letzte Mal nachgesehen habe, sind gesprochene Wörter auch Wörter. Vorheriger Versuch (akzeptiert keine Eingabe)

say 4

Bearbeiten, muss Eingabe lesen können:

say|read

Geben Sie eine beliebige Zahl ein, und das Wort wird ausgegeben. Ich weiß, dass das Enddatum fällig ist, aber meiner Meinung nach hätte ich den Wettbewerb gewinnen sollen.

Beispiel-Audiodatei: four.aiff

CousinCocaine
quelle
sollte nicht 5 sein?
Rpax
@rpax Ich glaube nicht, dass die Eingabe als Zeichen gezählt wird, oder?
CousinCocaine
1
Das ist schlau. Aber das verfehlt die Eingabe.
Nicolas Barbulesco
1
Leider ist dies keine gültige Antwort, weil: Es werden keine Eingaben vom Benutzer akzeptiert UND es funktioniert nur, wenn die Nummer 4 ist.
Jon
1
Der Kommentar von Chipperyman zu dieser Antwort von CousinCocaine ist wahr. Dies gilt jedoch auch für die Antwort von @RegisteredUser . Chipperyman hat diese Antwort von CousinCocaine jedoch abgelehnt und die Antwort des Gewinners des registrierten Benutzers ex æquo erklärt. Darüber hinaus ist die Antwort des registrierten Benutzers eine Kopie dieser Antwort von CousinCocaine. Das ist mehr als unfair.
Nicolas Barbulesco
2

VBScript 98 80 75

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

J - 68 oder 60 57 oder 53 Bytes

Interaktive Version (stdin):

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

Funktionsversion:

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

Erläuterung:

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

".(1!:1)1 Liest einen String und konvertiert ihn in eine Ganzzahl

seequ
quelle
Sie können ein Zeichen speichern, indem Sie es als train ( (;:'one two blah')>@{~<:) schreiben, und weitere sechs, indem Sie stattdessen das Gerundium one`two`blahverwenden ;:.
Algorithmushai
@algorithmshark Danke! Ich lerne immer noch J. Obwohl, würde die Zugversion nicht erfordern, dass der Text einen unendlichen Rang hat (edit: anscheinend nicht ... warum nicht?) Und die gerundete Version zusätzliche Anführungszeichen (edit: oh, sie erstellt eine Liste von Boxen)?
Siehe auch
Eine Gabel kann im linken Argument ein Substantiv haben, was eine Abkürzung für ein konstantes Verb ist, das dieses Substantiv mit unendlichem Rang hervorbringt (siehe Dictionary ). Und nein, keine zusätzlichen Anführungszeichen zum Gerundium: undefinierte Namen werden als Verweise auf Verben behandelt, und das Gerundium dafür ist nur eine geschachtelte Zeichenfolge, die den Namen enthält.
Algorithmushai
Außerdem müssen Sie die STDIN-Version nicht als Verbausdruck schreiben: Ist >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]13 Zeichen kürzer.
Algorithmushai
1
@algorithmshark Haha, warum habe ich das nicht so gemacht?
Siehe auch
2

Perl 36 (58 eigenständig)

use Number::Spell;say spell_number<>

Oder ohne Zusatzmodule:

say qw(one two three four five six seven eight nine)[<>-1]
el.pescado
quelle
Ihr erstes Skript funktioniert auf meinem Mac nicht. 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
Ihr zweites Skript funktioniert auf meinem Mac nicht. 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 Zeichen.

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

Dieses Skript übernimmt die Eingabe in einem Dialog. Dann gibt es die Ausgabe im AppleScript-  Ergebnis .

Beispiel:

  • Eingabe: 6
  • Ausgabe : "six"

Hier ist eine schönere Version:

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

Diese Version zeigt die Ausgabe in einem schönen Dialog.

Beispiel:

  • Eingabe: 9
  • Ausgabe : nine

[Antwort bearbeitet; Dialog für die Eingabe leicht verbessert; immer noch 124 Zeichen. Antwort erneut bearbeitet; jetzt 1 char weniger! ]

Nicolas Barbulesco
quelle
1
set n to text returned of... Wow.
Siehe auch
2

Powershell - 91 74

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

So entfernen Sie den Enum- und ToObject-Aufruf:

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

Wie funktioniert das?

HourOfDay ist ein Aufzählungstyp, sodass wir Namen anstelle von magischen Konstanten verwenden können. Aufzählungstypen haben eine ToString () -Implementierung, die Ihnen den Namen des konstanten Werts gibt. Sie können ein Int in eine Enumeration umwandeln. Console.Read () liest ein Zeichen aus dem als Ganzzahl dargestellten Eingabestream. Wenn Sie '1' eingeben, erhalten Sie 49, subtrahieren Sie 48, um 1 zu erhalten.

Da Powershell einen ToString für alle Objekte ausführt, die in den Ausgabestream geschrieben werden, und keinen Fluff benötigt, um daraus eine ausführbare Datei zu machen, ist dies alles, was außer Powershell benötigt wird ...

rene
quelle
2

CJam - 50

Dies ist eine einfache ASCII-Lösung, die HTTP-Anforderungen verwendet (dies ist in der Frage zulässig):

"aj21.com/"r+g

Auf dem Server befinden sich 9 Klartextdateien mit den Namen 1, 2, ..., 9, die jeweils das entsprechende Wort enthalten.

Gesamtgröße: 14 + 3 ("eins") + 3 ("zwei") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
Mit einer kürzeren Domain kann mehr Golf gespielt werden.

Der Online-Interpreter unterstützt keine HTTP-Anforderungen, daher muss das Programm mit dem Java-Interpreter ausgeführt werden .

aditsu
quelle
1
Bitte fügen Sie einen Kommentar hinzu, wenn Sie abstimmen.
Aditsu
-1, dies ist eine Standardlücke .
Nyuszika7h
3
@ Nyuszika7h Es ist ausdrücklich in dieser Frage erlaubt
Aditsu
1
Entschuldigung, das habe ich nicht verstanden. Ich kann meine Ablehnung jetzt nicht rückgängig machen, bis die Antwort bearbeitet ist.
Nyuszika7h
1
@ nyuszika7h bearbeitet
aditsu
2

Batch - 86

Weitaus kürzer als die andere Batch-Antwort und tatsächlich überraschend wettbewerbsfähig.

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

Verwendet als filename.bat number, und die Ausgabe erfolgt in Form einer Datei mit dem Namen der richtigen Nummer.

Οurous
quelle
2

Ruby 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]
Mhmd
quelle
1
Sie können ein paar Bytes mehr hacken, indem Sie 9 direkt an der Stelle von x ersetzen
Mr. Alien
6
Ich sehe nicht, wo dieser Code Eingaben aufnimmt. Und warum schreiben 9-1Sie , wenn Sie nur sagen können 8? Natürlich sind beide 9-1und 8falsch; Dieses Skript gibt die ganze Zeit "neun" aus und ignoriert Eingaben.
Ray Toal
2

Bash 9

schamlose Linux-Replik der Antwort von Cousincoicane

spd-say 1

spricht eines aus

registrierter Nutzer
quelle
1
Würde das nicht nur funktionieren, wenn die Eingabe 1 wäre?
Jon
1
@Chipperyman funktioniert für jede Nummer
Registrierter Benutzer
Limit, aber schlau!
Nicolas Barbulesco
Dies verfehlt die Eingabe.
Nicolas Barbulesco
@nicolasbarbulesco ja. Aber es gab noch viele andere Antworten, bei denen die Eingabe fehlte.
Registrierter Benutzer
2

GolfScript, 50 Bytes

Ich wollte sehen, ob ich die 51-Byte-GolfScript-Lösung von Quincunx übertreffen kann . Es stellt sich heraus, dass ich mit genügend Tricks - pro Byte - kann.

Da einer der von mir verwendeten Tricks die Verwendung von Bytes außerhalb des druckbaren ASCII-Bereichs ist, kann das resultierende Programm hier nicht direkt eingefügt werden. Stattdessen stelle ich einen Hex-Dump zur Verfügung. Benutzer auf Unixish-Systemen können xxd -rdas aktuelle 50-Byte-GolfScript-Programm aus dem Hex-Dump rekonstruieren:

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

Der grundlegende Trick, der zum Generieren dieses Programms verwendet wird, ist einfach: Ich komprimiere das lange String-Literal, das den größten Teil von Quincunx 'Code ausmacht, indem ich 99 (den ASCII-Code des Buchstabens c) von den Zeichenwerten subtrahiere und die resultierenden Werte als Zahl in Basis 22 interpretiere (genug, um die Buchstaben bis zu kodieren x) und dann die resultierende Zahl in Basis 255 neu zu kodieren, um die nicht druckbare Byte-Zeichenfolge zu erzeugen, die den größten Teil der ersten Hälfte meines Programms ausmacht. Der Rest des Programms kehrt diesen Vorgang dann um und dekodiert den String wieder in etwas Druckbares.

(Da der niedrigste Buchstabe in den Nummernnamen tatsächlich vorhanden ist e, hätte ich die Byte-Zeichenfolge weiter verkürzen können, indem ich 101 von den ASCII-Codes subtrahierte und Basis 20 verwendete. oWenn ich jedoch 101 subtrahierte, hätte ich den Buchstaben einer neuen Zeile zugeordnet, die ich nIch verwende als Zahlenbegrenzer, weil es bequem als integrierte Konstante in GolfScript verfügbar ist. Das Umgehen kostet mich mehr als das Byte, das bei Verwendung einer niedrigeren Basis gespart würde. Wenn der Versatz 99 verwendet wird, verbleibt die dem Buchstaben entsprechende neue Zeile m, was in den Nummernnamen praktisch nicht vorkommt.)

Hier ist eine abgespeckte Version des Programms:

~       # 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
quelle