Ich möchte (als Ergebnis einer Funktion oder einfach als Ausgabe eines Programms) das Ordnungssuffix einer positiven Ganzzahl erzeugen, die mit der Zahl verkettet ist.
Proben:
1st
2nd
3rd
4th
...
11th
12th
13th
...
20th
21st
22nd
23rd
24th
Und so weiter, mit dem Suffix, das alle 10 bis 100 das erste Untermuster von 1 bis 10 wiederholt, wo das Muster schließlich von vorne beginnt.
Die Eingabe wäre die Zahl und die Ausgabe die Ordnungszahl wie oben gezeigt.
Was ist der kleinste Algorithmus dafür?
11
zB als Eingabe und Ausgabe lesen sollten11th
? Befindet sich jede Zahl in der Eingabe in einer separaten Zeile und sollten sich die Ausgabenummern auch in separaten Zeilen befinden? Und müssen wir mehr als eine Eingabezeile verarbeiten?11
als Input und11th
als Output. Es macht mir nichts aus, wenn es mehrere Zeilen verarbeitet, aber ich hatte vor, nur eine einzige Zahl zu verarbeiten.Antworten:
Perl, 37 + 1 Zeichen
Hierbei handelt es sich um eine reguläre Ausdrücke-Ersetzung, bei der den Zahlen, auf
$_
die noch kein Buchstabe folgt, das entsprechende Ordnungssuffix angehängt wird . Verwenden Sie diep
Befehlszeilenoption wie folgt, um sie auf die Dateieingabe anzuwenden :Dies ist ein vollständiges Perl-Programm, das Eingaben aus stdin liest und die verarbeitete Ausgabe in stdout schreibt. Der tatsächliche Code ist 37 Zeichen lang, aber der
p
Schalter zählt als ein zusätzliches Zeichen .Beispieleingabe:
Ausgabe:
Zahlen, auf die bereits Buchstaben folgen, werden ignoriert. Wenn Sie also die Ausgabe erneut durch den Filter führen, wird dies nicht geändert. Leerzeichen, Kommas und Punkte zwischen Zahlen werden nicht speziell behandelt, daher wird davon ausgegangen, dass sie Zahlen wie jede andere Interpunktion trennen. So zB
3.14159
wird3rd.14159th
.Wie funktioniert es?
Erstens ist dies ein globaler regulärer Ausdruck (
s///g
). Die regexp wird abgestimmt ist1?\d\b
, in dem\d
übereinstimmt jede Ziffer und\b
eine Null-Breite Assertion die Grenze zwischen einem alphanumerischen passenden und einem nicht-alphanumerischen Zeichen. Somit1?\d\b
entspricht die letzte Ziffer einer beliebigen Zahl, plus die vorherige Stelle , wenn es passiert zu sein1
.In der Ersetzung, die aufgrund des
/e
Switches als Perl-Code ausgewertet wird , nehmen wir das übereinstimmende Zeichenfolgensegment ($&
) und hängen (.
) das Suffix an, das sich$&
selbst als ganzzahliger Index für die Liste ergibt(0,st,nd,rd)
. Wenn dieses Suffix Null oder undefiniert ist (dh wenn$&
Null oder größer als Drei ist), ersetzt der||
Operator es durchth
.Bearbeiten: Wenn die Eingabe auf eine einzelne Ganzzahl beschränkt ist, reicht diese 35-stellige Lösung aus:
quelle
g
die Substitution abzubrechen, wenn Sie angeben, dass sich jede Nummer in einer eigenen Zeile befinden muss. Außerdem könnten Sie dadurch die Wortgrenze ändern$
. Aber insgesamt +1, verdammt clevere Lösung.Python 2, 49 Bytes
Eine anonyme Funktion. Ein volles Programm würde mit 55 Bytes gezählt.
'tsnrhtdd'[i::4]
codiert die Suffixeth st nd rd
für Wertei
von 0 bis 3. Vor diesem Hintergrund ist es nur erforderlich, die Werte vonn
auf den Index des entsprechenden Suffixes abzubildeni
. Ein klarer Ausdruck, der funktioniert, ist(n%10)*(n%10<4 and 10<n%100<14)
. Wir können dies leicht verkürzen, indem wir den ersten Satz von Klammern fallen lassen und beobachten, dass sichn%5
dieselben Ergebnisse ergeben wien%10
für die Werten
mit den speziellen Suffixen. Mit einem bisschen von Versuch und Irrtum kann man verkürzen auch10<n%100<14
zun%100^15>4
, die mit den anderen bedingten verkettet werden können , um noch mehr zu sparen Bytes.quelle
Python, 68 Zeichen
quelle
`i`+"tsnrhtdd"
. Ansonsten ist dies die genaue Lösung, die ich gerade erhalten habe.Mathematica
3945 BytesHinweis: In neueren Versionen von Mathematica wird bei der Abfrage des
nth
Teils vonp
, wo nichtp
definiert, eine Fehlermeldung generiert, die richtige Antwort wird jedoch trotzdem zurückgegeben. Ich habe hinzugefügtQuiet
, um zu verhindern, dass die Fehlermeldung gedruckt wird.Verwendungszweck
Wie es funktioniert
SpokenString
Schreibt einen gültigen Mathematica-Ausdruck aus, wie er gesprochen werden könnte. Nachfolgend finden Sie zwei Beispiele aus der Dokumentation für SpokenString :Nun zum vorliegenden Beispiel:
Lassen Sie uns die obige Zeichenfolge als eine Liste von Wörtern darstellen:
und nimm das zweite Element ...
quelle
p
definiert EDIT: egal, ich sehe, wie du das verwendest; Leider funktioniert es nicht auf meinem System. : - /SpokenString @ p[[117]]
der Ausgabe" part 117 of p"
.SpokenString
wird von Zeit zu Zeit überarbeitet. Es würde mich nicht wundern, wenn dieser Code ( codegolf.stackexchange.com/questions/8859/… ) auch auf Version 7 nicht funktioniert. Übrigens war er keine dauerhafte Lösung.Rubin, 60
Es ist nicht so gut wie der Perl-Eintrag, aber ich dachte, ich würde an meinen Ruby-Fähigkeiten arbeiten.
Function akzeptiert ein ganzzahliges Argument
n
und gibt eine Zeichenfolge als Ordnungszahl zurück.Funktioniert nach der folgenden Logik:
Wenn die Zehnerstelle eine 1 ist oder die Einerstelle größer als 3 ist, verwenden Sie das Suffix 'th'; Andernfalls suchen Sie das Suffix aus dem Array ['th', 'st', 'nd', 'rd'] mit der letzten Ziffer als Index.
quelle
o(113)
ist"113rd"
, sollte sein"113th"
. Die Zehnerstellenprüfung berücksichtigt keine Zahlen mit mehr als zwei Stellen.%10
, um das zu kompensieren. 3 Zeichen hinzugefügt. (Ich glaube, es%10
scheint genug, wo es irgendwie verkürzt werden sollte, aber ich kann mir keine Lösung10
?n%10
es besser , eine Variable auf zu setzen .Javascript (ES6)
5044 Bytes (nicht konkurrierend)Anmerkungen
quelle
a+
->a+=
, entferne Klammern,\d
->.
, entferne[0]
und wenn du die Zahl als Zeichenkette nimmst:a.match`1?.$`
statt/1?.$/.exec(a)
.Javascript,
6871Gemeinsame Anstrengung mit ItsCosmo.
BEARBEITEN: Funktionierte nicht richtig mit Zahlen> 100
quelle
function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
Golfscript, 34 Zeichen
quelle
Haskell, 95 Zeichen
Testen:
Muss mit -XNoMonomorphismRestriction geladen werden.
quelle
JavaScript, 64 Zeichen (ES3) oder 47 Zeichen (ES6)
ES3 (64 Zeichen):
function(n){return n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'}
ES6 (47 Zeichen):
n=>n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
Erläuterung
Der Ausdruck wird
n % 100 >> 3 ^ 1
für alle positivenn
Endungen mit Ziffern08
- mit 0 bewertet15
. So kann jeden mod 100
endet in11
,12
, oder13
, die Rendite Lookup - Arrayundefined
, was zu einem Suffixth
.Für jede positive
n
Ende in anderen Stellen als08
-15
die Expressionsn % 100 >> 3 ^ 1
auswertet auf eine positive ganze Zahl ist , die Expression Aufrufn % 10
für Array - Lookup, Returnst
,nd
oderrd
fürn
deren Enden mit1
,2
, oder3
. Ansonstenth
.quelle
n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
.n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"
, aus diesem Beitrag angepasst .APL (Dyalog Unicode) ,
3836 BytesVielen Dank an ngn für die Behebung eines Fehlers bei gleichzeitiger Beibehaltung der Byteanzahl.
Anonyme implizite Präfixfunktion. Requires
⎕IO
( I ndex O rigin) auf gesetzt0
, was bei vielen Systemen Standard ist. Funktioniert sogar für 0!Probieren Sie es online!
{
…}
Anonymes Lambda;⍵
ist Argument:⍳4
ersten vier ɩ ndices;[0,1,2,3]
10↑
Nimm die ersten zehn Elemente davon und fülle sie mit Nullen auf:[0,1,2,3,0,0,0,0,0,0]
⊂
umschließen, um als einzelnes Element zu behandeln;[[0,1,2,3,0,0,0,0,0,0]]
1 0 8\
Erweitern auf eine Kopie, eine prototypische Kopie (alle null), acht Kopien;[[0,1,2,3,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
⋮ (5 weitere)
[0,1,2,3,0,0,0,0,0,0]]
∊
ϵ nlist (Abflachen);[0,1,2,3,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
⋮ (50 weitere)
0,1,2,3,0,0,0,0,0,0]
⍵⌽
Drehe zyklisch so viele Schritte nach links, wie das Argument angibt⊃
wähle die erste Zahl (dh die argument-mod-100'te Zahl)2×
multiplizieren zwei davon (gibt0
,2
,4
, oder6
)'thstndrd'↓⍨
Löschen Sie so viele Zeichen aus dieser Zeichenfolge2↑
nimm die ersten zwei der verbleibenden Charaktere⍕,
verketten das stringifizierte Argument dazuquelle
⍕,{2↑'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}
⎕io←0
. Ich kann sehen, dass Sie das erraten haben, aber es gibt ein paar 1,2,3,4,0,0 ..., die 0,1,2,3,0,0 ... sein solltenPowerShell, 92
Arbeitet mit einer Nummer pro Eingabezeile. Die Eingabe erfolgt über die Pipeline. Wenn es nur für eine einzelne Zahl funktioniert, wird die Größe nicht reduziert.
quelle
J - 44 Zeichen
Nichts in J? Das ist ein Skandal!
Erklärt (beachten Sie, dass
1
in J boolescher Wert true und0
false ist):10 10(...)/@#:]
- Zuerst nehmen wir das Argument (]
) und finden die Zehner- und Einerstelle (10 10 #:
). Dann werden wir(...)
zwischen den beiden einfügen .(]*[(~:*])4>])
- In diesem Unterausdruck, aber nicht im innersten,]
wird auf die Einerstelle und[
die Zehnerstelle gezeigt.[(~:*])4>]
-~:
Ist J für "nicht gleich", so nimmt dies das Ergebnis von4>]
(dh ob die eine Ziffer kleiner als 4 ist oder nicht) und multipliziert es mit dem Ergebnis vontens ~: (4>])
. Warum sollte jemand das tun? Folgendes berücksichtigen:tens
ist1
(wir sind im Teenageralter) undones
ist kleiner als 4,tens ~: (4>])
ist also falsch und das Ergebnis ist0*1
=0
.tens ~: (4>])
ist dies eindeutig wahr und wir steigen aus1*1
=1
.ones
größer als vier ist, dann4>]
war0
und es egal ist, was mit dem Test passiert, werden wir trotzdem0
rauskommen.[(~:*])4>]
sich1
sagen, ob wir uns in {X0, X1, X2, X3} befinden, aber nicht im Teenageralter und0
ansonsten.]*
- Schließlich multiplizieren wir dieses Ergebnis mit der Einerstelle. So wird dieses Produkt sein,0
wenn die Zahl ein'th'
Suffix verdient , sonst seinen Wert.th`st`nd`rd{::~
- Wir verwenden die modifizierte Einerstelle von oben, um die Liste der Suffixe zu indizieren.0
bekommt'th'
,1
bekommt'st'
und so weiter.":,
- Nehmen Sie zum Schluss die ursprüngliche Nummer, konvertieren Sie sie in eine Zeichenfolge (":
) und stellen Sie sie vor das Suffix.Die Verwendung ist offensichtlich, obwohl das Verb wie es ist nur eine Ordnungszahl annehmen kann, keine Liste.
quelle
C #, 62 Bytes
Vollständiges Programm und Überprüfung:
quelle
||
an|
.Mathematica 29 + 5 = 34 Bytes
+5 Byte, da die
Speak
Funktion aufgerufen werden muss, bevor diese integrierte Funktion verwendet werden kann.Verwendungszweck
quelle
PHP, 151
Ich weiß, dass dieses Programm nicht mit den anderen vergleichbar ist. Ich wollte nur eine Lösung finden.
quelle
foreach($s as $n){echo$n;
Scala 86
Scala 102:
102 auch:
ungolfed:
quelle
OCaml
Ich bin ziemlich neu in OCaml, aber dies ist die kürzeste, die ich bekommen konnte.
Ich habe eine Funktion n erstellt, die eine Zahl als Parameter verwendet und die Arbeit erledigt. Es ist lang, aber ich dachte, es wäre großartig, ein funktionales Beispiel zu haben.
quelle
if v>10 && v<14
? Ocaml ist mir nicht vertraut, aber muss diestring_v
Variable so lang sein?K - 44 Zeichen
Es kommt also vor, dass dies genau so lang ist wie das J und fast genauso funktioniert.
Erklärt:
x$:
- Zuerst konvertieren wir den Operandenx
in einen String und weisen diesen dann wieder zux
. Wir werden die Zeichenfolgenwiederholung später noch einmal benötigen. Dadurch werden jetzt Zeichen gespeichert..:'
- Wandle (.:
) jede ('
) Ziffer zurück in eine Zahl.-2#0,
- Fügen Sie der Ziffernliste eine 0 voran (bei einstelligen Zahlen) und nehmen Sie dann die letzten beiden.{y*(y<4)*~1=x}.
- Verwenden Sie die beiden Ziffern als Argumentex
undy
für diese innere Funktion, die zurückgibt,y
wenny
kleiner als 4 undx
nicht gleich 1 ist, andernfalls 0.`th`st`nd`rd@
- Indizieren Sie die Liste der Suffixe nach diesem Ergebnis.x,$
- Konvertieren Sie das Suffix von symbol in string und hängen Sie es an die ursprüngliche Nummer an.Verwendungszweck:
quelle
C -
9583 ZeichenEntgolfet:
Wir könnten tun,
k=(n-1)%10
anstatt 9 zu addieren, aber für n = 0 würden wir ein falsches Verhalten erhalten, weil in C(-1)%10
-1 ausgewertet wird, nicht 9.quelle
Javascript, 75
quelle
PHP, 98 Bytes
Das 11-13 Bit bringt mich hier um. Funktioniert für jede ganze Zahl
$n >= 0
.Für eine beliebige ganze Zahl
$n
:PHP, 103 Bytes
quelle
Python
8884 BytesUngolfed:
lambda x
Definiert eine anonyme Funktion mit Parameterx
.((('th','st','nd','rd')+('th',)*6)[int(x[-1])]
Definiert ein Tupel der Endungen für Zahlen unter 10, das0-th
Element ist für0
und so weiter. dieif ('0'+x)[-2] != '1'
überprüft , ob es gibt11
,12
oder eine13
zu beheben, und fügt dannelse 'th'
fügtth
stattst
,rd
odernd
.quelle
JavaScript (Node.js) , 51 Byte
Dank an @KevinCruijssen für die Verbesserung der Antwort
Probieren Sie es online!
Erklärung:
quelle
R ,
7976 BytesDa es noch keine R-Lösung gibt ... hier keine Tricks, grundlegende Vektorindizierung, dank Giuseppe 3 Zeichen weniger. Bereits ausprobierter Index:
[1+(x%%10)-(x%%100==11)]
und[1+(x%%10)*(x%%100!=11)]
.Probieren Sie es online!
Mit
substr
79 Bytes:Probieren Sie es online!
quelle
1+x%%10*!x%%100==11
für den Index?!
vor dem Ausdruck statt!=
.^
ist wirklich hoch, dann%%
Typ Operatoren, dann*/
und+-
und ich denke==
und&|
kommt als nächstes.!
hat eine recht niedrige Priorität, sodass Sie sie als Trennzeichen zwischen Operationen verwenden können.Python 2.7, 137 Zeichen
n
sollte eine Zeichenfolge seinIch weiß, dass mich die Konkurrenz hier bereits geschlagen hat, aber ich dachte, ich würde trotzdem meine Idee einbringen
Dies erzeugt im Grunde genommen eine Liste von Schlüsseln, Wertepaaren mit der Endung number (als Zeichenfolge)
e
und der Ordnungszahlo
. Es wird versucht, zuerst 'th' zu finden (daher habe ich kein Wörterbuch verwendet), damit es nicht versehentlich 'st' zurückgibt, zum Beispiel, wenn es 'th' sein sollte. Dies funktioniert für jede positive ganze Zahlquelle
n[-1]==e
ist 5 Zeichen kürzer alsn.endswith(e)
C: 95 Zeichen
Eine lächerlich lange Lösung:
Es muss mehr verstümmelt werden.
quelle
Javascript, 75
quelle
Oracle SQL 11.2, 101 Bytes
quelle
Javascript ES6, 52 Zeichen
quelle