Duolingo, die App zum Sprachenlernen, hat eine Menge zu bieten, aber es gibt ein großes Problem, das mich verrückt macht. Es zeigt mir an, wie viele Tage hintereinander ich die App mit einer Meldung verwendet habe, dass Sie sich in einer siebentägigen Phase befinden. Wenn man die Silbentrennung beiseite lässt und festlegt, ob die Zahl richtig geschrieben werden soll, funktioniert dies für die meisten Zahlen gut, ist aber unbestreitbar falsch, wenn es heißt, Sie haben eine 8-Tage-Pause! Ich benutze es nicht, um Englisch zu lernen, aber dies ist immer noch ein unglückliches Verhalten für eine Sprach-App.
Sie helfen dem Duolingo-Team, indem Sie ein komplettes Programm oder eine Funktion schreiben, die herausfindet, ob einer bestimmten Nummer ein oder ein vorangestellt werden sollte . Eine Zahl wird durch voran a , wenn die Aussprache in der gesprochenen Englisch beginnt mit einem Konsonanten oder semivowel Ton und vorangestelltem ein , wenn die Aussprache mit einem Vokallaut beginnt. Daher sind die einzigen Zahlen, denen ein vorangestellt ist, diejenigen, deren Aussprache mit acht , elf , achtzehn oder achtzig beginnt .
Vermutlich hat das Duolingo-Entwicklerteam diesen Fehler behoben, weil in der App nicht mehr genügend Speicherplatz für mehr Quellcode vorhanden ist. Sie müssen diesen Code daher so kurz wie möglich halten, damit sie ihn einschleusen können.
Ihr Code muss eine Ganzzahl von 0 bis 2.147.483.647 annehmen und a
oder ausgeben an
. Ein abschließender Zeilenumbruch ist optional. Für die Zwecke dieser Herausforderung wird 1863 als eintausendachthundertdreiundsechzig und nicht achtzehnhundertdreiundsechzig gelesen .
Testfälle:
0 → a
8 → an
11 → an
18 → an
84 → an
110 → a
843 → an
1111 → a
1863 → a
8192 → an
11000 → an
18000 → an
110000 → a
180000 → a
1141592 → a
1897932 → a
11234567 → an
18675309 → an
Antworten:
Pyth, 23 Bytes
Dies wählt aus, wie viele Buchstaben am Ende abgeschnitten werden sollen,
"an"
indem geprüft wird, ob der erste Buchstabe kein Buchstabe ist8
und ob die erste Ziffer der Zahl in der Basis 1000 weder 11 noch 18 ist. Der resultierende Boolesche Wert gibt die Anzahl der Zeichen an, von denen abgeschnitten werden soll das Ende.quelle
Python 2, 60 Bytes
Eine anonyme Funktion. Fügt ein hinzu,
n
wenn:quelle
n
> = '8' `` spart drei Bytes.GNU Sed, 32
Die Punktzahl enthält +1 für die
-E
Option zu sed.Probieren Sie es online aus.
an
a
Vielen Dank an @ MartinBüttner für seinen Retina-Ansatz , der 10 Bytes gespart hat.
quelle
Shell + BSD-Spiele, 30
Eingang von STDIN gelesen.
number
konvertiert eine Dezimalzeichenfolge in Wörter. Es ist dann einfach zu entscheiden, ob das Ergebnis mit beginnt oder nichte
.quelle
Retina , 27 Bytes
Dies unterscheidet sich nicht sehr von der Retina-Antwort von DigitalTrauma, aber sie bestanden darauf, dass ich dies selbst poste.
Probieren Sie es online aus.
Der erste reguläre Ausdruck ersetzt alle relevanten Zahlen mit
an
und der zweite alle verbleibenden Zahlen mita
. Dies funktioniert für die gleichen Bytes:quelle
C ++, 101
Dies ist meine Herausforderung, daher ist dies keine wettbewerbsfähige Antwort. Ich wollte nur sehen, wie kurz ich es in C ++ bekommen könnte. Zeichenfolgenoperationen sind einfach zu ausführlich, daher wird dies mit Mathematik durchgeführt. Ich habe das Gefühl, dass es eine Möglichkeit geben muss, diesen Zustand zu verringern, aber ich kann es nicht ganz herausfinden.
quelle
Mathematica, 53 Bytes
Eine Lösung mit String-Verarbeitung wäre länger.
quelle
PostScript,
119113 ZeichenMit Testcode:
quelle
JavaScript (ES6)
70614638 BytesCommunity-Wiki, weil die aktuelle Lösung so anders ist als mein Original. Vielen Dank an alle!
Demo: http://www.es6fiddle.net/iio40yep/
quelle
eval
Tricks einzelne Ausdrücke vergessen ! Ich wusste, dass es auch einen besseren regulären Ausdruck geben musste, aber ich konnte nichts herausfinden, was kürzer war. Danke!n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'
( es6fiddle.net/iiehl1ex ). Es ist 46 Bytes lang.8
, ob er mit beginnt1[18]
und ob die Länge der Zahlen ist2 * (3n)
. Grundsätzlich handelt es sich um Ihren gesamten Code, jedoch innerhalb eines regulären Ausdrucks.Im Ernst,
4340 BytesDie Strategie besteht hier darin, nur die 1, 2 oder 3 höchstwertigen Stellen zu betrachten, indem die Eingabe durch den größten Wert dividiert
10^(3n)
wird, der kleiner als die Eingabe ist.Probieren Sie es online aus
Erläuterung:
quelle
Retina , 34
Direkte Übersetzung meiner sed Antwort :
Probieren Sie es online aus.
Ein Byte gespart dank @Timwi.
quelle
Perl 6 ,
3130 Bytes(Perl 6 wird
[ ]
in regulären Ausdrücken für Nichterfassung( )
und<[ ]>
für Zeichensätze verwendet.)Verwendungszweck:
quelle
PostScript, 109 Bytes
Der Code überprüft, ob die Nummer mit bestimmten Präfixen beginnt. Das Präfix
8
wird immer geprüft ( acht , achtzig etwas , acht-hundert-und ), aber11
und18
( elf und achtzehn ) überprüft nur , wenn die Anzahl der Ziffern ist ein Vielfaches von 3 plus 2.Wir beginnen mit einem vorläufigen Ergebnis von
a
und wenn ein Präfix gefunden wird, wird das Ergebnis durch ersetztan
.anchorsearch
wird verwendet, um zu vermeiden, dass ein Präfix aus der Zeichenfolge extrahiert wird. Selbst wenn eine Übereinstimmung gefunden wird, werden die restlichen Präfixe überprüft. Warum 5 Byte für die verschwendenexit
? -, aber da die ursprüngliche Zeichenfolge durch ersetzt wird, werdena
wir mit Sicherheit keine falsch positiven Ergebnisse erhalten.Rückgabe der
a
-oderan
Ergebnis auf dem Operandenstapel , anstatt es zu drucken, entfernen Sie den nacheilenden=
(resultierende Länge: 107 Bytes).Testcode:
quelle
PostScript (mit binären Token), 63 Bytes
Das
’
sind Bytes mit dem Wert 146 (dezimal),¥
ist ein 165 und$
ist ein 3. Alle anderen sind druckbare 7-Bit-ASCII-Zeichen.Dies ist dasselbe wie meine PostScript-Version [pure ASCII], verwendet jedoch binäre Token, mit denen sich die Gesamtlänge verringern lässt. Ich poste es aus 3 Gründen separat:
quelle
Python 3,
11093917674706564 BytesHier ist eine lange, aber eine einfache.
Edit: Korrigiert mit dank isaacg . Nach den Vergleichen wurden einige Leerzeichen gespeichert. Viele Bytes gespart dank Timwi , Mego , Benpop und Alissa .
oder für die gleiche Anzahl von Bytes.
Ungolfed:
quelle
843
"achthundertdreiundvierzig", die sein solltean
.(-~len(n)%3)<1
stattlen(n)%3==2
?(n[:2]=="11"or n[:2]=="18")
auf gekürzt werden"118".contains(n[:2])
?n[:2]in"118"
?Java 10, 102 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
Japt ,
2827 BytesProbieren Sie es online!
Ausgepackt und wie es funktioniert
quelle
1e3
mitA³
GNU
sed -r
+ BSDnumber
, 34 BytesZuerst konvertieren wir in englische Zahlen. Löschen Sie dann alles außer einem möglichen Anfangsbuchstaben
e
und setzen Sie das Präfix aufa
. Dann konvertieren Sie diee
(falls vorhanden) zun
. Der einzige Trick beim Golfen ist es, den optionalen zu findene
in der ersten Auswechslung zuzuordnen, damit wir das Muster in der folgenden Zeile wiederverwenden können.Demo
quelle
TeaScript , 35 Bytes
Probieren Sie es hier aus.
Erläuterung
quelle
Python 2.7, 66
Offensichtlich nicht so kurz wie der
lambda
eine.quelle
05AB1E , 26 Bytes
Kann wahrscheinlich ein bisschen mehr golfen werden, aber es funktioniert.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
QuadS , 32 Bytes
Probieren Sie es online!
quelle
Stax , 25 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
Leerzeichen , 243 Bytes
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebung hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Programm stoppt mit Fehler: Kein Exit gefunden.
Erklärung im Pseudocode:
quelle
C ++,
8079 BytesEs stellte sich heraus, dass 4 Bytes kürzer sind, um explizit gegen 8xx und 8x zu testen, als eine andere
/=10
Schleife zu haben :Demo
quelle
i/=1000
es aber seini/=1e3
und kann es alles&&
werden&
?&&
kann nicht alles sein&
, denn Subtraktion liefert ganze Zahlen und keine Booleschen Werte - zB19-11
ist 8 und19-18
ist 1; siehe, das8 && 1
ist wahr, aber8 & 1
falsch. Wir könnten verwenden ,&
aber wir müssen sich ändern-
zu!=
und auch Klammern hinzuzufügen.&
funktioniert hier tatsächlich nicht, mein Schlimmes. Übrigens, warum fügst du deiner Antwort nicht auch einen TIO-Link hinzu?Perl 5
-p
, 26 BytesProbieren Sie es online!
quelle
Perl,
715549 BytesIch wusste, dass der ternäre Operator eines Tages helfen würde ...
Lass mich das zusammenfassen.
$_=<>
akzeptiert eine Zahl als Eingabe.$_=...
Block setzt den Wert von,$_
nachdem er verwendet wurde....?...:...
ist der ternäre Operator. Wenn die Bedingung (erstes Argument) wahr ist, gibt sie das zweite Argument zurück. Andernfalls wird der dritte zurückgegeben./^8/||(/^1[18]/&&length%3==2)
prüft, ob die Zahl mit 8 beginnt oder mit 11 oder 18 beginnt (1[18]
akzeptiert entweder) und eine Länge mod 3 von 2 hat.$_
steht aufan
. Ansonsten ist es auf eingestellta
.$_
(entwedera
oderan
) mit ausgedrucktsay
.Änderungen
quelle
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';say
spart ein paar Bytes. (Obwohl die zu vergleichende Zahl davon abhängt, was Ihr Zeilenvorschubzeichen ist, ändert dies nichts an der Anzahl der Bytes.)length($_)
zulength
(oder die Pars zumindest fallen) , aber das funktioniert nicht aus irgendeinem Grund für mich.($_)
bekommen$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say
, das sind nur 49 Bytes.-p
statt$_=<>
undsay
,y///c
stattlength
, und Ablegen der Anführungszeichena
undan
:perl -pe'$_=/^8/||/^1[18]/&&y///c%3==2?an:a'
(34 Bytes + 1 für-p
). Beachten Sie, dass die Eingabe nicht mit einer Neuen - Zeile enden:echo -n 11 | perl -pe'...'
. Dies behebt auch einen Fehler:length%3==2
Wird analysiert alslength(%3)==2
, nicht alslength($_)%3==2
, und gibt immer false zurück.Pyth,
2931Kehrt die Zeichenfolge um, teilt sie in Dreierabschnitte auf, kehrt sie erneut um und wählt dann die entsprechende Endung aus.
quelle
111
- es gibtan