Automatisieren Sie Ihre Zählübung für die erste Klasse


36

CodeGolf Challenge

PWSSHHHH! Sie wachen im Jahr 3000 in einem Kryotechnik-Labor auf. Nachdem Sie zur Einsatzzentrale begleitet wurden, um Ihren Karrierechip zu erhalten, vermutlich den eines Boten, stellt eine Sonde fest, dass Sie aus dem Jahr 2000 stammen stereotype Vorurteile , man wird im vergleich zum heutigen modernen menschen als dumm angesehen und gezwungen gradeschool zu wiederholen.

Sie betreten Ihr Klassenzimmer in der ersten Klasse und der Lehrer gibt einen Auftrag. Sie sagt oder schreibt eine Zahl bis zu 50. Wenn sie die Zahl an die Tafel schreibt (zum Beispiel: 25), müssen Sie die Zahlen bis zu dieser Zahl "eins, zwei, drei, ..., fünfundzwanzig" sagen ". Wenn sie die Nummer laut ausspricht (zum Beispiel: "Sechs"), müssen Sie auf Ihrem Tablet die Nummern bis zu dieser Nummer "1, 2, 3, 4, 5, 6" schreiben.

Dies wird sehr mühsam und Sie beschließen, den Prozess mit Ihren noch funktionierenden und dennoch archaischen Programmierkenntnissen des 21. Jahrhunderts zu automatisieren.


Zielsetzung:

Ihr Programm sollte eine Eingabe nehmen. Diese Eingabe ist entweder eine Dezimalzahl ( 1 thru 50) oder eine ausgeschriebene Zahl ( one thru fifty).

• Wenn es sich bei der Eingabe um eine Dezimalzahl handelt, sollte Ihre Ausgabe in ausgeschriebener Form von eins bis zu dieser Zahl zählen. (zB zweiunddreißig )

• Wenn es sich bei der Eingabe um eine ausgeschriebene Zahl handelt, sollte Ihre Ausgabe von 1 bis zu dieser Zahl in Dezimalform zählen. (zB 32 )


Regeln:

Die Ein- und Ausgabe kann in jedem beliebigen Fall erfolgen (Sie können also ein Programm erstellen, das nur Großbuchstaben akzeptiert, wenn dies gewünscht wird).

Eingegebene Dezimalzahlen müssen nicht vom Typ Zahl sein (z. B. int). Sie können eine Eingabezeichenfolge mit Zahlen sein (25 vs "25"). Entweder ist alles in Ordnung und Sie können auswählen, welches Programm von Ihrem Programm akzeptiert werden soll. (Ihr Programm muss nicht beide akzeptieren)

Für den ausgeschriebenen Stil ist KEIN Bindestrich zwischen zusammengesetzten Wörtern erforderlich. Sie können dies jedoch auch tun, wenn Sie dies wünschen.

Ausgabewerte müssen in irgendeiner Form getrennt werden, ein beliebiges Trennzeichen ist in Ordnung 1,2,3 1 2 3 etc

Sie können keine zusätzlichen Bibliotheken wie num2words (Python) usw. hinzufügen (Systembibliotheken sind jedoch in Ordnung).

Obwohl die Hintergrundgeschichte besagt, dass Sie aus dem Jahr 2000 stammen, können Sie Sprachen verwenden, die nach diesem Datum erstellt wurden (lol)


Das ist , also gewinnt das Programm mit dem kürzesten bytecount!


1
Dürfen wir bei Python Bibliotheken wie num2words verwenden ?
Gurupad Mamadapur

1
@ AlbertRenshaw aber was ist mit Builtins, die das tun? (Mathematica)
Pavel

1
@coredump Entweder können Sie den einen oder den anderen oder beide auswählen. Es muss nicht in der Lage sein, beide Arten von Eingaben zu verarbeiten
Albert Renshaw

2
"Beiße meinen glänzenden Metallarsch!" Ich zähle mich nicht selbst
RaisingAgent

1
Ich denke immer wieder, der Titel ist "Ihre erste (
Klassen-

Antworten:


32

Perl 6 , 119 113 Bytes

{my \n=<①     ㊿>.map:{|map *.uniname.words[2..*].join,$^a..$^b}
/\d/??n[^$_]!!1..1+first $_,n,:k}

Unicode-Datenbank FTW!

Verwendet ausgeschriebene Zahlen in Großbuchstaben ohne Bindestrich, z TWENTYTWO.
Gibt eine Liste von Zeichenfolgen oder einen Bereich von Zahlen zurück. (Beide verwenden Leerzeichen als Trennzeichen, wenn sie mit gedruckt werden put.)


3
Sehr klug ahahaha!
Albert Renshaw

13

Python3, 276 271 269 243 237 235 232 217 Bytes

Ein Hinweis aus der @smls-Perl-Einreichung ...

from unicodedata import*
o=[name(chr(k)).split(' ',2)[-1]for j in['①⑴','㉑㉠','㊱㋀']for k in range(ord(j[0]),ord(j[1]))]
i=input()
w=i in o
for i in range(w and o.index(i)+1or int(i)):print(w and i+1or o[i])

Ich vermute, es könnte ein bisschen weiter golfen werden.

Es verwendet die Systembibliothek unicodedata, um nach Namen für Nummern zu suchen. FORTY TWOAls Eingabe sind Namen von Großbuchstaben (durch Leerzeichen getrennt:) oder Dezimalzahlen erforderlich.

(Dies ist meine erste Code Golf Einreichung.)

(Mir ist auch gerade aufgefallen, dass ich die Länge (Codierung) falsch gezählt habe. Das sind also ein paar Bytes weniger als bisher angenommen. Ich habe jedoch nur die letzte Byteanzahl aktualisiert. Hoppla.)


Willkommen bei PPCG!
AdmBorkBork

In advocacy: unicodedataist eine Systembibliothek, die mit der Standardinstallation geliefert wird, keine "zusätzliche" Bibliothek, die separat installiert werden muss.
Unayok

Willkommen auf der Seite! Sie können viele Leerzeichen aus Ihrem Code entfernen .
31.

1
Willkommen bei PPCG. Sie können 3 Bytes verlieren, indem Sie den Ausdruck in eine forSchleife einfügen und zwischen den einzelnen Ausgaben Zeilenumbrüche einfügen. print()Es ist egal, ob es eine ganze Zahl oder eine Zeichenfolge ist. Probieren Sie es online!
ElPedro

1
Ich denke, Sie können import*stattdessen import nameein paar Bytes speichern
Weizen-Assistent

10

Gemeines Lisp, 297 253 243 242 144 128

(lambda(s)(#1=dotimes(u(or(#1#(i 51)(if(equal(#2=format()"~R"i)s)(return i)))s))(#2#t"~[~:;, ~]~:[~R~;~D~]"u(stringp s)(1+ u))))

Einzelheiten

(lambda (s) 
  (dotimes                         ; iterate...                                                                          
      (u                           ; for u from zero below ...                
       (or                         ; if s is a string, then                   
        (dotimes (i 51)            ;   parse s by iterating from 0 to 50      
          (if (equal               ;   until we find a match between          
               (format nil "~R" i) ;   the English word(s) for i              
               s)                  ;   and the given s                        
              (return i)))         ;   (exit loop)                            
        s))                        ; otherwise, use s, which is a number      
    (format t                      ; for each U, print to standard output     
            "~[~:;, ~]~:[~R~;~D~]" ; (see below for details)                  
            u                      ; ...                                      
            (stringp s)            ; ... arguments to format                  
            (1+ u))))              ; ...                                      
  • ~[ 0 ~; 1 ~; ... ~:; else ~]ist ein Schalter, der auf dem Wert des nächsten verfügbaren Arguments basiert und zum entsprechenden Untersteuerungsformat springt. Hier habe ich nur einen Fall von "0" und für "sonst". Dies wird verwendet, um vor jeder Zahl ein Trennzeichen einzufügen, mit Ausnahme der ersten, dank U, das bei Null beginnt.

  • ~:[ FALSE ~; TRUE ~]ist ein bedingtes Format; Hier geben wir die Dinge unterschiedlich aus, unabhängig davon, ob es sich bei der Eingabe s um eine Zeichenfolge handelt oder nicht.

  • ~RSchreiben Sie eine Zahl als eine englische Kardinalzahl, während Sie ~Ddie Zahl einfach ausdrucken.

Beispiele

CL-USER> (test "five")
1, 2, 3, 4, 5

CL-USER> (test 32)
one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two

Nach meinem Verständnis der Frage muss es möglich sein, beide Stile und nicht nur einen zu analysieren, sodass Ihre 55-Byte-Lösung möglicherweise nicht gültig ist. "Ihr Programm muss nicht beide akzeptieren" bezieht sich auf 25 vs "25", die Dezimalzahl als Zahl oder als Zeichenfolge.
Tom

@ TomDevs Danke. Das ist definitiv verwirrend. Um sicher zu sein, wenn ich definiere f, dass "(f 2)" eins, zwei "und (f "two")" 1, 2 "druckt, sieht es für Sie gut aus?
Coredump

Ja, ich denke das ist richtig.
Tom

@ TomDevs Danke, ich habe es behoben
Coredump

1
@ AlbertRenshaw Nein, nur Englisch; Dieses Feature könnte bereits als aufgedunsen betrachtet werden, aber da es in einigen Lisps bereits implementiert wurde, wurde es standardisiert.
Coredump

8

JavaScript ES6, 559 526 381 368 364 358 332 327 315 Bytes

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

Vielen Dank an Kritixi Lithos für die Idee, das Array zu teilen, und an Arnauld für den 1 / n-Trick.

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

console.log(c("twentyfive"));
console.log(c("fifty"));
console.log(c(50));


1
Sie können die entfernen varund Sie können das Array ['one,'two',..]zu ändern"one0two0three0...".split(0)
Kritixi Lithos

Redundantes Leerzeichen bei null, Array(n).
Yytsi

2
Sie können ersetzen !isNaN(n)durch 1/n. Dies gibt Ihnen NaNfür eine Zeichenfolge (falsch), einen Gleitkommawert ungleich Null für eine Ganzzahl ungleich Null (wahr) oder Infinityfür 0 (auch wahr).
Arnauld

Fügen Sie 4 Leerzeichen vor jeder Codezeile hinzu
sagiksp

@sagiksp Ja, muss beim Bearbeiten des Beitrags etwas durcheinander gebracht haben, sollte jetzt behoben sein :)
Tom

6

Python 2 , 503 499 494 490 479 Bytes

-5 danke an @JonathanAllan

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,z,R=raw_input(),' ',range
try:n=int(i);p=(n/10)-2;o=(l+sum([[m[x]]+[m[x]+z+l[y]for y in R(9)]for x in R(p)],[])+[m[p]]+[m[p]+z+l[y]for y in R(n%10)],l[:n])[n<20]
except:j=i.split();o=map(str,R(1,(m.index(j[0])+2)*10+l.index(j[1])+2if z in i else l.index(i)+2if i in l else(m.index(i)+2)*10+1))
print','.join(o)

Probieren Sie es online!

Geben Sie entweder eine Zahl oder eine durch Leerzeichen getrennte Schreibweise einer Zahl ein.

Etwas weniger Golf und besser lesbare Version:

l='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
m='twenty','thirty','forty','fifty'
i=raw_input()
try:
 n=int(i)
 if n<20:
  o=l[0:n]
 else:
  o=l
  for x in range((n/10)-2):
   o+=[m[x]]+[m[x]+' '+l[y]for y in' '*9]
  p=m[(n/10)-2]
  o+=[p]+[p+' '+l[y]for y in' '*n%10]
except:
 if' 'in i:
  t=i.split()
  s=((m.index(t[0])+2)*10)+l.index(t[1])+2
 else:
  s=l.index(i)+2 if i in l else((m.index(i)+2)*10)+1
 r=range(1,s)
 o=map(str,r)
print','.join(o)

1
6 Byte sparen mitl="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Jonathan Allan

... oops 5, habe das evon verpasst nineteen.
Jonathan Allan

Gibt es einen Grund, warum Sie Python 2 verwenden müssen, ohne das der Ausdruck länger wäre, aber der raw_input nur eingegeben werden könnte? (
Dieselbe

@ nedla2004 - Kein Grund außer dem, dass ich Python 3 noch nicht auf meinem neuesten Laptop installiert habe :-)
ElPedro

6

Scheme, 161 , 152 , 149

(define (c x)(let((r(string->number x)))(let l((i 1))(let((n (format #f "~r" i)))(display(if r n i))(newline)(or(eq? r i)(equal? x n)(l (+ i 1)))))))

Unkomprimiert:

(define (count limit)
  (let ((numerical-limit (string->number limit)))
    (let l ((i 1))
      (let ((current-number (format #f "~r" i)))
        (display (if numerical-limit current-number i))
        (newline)
        (or (eq? numerical-limit i)
            (equal? limit current-number)
            (l (+ i 1)))))))

Wie konvertiert man zB "vier" nach 4? Ich bin mir nicht sicher string->number, ob dies der Fall ist. Ich habe es schnell überprüft und es scheint verwendet zu werden, um z. B. einen String "4"in eine Zahl umzuwandeln 4.
Coredump

@coredump Das ist richtig. (string->number "four")kehrt zurück #f.
Michael Vehrs

Welches Programm laufen Sie?
Coredump

1
@ coredump guile 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 Bytes

Inspiriert von der JS-Lösung von TomDevs

Durch Ersetzen $a=[...]durch 25 Byte gespart$a=explode(...)

Durch Zurückschalten auf ein Array ohne Zeichenfolgenbegrenzer und Speichern teenin einer Variablen dank @ user59178 wurden weitere 23 Byte gespeichert

Durch Entfernen der (int)Typumwandlung wurden weitere 5 Bytes gespart

Gespeichert weitere 15 Bytes , die durch Fallenlassen $b, die $iin den forErklärungen und die geschweiften Klammern, dank @ zu user59178 wieder

$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];foreach([twenty,thirty,forty,fifty] as$c){$a[]=$c;for($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];}if($argv[1]!=0)for($i=0;$i<$argv[1];)echo$a[$i++].' ';else for($i=1;$i<=array_search($argv[1],$a)+1;)echo$i++.' ';

Ungolfed:

$a =[one,two,three,four,five,six,seven,eight,nine,ten,eleven,‌​twelve,thir.$t=teen,‌​four.$t,fif.$t,six.$‌​t,seven.$t,eigh.$t,n‌​ine.$t];
foreach ([twenty,thirty,forty,fifty] as $c){
    $a[] = $c;
    for ($i=0;$i<9;)
        $a[] = $c . '-' . $a[$i++];
}
if( $argv[1] !=0 )
    for ($i=0;$i<$argv[1];)
        echo $a[$i++] . ' ';
else
    for ($i=1;$i<=array_search($argv[1], $a)+1;)
        echo $i++ . ' ';

Versuchen Sie es mit einer Eingabezeichenfolge oder einer Eingabenummer


1
Beim Golfen können Sie viele Saiten direkt ohne Anführungszeichen verwenden, einschließlich der gesamten Zahl, die Sie verwenden. Dies führt zu einem Hinweis, der jedoch ignoriert werden kann. Außerdem ist es kürzer (um 2 ganze Bytes), teeneine Variable zu speichern , anstatt sie jedes Mal zu wiederholen. Als solches würde es werden:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
user59178

Hatte nicht daran gedacht, danke;)
roberto06

Sie können 7 weitere Bytes einsparen, $bindem Sie das zweite Array direkt in foreach ablegen und ablegen, 6 weitere Bytes, indem Sie alle geschweiften Klammern ablegen (obwohl Sie die $a=$cin das Setup der for-Schleife einfügen müssen) und 6 weitere Bytes, indem Sie nachträglich erhöhen $iwenn Sie es verwenden, anstatt im 'After'-Bit der for-Schleifen.
user59178

Sparen Sie sechs Bytes (zwei pro Schleife), indem Sie das Post-Inkrement von for in die folgende Zeile verschieben:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Alex Howansky,

Hoppla, sorry, habe gerade bemerkt, dass @ user59178 dasselbe vorgeschlagen hat ...
Alex Howansky

6

Python 2, 262 Bytes

x="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()
x+=[a+"ty"+b for a in"twen","thir","for","fif"for b in['']+x[:9]]
v=input()
for s in range(1,x.index(v)+2)if v>50else x[:v]:print s

repl.it

Eingabe- und Ausgabezeichenfolgen sind klein und verkettet *. Geben Sie zum Testen einer Zeichenfolgeneingabe beispielsweise "thirtyfive"an der Eingabeaufforderung ein.

Erstellt die Liste aller Wörter (plus "fiftyone"bis "fiftynine"), xtestet dann, ob inputes sich um ein Wort mit dem Proxy handelt v>50(Zeichenfolgen sind größer als Zahlen in Python 2 und alle Zahlen im gültigen Eingabebereich aus der Spezifikation sind <=50) und prints die entsprechenden Werte, indem Sie entweder die Liste aufteilen x[:v]oder einen Bereich von ganzen Zahlen aufbauen range(1,x.index(v)+2).

* Hinzufügen hyphenation auf beide Kosten 11 Bytes, durch Ersatz a+"ty"bmit a+"ty"+'-'*(b>'')+b.


5

Wolfram-Sprache, 92 Bytes

If[NumberQ@#, Do[Print@IntegerName@i, {i, #}], 
  Do[Print@i, {i, Interpreter["SemanticNumber"]@#}]] &

(Ich bin neu in diesem Bereich, lass es mich wissen, wenn ich etwas falsch gemacht habe.)


2
-10 Bytes:Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JungHwan Min

5

JavaScript (ES6), 261 Byte

Hinweis: Die Zeichenfolge, die z zugewiesen ist, wird mit codiert atob. In der codierten Zeichenfolge befinden sich 11 Bytes, die ich nicht auf dieser Site veröffentlichen kann, selbst wenn es sich um gültige Zeichen in einer JavaScript-Zeichenfolge handelt. Also habe ich ein Hex-Escape in der Form \ xHH verwendet. Jedes dieser Escapes wird als 1 Byte gezählt.
Die ursprüngliche unkomprimierte Saite ist die weniger golfene Version.

x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(z[i]||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

Weniger golfen

x => (
  z = '9one9two9three9four9five9six9seven9eight9nine9ten9eleven9twelve9thir99fif999eigh99twen99for9'
      .split(9),
  o = (0 + // 0 + array to build a comma separated string
       z.map( (v, i) => 
         i < 20 
         ? i < 13 
           ? v // 1 to 13 are 'as is'
           : (v||z[i-10])+'teen' // compose for 14 to 19
         : z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d)) // 20s, 30s, 40s, 50s
      ).split`,`, // from comma separated to array again
  // o contains strings from one to fiftynine
  p = o.indexOf(x), // look for input
  o.slice(1, -~x+p+!~p).map((x,i) => ~p?i+1:x)
)

Prüfung

F=
x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

function update() {
  var i=I.value
  O.textContent = F(i)
}  

update()
<input id=I value=25 oninput='update()'><pre id=O></pre>


ö\x89ÞöÜ(öØ...Dieses Zeug ist großartig hahaa
Albert Renshaw


5

Python 3 , 305 303 Bytes

Auf Empfehlung von @ nedla2004 auf Python 3 konvertiert. Es ist jetzt auch kein Leerzeichen zwischen den eingegebenen oder ausgegebenen Zahlen vorhanden, zB geben Sie zweiundzwanzig ein

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,R=input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print(x)

Probieren Sie es online 3!

Python 2 , 327 320 313 308 Bytes

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty'
i,R=raw_input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])+['fifty']
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print x

Probieren Sie es online 2!

163 170 177 Bytes kürzer als meine ursprüngliche Antwort, daher poste ich sie als Alternative. Dies verwendet fordie beiden Listen, um eine vollständige Liste aller Zeichenfolgendarstellungen der Zahlen zu erstellen, identifiziert dann die richtige in der Liste und druckt alles bis zu dieser entweder nach Wert oder nach Index. Gibt für jeden Wert eine neue Zeile aus.


5

Python 2, 432 422 416 403 Bytes

Ich bin sicher, dass dies verbessert werden kann. Zumindest, wenn ich mit der Hardcodierung des zu bearbeitenden Werts durchkomme und keine Funktion benötige, kann ich 20 speichern. Es wird ein Leerzeichen benötigt, um Wörter bei der Texteingabe zu trennen. Dank JonathanAllans Kommentar zu ElPedros Antwort, 4 für die Neuordnung der Mathematik, 6 Bytes gespart.

def z(f):
 a,b,i,d="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()+[""],"twenty thirty forty fifty".split(),1,f>50
 if d:f=f.split();f=a.index(f[-1])+21+b.index(f[-2])*10 if len(f)>1 else b.index(f[-1])*10+20 if f[-1]in b else a.index(f[-1])+1
 while i<=f:s=i if d else a[i-1]if i<20 else b[i//10-2]+a[i%10-1];print s;i+=1

(Hinweis: In der aktuellen Version werden Tabulatoren anstelle von Leerzeichen verwendet. QPaysTaxes fügte ein einzelnes Leerzeichen hinzu, da dies nicht ordnungsgemäß gerendert wurde, um sicherzustellen, dass der angegebene Code kompiliert wird. Die Byteanzahl sollte nicht geändert werden.)


@ JonathanAllan Kommentar zu ElPedro Antwort funktioniert auch hier für -6
Chris H

1
len(`f`)>2kann ...`f`[2:]für weitere 3 sein, glaube ich. (Ignorieren Sie die ...kann nicht scheinen, um die Backticks richtig zum Laufen zu bringen)
Jonathan Allan

Tatsächlich könnten Sie in Python 2 f>50für 6 gehen (und ein anderes, indem Sie nicht verwenden d)
Jonathan Allan

@JonathanAllan das nicht funktioniert , Zahlen als ganze Zahlen für das Bestehen, die ich zur Zeit: TypeError: 'int' object has no attribute '__getitem__'. Wenn ich numerische Eingabe als String übergeben, f[2:]kommt näher , aber immer noch nicht, wenn sie als boolean trated ( print f[2:] and Truedruckt eine leere Zeile , wenn Len (f) <2, nicht Trueoder False)
Chris H

@ JonathanAllan f>50arbeitet, danke. Das Löschen dist nicht so einfach, da ich den Endwert der Schleife immer in fZeile 8 eingeordnet habe, damit er nicht geändert werden kann, if f>50da er niemals wahr ist.
Chris H

4

C ++ 11, 484 480 477 Bytes

#import<iostream>
#import<cstdlib>
#import<vector>
using namespace std;f(){int j,i=2;string s="teen";vector<string>v={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"};for(;i++<9;)v.push_back(v[i]+s);v[13]="thir"+s;v[15]="fif"+s;v[18]="eigh"+s;for(i=19;i++<50;){string n[4]={"twenty","thirty","forty","fifty"};v.push_back(n[i/10-2]+v[i%10]);}cin>>s;if(i=atoi(s.c_str()))for(j=0;j++<i;)cout<<v[j]<<" ";else while(v[i++]!=s)cout<<i<<" ";}

Texteingabe in Kleinbuchstaben ohne Bindestriche.


3

PowerShell , 362 Byte

$z=0..50|%{("0twenty0thirty0forty0fifty"-split0)[+(($b="$_"[0])-gt49)*($_-gt19)*(+"$b"-1)]+($x=(("0one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve"-split0)+(-split'thir four fif six seven eigh nine'|%{$_+'teen'})))[($_%10)*($_-gt19)]+$x[$_*($_-le19)]}
if(($n=-split$args)[0][0]-in48..57){$z[$n[0]..$n[2]]}else{$z.IndexOf($n[0])..$z.IndexOf($n[2])}

Probieren Sie es online! Worteingabe oder Zahleneingabe

Das ist ein richtiges Durcheinander, und ich bin nicht besonders glücklich damit, aber hier ist es. Golfvorschläge sind willkommen.

Die erste Zeile besteht aus $zeinem Array der vollständigen englischen Wörter. Sie können die -split0for-Nummern 1für 12und die Schleife für die Konstruktion aller teens sehen, und dann gibt es eine Reihe von Logik, um alles richtig zusammenzusetzen. Probieren Sie es online!

Die zweite Zeile beginnt mit einer Logik. Wir nehmen die Eingabe $args(als Zeichenfolge), -splitspeichern sie auf Leerzeichen, speichern sie $nzur späteren Verwendung, nehmen das erste [0]Wort und das erste [0]Zeichen davon und prüfen, ob es sich um -ineinen Bereich handelt 48..57(dh ASCII 0bis 9). Wir prüfen also, ob wir eine Dezimaleingabe oder eine englische Eingabe haben. Probieren Sie es online!

Im ersten Fall erstellen wir einen Bereich basierend auf den Dezimaleingaben $n[0]..$n[2]und indizieren diesen $z[...]. Im anderen Fall finden wir .indexOf()das erste und das letzte Wort und bilden daraus nur einen numerischen Bereich. In beiden Situationen befindet sich jetzt ein Array von Objekten in der Pipeline (entweder Zeichenfolgen oder Ganzzahlen), und ein impliziter Write-OutputZeitpunkt der Programmbeendigung gibt uns eine neue Zeile zwischen den Elementen.


3

Swift3, 402 Bytes

let f=["one","two","three","four","five","six","seven","eight","nine"]
let g=["twenty","thirty","forty","fifty"]
let v=[f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},[g[0]],f.map{g[0]+$0},[g[1]],f.map{g[1]+$0},[g[2]],f.map{g[2]+$0},[g[3]]].flatMap{$0}
func c(s:String){if let i=Int(s){print(v.prefix(upTo:i))}else{for j in 1...v.index(of:s)!+1{print(j)}}}

Ungolfed:

let f = ["one","two","three","four","five","six","seven","eight","nine"]
let g = ["twenty","thirty","forty","fifty"]

let values = [f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},
              [g[0]], f.map{g[0]+$0},
              [g[1]], f.map{g[1]+$0},
              [g[2]], f.map{g[2]+$0},
              [g[3]]].flatMap{$0}

func count(s:String){
    if let i = Int(s) {
        print(values.prefix(upTo: i))
    } else {
        for j in 1...values.index(of: s)!+1{
            print(j)
        }
    }
}

count(s:"29")
count(s:"twentyeight")

Hier gibt es nichts Besonderes, nur ein Array zum Sichern der ausgeschriebenen Zahlen.

Ich dachte ursprünglich diese Lösung mit dieser anderen Methode, um das valuesArray zu berechnen :

let values = f + ["eleven","twelve"]
    + ["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}
    + [g[0]] + f.map{g[0]+$0}
    + [g[1]] + f.map{g[1]+$0}
    + [g[2]] + f.map{g[2]+$0}
    + [g[3]]

Welches könnte golfen werden, um:

let v=f+["eleven","twelve"]+["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}+[g[0]]+f.map{g[0]+$0}+[g[1]]+f.map{g[1]+$0}+[g[2]]+.map{g[2]+$0}+[g[3]]

Ersetzen der 3. Zeile im Golfcode

Ich hätte 381 Bytes erfassen können, aber es gibt einen Compilerfehler, der besagt: "Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden". Weitere Informationen zu dem Fehler finden Sie hier


LIEBE es, schnell hier zu sein, ich muss das überprüfen, wenn ich zurückkomme
Albert Renshaw

3

R 452 430 424 Bytes

o=c("","one","two","three","four","five","six","seven","eight","nine") 
t=gsub(0,"teen",c("ten","eleven","twelve","thir0","four0","fif0","six0","seven0","eigh0","nine0"))
s=c("twenty","thirty","forty") 
p=""
for(i in s){for(j in o){p=paste0(p,i,j," ")}}
as.data.frame(t(d<-1:50))
names(d)=c(o[-1],t,as.vector(strsplit(p," ")[[1]]),"fifty")
f=function(x){if(is.numeric(x)){names(d)[1:x]}else{matrix(d[1:d[x]],dimnames=NULL)}}

#> f(5)
#[1] "one"   "two"   "three" "four"  "five" 

#> f('five')
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

Platziert die Zahlen in einem data.frame mit ausgeschriebenen Zahlen als Spaltennamen, wodurch die Übersetzung zwischen den beiden (und das anschließende Drucken) ziemlich einfach wird.

Der Hauptversuch beim Golfen bestand darin, die ausgeschriebenen Zahlen für 20-49 zu erstellen, wahrscheinlich viel mehr, um hier zu golfen.

Ich habe versucht as.matrix, den data.frame nur mit den Zahlen zu drucken, aber es verbleibt noch ein Matrix-Header. Hoffentlich ist das in Ordnung.

Ungolfed:

ones <- c("","one","two","three","four","five","six","seven","eight","nine") 
teens <- c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen")
tens <- c("twenty","thirty","forty") 

p=""
for(i in tens){
  for(j in ones){
    p=paste0(p, i, j," ")
  }
}

nums <- 1:50
as.data.frame(t(nums))
names(nums) <- c(ones[-1], teens, as.vector(strsplit(p, " ")[[1]]), "fifty")
f <- function(x){
  if(is.numeric(x)){
    names(nums)[1:x]
  } else {
    matrix(nums[1:nums[x]], dimnames = NULL)
  }
}

Leichte Besserung bis 359 Byteso=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
zählt

@count sieht nach einer großen Verbesserung aus! Ich kann nicht scheinen, herauszufinden, wo die Funktion ist, oder wo Sie ein Argument nehmen würden.
BLT

2

C 342 331 Bytes

char*x[]={"teen","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thir","four","fif","twenty","thirty","fourty","fifty"};void main(int z,char**i){for(z=1;z<=atoi(i[3]);z++)printf("%s%s%s\n",z<16?x[z]:z<20?z^18?x[z-10]:"eigh":x[z/10+14],z>20&&z%10?"-":z>12&&z<20?*x:"",z>20&&z%10?x[z%10]:"");}

Probieren Sie es online!


Meine Lieblingssprache :)
Albert Renshaw

1
Du brauchst eigentlich nicht die 1 bis 1; Alles, was dieser Codegolf benötigt, ist Ihr drittes Argument. Die ersten beiden sind immer "1 und durch" (oder "eins und durch")
Albert Renshaw

@ AlbertRenshaw Guter Anruf! Danke :)
Ahemone

1

SAS, 179

%macro c(n);%let f=words.;%if%length(&n)>2%then%do;%do c=1%to 50;%if%qsysfunc(putn(&c,&f))=&n%then%let n=&c;%end;%let f=2.;%end;%do i=1%to &n;%put%sysfunc(putn(&i,&f));%end;%mend;

Die Ausgabe wird durch Zeilenumbrüche getrennt in das Protokoll geschrieben. SAS hat ein eingebautes Format für die Umwandlung von Ziffern in Wörter, was ein großer Vorteil für diese Herausforderung ist, aber ärgerlicherweise fehlt es an Informationen für das Umkehren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.