Chciałbym wygenerować (jako wynik funkcji lub po prostu wynik programu) porządkowy sufiks dodatniej liczby całkowitej połączonej z liczbą.
Próbki:
1st
2nd
3rd
4th
...
11th
12th
13th
...
20th
21st
22nd
23rd
24th
I tak dalej, z sufiksem powtarzającym początkowy wzór 1-10 co 10 aż do 100, gdzie wzór ostatecznie zaczyna się od nowa.
Dane wejściowe to liczba, a dane wyjściowe ciąg porządkowy, jak pokazano powyżej.
Jaki jest najmniejszy algorytm do tego?
11
jak dane wejściowe i wyjściowe np.11th
? Czy każda liczba na wejściu znajduje się w osobnym wierszu i czy numery wyjściowe powinny być również w osobnych wierszach? I czy musimy obsłużyć więcej niż jeden wiersz danych wejściowych?11
jako danych wejściowych i11th
wyjściowych. Nie mam nic przeciwko, jeśli przetwarza wiele linii, ale miałem na myśli przetworzenie tylko jednej liczby.Odpowiedzi:
Perl, 37 + 1 znaków
Jest to podstawienie wyrażenia regularnego, które dołącza odpowiedni sufiks porządkowy do dowolnej liczby, po
$_
której nie występuje już litera. Aby zastosować go do danych wejściowych pliku, użyjp
przełącznika wiersza polecenia:Jest to kompletny program Perla, który odczytuje dane wejściowe ze standardowego wejścia i zapisuje przetworzone dane wyjściowe na standardowe wyjście. Rzeczywisty kod ma 37 znaków, ale
p
przełącznik liczy się jako jeden dodatkowy znak .Przykładowe dane wejściowe:
Wynik:
Liczby, po których następują litery, zostaną zignorowane, więc ponowne podanie wyników przez filtr nie zmieni tego. Spacje, przecinki i kropki między liczbami nie są traktowane specjalnie, więc zakłada się, że oddzielają liczby jak każdą inną interpunkcję. Tak np .
3.14159
Staje się3rd.14159th
.Jak to działa?
Po pierwsze, jest to globalna zamiana wyrażeń regularnych (
s///g
). Dopasowywanym wyrażeniem regularnym jest1?\d\b
, gdzie\d
pasuje do dowolnej cyfry i\b
jest twierdzeniem o zerowej szerokości pasującym do granicy między znakiem alfanumerycznym i niealfanumerycznym. W ten sposób1?\d\b
dopasowuje ostatnią cyfrę dowolnej liczby plus poprzednią cyfrę, jeśli tak się dzieje1
.W podstawieniu, które z powodu
/e
przełączenia jest oceniane jako kod Perla , bierzemy dopasowany segment łańcucha ($&
) i dołączamy.
do niego sufiks uzyskany przez użycie go$&
jako indeksu liczb całkowitych na liście(0,st,nd,rd)
; jeśli ten sufiks jest zerowy lub nieokreślony (tj. gdy$&
wynosi zero lub więcej niż trzy),||
operator zastępuje goth
.Edycja: Jeśli dane wejściowe są ograniczone do jednej liczby całkowitej, wystarczy 35-znakowe rozwiązanie:
źródło
g
podstawienie, jeśli podasz, że każda liczba musi znajdować się w osobnej linii. Pozwoli to również zmienić granicę słowa na$
. Ale ogólnie +1, cholernie sprytne rozwiązanie.Python 2, 49 bajtów
Anonimowa funkcja. Pełny program będzie liczona na 55 bajtów.
'tsnrhtdd'[i::4]
koduje przyrostkówth st nd rd
dla wartościi
od 0 do 3. Biorąc pod uwagę to wszystko, czego potrzebujemy jest sposobem odwzorowywania wartościn
do indeksu odpowiedniego przyrostkai
. Proste wyrażenie, które działa(n%10)*(n%10<4 and 10<n%100<14)
. Możemy to łatwo skrócić, upuszczając pierwszy zestaw nawiasów i obserwując, żen%5
daje to takie same wyniki, jakn%10
w przypadku wartościn
ze specjalnymi sufiksami. Przy odrobinie prób i błędów można również skrócić10<n%100<14
don%100^15>4
, który można połączyć z drugim, aby zaoszczędzić jeszcze więcej bajtów.źródło
Python, 68 znaków
źródło
`i`+"tsnrhtdd"
. W przeciwnym razie właśnie to właśnie otrzymałem.Mathematica
3945 bajtówUwaga: W najnowszych wersjach Mathematica pytanie o
nth
częśćp
, gdziep
jest niezdefiniowana, generuje komunikat o błędzie, ale mimo to zwraca poprawną odpowiedź. Dodałem,Quiet
aby zapobiec drukowaniu komunikatu o błędzie.Stosowanie
Jak to działa
SpokenString
wypisze dowolne poprawne wyrażenie Mathematica, które może być wypowiedziane. Poniżej znajdują się dwa przykłady z dokumentacji SpokenString ,Teraz, na przykład, pod ręką
Przedstawmy powyższy ciąg jako listę słów:
i weź drugi element ...
źródło
p
zdefiniowane? EDYCJA: nieważne, widzę, jak tego używasz; niestety to nie działa w moim systemie. : - /SpokenString @ p[[117]]
dane wyjściowe" part 117 of p"
.SpokenString
zostaje zmieniony od czasu do czasu. Nie zdziwiłbym się, że ten kod ( codegolf.stackexchange.com/questions/8859/... ) również nie działa w wersji 7. BTW, to nie miało być trwałe rozwiązanie.Ruby, 60 lat
Nie jest tak dobry, jak wpis Perla, ale pomyślałem, że będę pracować nad umiejętnościami Ruby.
Funkcja przyjmuje jeden argument liczby całkowitej
n
i zwraca ciąg znaków w postaci liczby porządkowej.Działa zgodnie z następującą logiką:
Jeśli cyfra dziesiątek jest 1 lub cyfra jedności jest większa niż 3, użyj przyrostka „th”; w przeciwnym razie znajdź przyrostek z tablicy ['th', 'st', 'nd', 'rd'], używając ostatniej cyfry jako indeksu.
źródło
o(113)
jest"113rd"
, powinno być"113th"
. Kontrola dziesiątek cyfr nie uwzględnia liczb zawierających więcej niż dwie cyfry.%10
żeby to zrekompensować. Dodano 3 postacie. (%10
Wydaje mi się, że wydaje się, że wystarczy go skrócić, ale nie mogę znaleźć rozwiązania)10
?n%10
jest lepsze.JavaScript (ES6)
5044 bajtów (nie konkuruje)Notatki
źródło
a+
->a+=
, usuń nawiasy,\d
->.
, usuń[0]
, a jeśli weźmiesz numer jako ciąg:a.match`1?.$`
zamiast/1?.$/.exec(a)
.JavaScript,
6871Wspólny wysiłek z ItsCosmo.
EDYCJA: Nie działał poprawnie z liczbami> 100
źródło
function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
i możesz obniżyć go do 54, jeśli z przyjemnością używasz grubej notacji:o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
Golfscript, 34 znaki
źródło
Haskell, 95 znaków
Testowanie:
Musi być załadowany z -XNoMonomorphismRestriction.
źródło
JavaScript, 64 znaki (ES3) lub 47 znaków (ES6)
ES3 (64 znaki):
function(n){return n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'}
ES6 (47 znaków):
n=>n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
Wyjaśnienie
Wyrażenie
n % 100 >> 3 ^ 1
przyjmuje wartość 0 dla każdego pozytywnegon
zakończenia z cyframi08
-15
. Tak więc na każdyn mod 100
kończy się11
,12
lub13
powraca odnośników arrayundefined
, co prowadzi do przyrostekth
.Dla każdej dodatniej
n
końcówki w innych znaków niż08
-15
, ekspresjan % 100 >> 3 ^ 1
ma wartość dodatnią liczbę całkowitą, opierając się na ekspresjin % 10
dla odnośnika tablicy, powrótst
,nd
lubrd
nan
którym kończy się1
,2
albo3
. W przeciwnym razieth
.źródło
n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
.n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"
, zaadaptowana z tego postu .APL (Dyalog Unicode) ,
3836 bajtówDzięki ngn za naprawienie błędu przy zachowaniu liczby bajtów.
Anonimowa ukryta funkcja prefiksu. Wymaga
⎕IO
( I ndex O rigin) ustawionej na0
, co jest domyślne w wielu systemach. Działa nawet dla 0!Wypróbuj online!
{
…}
Anonimowa lambda;⍵
jest argumentem:⍳4
Pierwsze cztery ɩ ndices;[0,1,2,3]
10↑
weź dziesięć pierwszych elementów, wypełniając je zerami:[0,1,2,3,0,0,0,0,0,0]
⊂
dołącz, aby traktować jako pojedynczy element;[[0,1,2,3,0,0,0,0,0,0]]
1 0 8\
rozwiń do jednej kopii, kopii prototypowej (zero), osiem kopii;[[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 więcej)
[0,1,2,3,0,0,0,0,0,0]]
∊
ε nlist (spłaszczyć);[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 więcej)
0,1,2,3,0,0,0,0,0,0]
⍵⌽
cyklicznie obracaj w lewo o tyle kroków, ile wskazuje argument⊃
wybierz pierwszą liczbę (tj. argument-mod-100-ta liczba)2×
pomnożyć przez dwa, że (daje0
,2
,4
, a6
)'thstndrd'↓⍨
upuść tyle znaków z tego ciągu2↑
weź dwie pierwsze pozostałe postacie⍕,
połącz z tym argument strunowyźródło
⍕,{2↑'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}
⎕io←0
. Widzę, że się zgadłeś, ale jest kilka 1,2,3,4,0,0 ... to powinno być 0,1,2,3,0,0 ...PowerShell, 92
Działa z jedną liczbą na wiersz danych wejściowych. Dane wejściowe są przekazywane przez rurociąg. Sprawienie, by działało tylko dla jednej liczby, nie zmniejsza rozmiaru.
źródło
J - 44 char
Nic w J? To skandal!
Wyjaśnione (zwróć uwagę, że
1
w J ma wartość logiczną true, a0
jest false):10 10(...)/@#:]
- Najpierw bierzemy argument (]
) i znajdujemy cyfrę dziesiątek i jedynek (10 10 #:
). Następnie wstawimy(...)
między nimi.(]*[(~:*])4>])
- W tym podwyrażeniu, ale nie w najgłębszym,]
wskaże cyfrę jedynek i[
cyfrę dziesiątek.[(~:*])4>]
-~:
oznacza J dla „nie-równy”, więc bierze to wynik4>]
(tj. czy jedna cyfra jest mniejsza niż 4) i mnoży ją przez wyniktens ~: (4>])
. Dlaczego ktoś miałby to robić? Rozważ następujące:tens
jest1
(jesteśmy nastolatkami) iones
wynosi mniej niż 4, więctens ~: (4>])
jest fałszywe, a wynikiem jest0*1
=0
.tens ~: (4>])
jest to prawda i wychodzimy1*1
=1
.ones
jest większa niż cztery, to4>]
była0
i nie ma już znaczenia, co stanie się z testem, wyjdziemy0
niezależnie od tego.[(~:*])4>]
jest tak,1
jeśli jesteśmy w {X0, X1, X2, X3}, ale nie w wieku nastolatków, i0
inaczej.]*
- Na koniec mnożymy ten wynik przez cyfrę jedynek. Tak więc ten produkt będzie,0
jeśli liczba zasługuje na'th'
przyrostek, w przeciwnym razie jego wartość.th`st`nd`rd{::~
- Używamy zmodyfikowanych jednocyfrowych od góry do indeksowania listy sufiksów.0
dostaje'th'
,1
dostaje'st'
i tak dalej.":,
- Na koniec weź oryginalny numer, przekonwertuj go na string (":
), a następnie dodaj do sufiksu.Użycie jest oczywiste, chociaż czasownik „tak jak jest” może przyjąć tylko jeden porządek, a nie listę.
źródło
C #, 62 bajty
Pełny program i weryfikacja:
źródło
||
się|
.Mathematica 29 + 5 = 34 bajty
+5 bajtów, ponieważ
Speak
funkcja musi zostać wywołana przed użyciem tego wbudowanego.Stosowanie
źródło
PHP, 151
Wiem, że ten program nie jest porównywalny z innymi. Po prostu miałem ochotę dać rozwiązanie.
źródło
foreach($s as $n){echo$n;
Scala 86
Scala 102:
102 również:
bez golfa:
źródło
OCaml
Jestem całkiem nowy w OCaml, ale to jest najkrótszy możliwy.
Utworzyłem funkcję n, która przyjmuje liczbę jako parametr i wykonuje pracę. Jest długi, ale pomyślał, że dobrze byłoby mieć funkcjonalny przykład.
źródło
if v>10 && v<14
? Nie znam się na ocaml, ale czy konieczne jest, abystring_v
zmienna była tak długa?K - 44 znak
Zdarza się, że jest to dokładnie tak długo, jak J i działa prawie w ten sam sposób.
Wyjaśniono:
x$:
- Najpierw konwertujemy operandx
na ciąg, a następnie przypisujemy go z powrotem dox
. Będziemy potrzebować jego powtórzenia ciągu później, więc robienie tego teraz zapisuje znaki..:'
- Konwertuj (.:
) każdą ('
) cyfrę z powrotem na liczbę.-2#0,
- Dodaj 0 na początku listy cyfr (w przypadku liczb jednocyfrowych), a następnie weź dwie ostatnie.{y*(y<4)*~1=x}.
- Użyj dwóch cyfr jako argumentówx
iy
do tej funkcji wewnętrznej, która zwraca,y
jeśliy
jest mniejsza niż 4 ix
nie jest równa 1, w przeciwnym razie 0.`th`st`nd`rd@
- Indeksuj listę przyrostków według tego wyniku.x,$
- Konwertuj sufiks z symbolu na ciąg i dołącz go do pierwotnego numeru.Stosowanie:
źródło
C -
9583 znakówDegolfed:
Moglibyśmy to zrobić
k=(n-1)%10
zamiast dodawać 9, ale dla n = 0 otrzymalibyśmy nieprawidłowe zachowanie, ponieważ w C(-1)%10
ocenia się na -1, a nie na 9.źródło
JavaScript, 75
źródło
PHP, 98 bajtów
11-13 bit mnie tutaj zabija. Działa dla dowolnej liczby całkowitej
$n >= 0
.Dla dowolnej liczby całkowitej
$n
:PHP, 103 bajty
źródło
Python,
8884 bajtówNie golfowany:
lambda x
definiuje anonimową funkcję z parametremx
.((('th','st','nd','rd')+('th',)*6)[int(x[-1])]
definiuje krotkę zakończeń dla liczb mniejszych niż 10,0-th
element jest dla0
i tak dalej. toif ('0'+x)[-2] != '1'
sprawdza czy istnieje11
,12
albo13
to naprawić, i dodaje następnieelse 'th'
dodajeth
zamiastst
,rd
albond
.źródło
JavaScript (Node.js) , 51 bajtów
Podziękowania dla @KevinCruijssen za poprawę odpowiedzi
Wypróbuj online!
Objaśnienie:
źródło
R ,
7976 bajtówPonieważ nie ma jeszcze rozwiązania R ... tutaj nie ma żadnych sztuczek, podstawowe indeksowanie wektorów, dzięki Giuseppe obniżył o 3 znaki. Poprzednio wypróbowany indeks:
[1+(x%%10)-(x%%100==11)]
i[1+(x%%10)*(x%%100!=11)]
.Wypróbuj online!
Z
substr
, 79 bajtów:Wypróbuj online!
źródło
1+x%%10*!x%%100==11
dla indeksu?!
przed wyrazem zamiast!=
.^
jest więc naprawdę wysoka%%
operatorzy Type, a następnie*/
i+-
i myślę,==
i&|
będzie dalej.!
ma dość niski priorytet, więc możesz użyć go jako separatora między operacjami.Python 2.7, 137 znaków
n
powinien być ciągiemWiem, że jestem już pokonany przez konkurencję tutaj, ale pomyślałem, że i tak przedstawię swój pomysł
generuje to po prostu listę par kluczy, wartości z zakończeniem liczby (jako łańcucha)
e
i porządkiemo
. Najpierw próbuje dopasować „th” (dlatego dlaczego nie użyłem słownika), aby przypadkowo nie zwrócił „st”, na przykład, gdy powinien być „th”. Będzie to działać dla każdej dodatniej liczby całkowitejźródło
n[-1]==e
jest o 5 znaków krótszy niżn.endswith(e)
C: 95 znaków
Śmiesznie długie rozwiązanie:
Musi być bardziej zniekształcony.
źródło
JavaScript, 75
źródło
Oracle SQL 11.2, 101 bajtów
źródło
JavaScript ES6, 52 znaki
źródło