Jest to dość proste wyzwanie golfowe. Twój program, mając ciąg ASCII, parsuje ten ciąg na dwa ciągi, które oceni. Jeśli drugi ciąg jest „późniejszy” niż pierwszy, zwróci 1, jeśli jest „wcześniejszy” niż pierwszy, zwróci -1, a jeśli są takie same, zwróci 0. To wyjaśnij, co oznaczają „później” i „wcześniej”, spójrzmy na kody znaków ASCII. Musisz porównać każdy znak ciągu, traktując każdy z nich jako cyfry liczby. Później odnosi się do większej liczby, występującej po mniejszej liczbie. Ciągi zostaną sformatowane za pomocą znaku łącznika, aby oddzielić dwie grupy wejściowe.
Spójrz na ten przykład:
7-9
jako dane wejściowe powinny powrócić1
.
7
konwertuje na kod ASCII55
i9
konwertuje na kod ASCII57
.Jak
57
następuje numerycznie po55
,9
jest późniejszy niż7
.
Inny przykład:
LKzb-LKaj
jako dane wejściowe powinny powrócić-1
Sekwencjami kodu ASCII do tego są
76-75-122-98
i76-75-97-106
Jest to wyzwanie dla golfa kodowego, a liczba bajtów określa sposób punktowania wpisów.
Dowolne dane wejściowe z 95 drukowalnych znaków ASCII są akceptowane, z wyjątkiem spacji i łączników dla wszystkiego oprócz oddzielenia danych wejściowych. Ponadto nie można zagwarantować, że ciągi są tej samej długości.
Powodzenia!
EDYCJA: Aby być bardziej zrozumiałym, każdy znak należy traktować jak cyfrę w liczbie. W tym przykładzie LKzb-LKaj
, choć j
jest późniejszy niż b
, z
jest późniejszy a
, a ponieważ jest to cyfra bardziej znacząca, ma pierwszeństwo. Podany ciąg będzie zawsze miał co najmniej 3 znaki, co wyeliminuje puste ciągi z zakresu tego problemu.
EDYCJA: Oto kilka przypadków testowych, do twojej pomocy:
A-9
->-1
11-Z
->-1
3h~J*-3h~J*
->0
Xv-Y0
->1
źródło
11-Z
->-1
nie ma sensu, biorąc pod uwagę obecne sformułowanie pytania.Z
(90) jest większy niż1
(49) i jest najbardziej znaczącą literą. Wyjaśnij, w jaki sposób porównywane są łańcuchy o różnych długościach.A-AA
?11>Z
w twoich przykładach kiedy1<Z
. Musi istnieć pewne niezdefiniowane zachowanie związane z łańcuchami o różnych długościach lub przykład jest zły.~
na 126, a następnie zwiększaj kolejną cyfrę o jedną, zwracając początkową cyfrę do!
. Każdy wzrost najbardziej znaczącej cyfry odpowiada inkrementacji drugiej najbardziej znaczącej cyfry o 127.Odpowiedzi:
Pyth - 11 bajtów
Łatwy, używa
._
znaku, aby uzyskać znak iC
uzyskać kody znaków .Wypróbuj online tutaj .
Zestaw testowy .
źródło
CJam, 12 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Java,
86118Bardzo dziwny sposób porównywania ciągów. Dokonano szybkiej poprawki, więc przechodzi dodatkowe przypadki testowe, później będzie szukał golfa.
Dzięki Vartan w komentarzach za
signum
sugestieźródło
return s[0].compareTo(s[1]);
11-Z
powrotu-1
, zwraca1
."A".compareTo("Z")
zwraca-25
. Niestety.i = a!=b ? b-a : s[1].compareTo(s[0]);
Wydaje mi się, że nie rozumiem ... Może możesz użyć Math.signum i uratować się deklarując i;Perl, 31 bajtów
30 bajtów + 1 bajt dla
-p
. Akceptuje dane wejściowe STDIN.Wyjaśnienie
Gdy operandy
cmp
mają różne długości, takie jakchicken
iegg
, są wyrównane w następujący sposób:więc
egg
>chicken
(\0
jest bajtem zerowym). Ale chcemy, aby były one wyrównane w następujący sposób:tak, że
chicken
>egg
.Aby to zrobić, łączymy je, raz
chicken
przedegg
i razegg
przedchicken
:Teraz, gdy nasze dwa ciągi są tej samej długości, usuwamy wiodące słowo za pomocą XOR, aby uzyskać:
A teraz możemy użyć,
cmp
aby znaleźć, co było pierwsze. (Tam powiedziałem!)źródło
Python 2, 88 znaków
cmp
nie robi tego dobrze, gdy masz dwa łańcuchy o różnych długościach, więc muszę wypełnić oba je znakiem null (któryord
konwertuje na0
), aby obsłużyć tę sprawę. Niestety, dodało to około 35 znaków, a teraz są teraz dwie linie zamiast jednej, ponieważ potrzebuję zarówno długości danych wejściowych, jak i iteracji.źródło
1-2
który powinien zwrócić1
zwraca-1
. Sprytna praca.11-A
, która powinna zwrócić-1
, zamiast zwracać1
w tym przykładzie.R, 54 bajtów
Wymaga to biblioteki pracma. Dzieli ciąg wejściowy na
-
. Prawo uzasadnia ciągi. Ranguje je i robi różnicę.Tak więc dla 11-7 otrzymujemy ciągi „11” i „7”. Ich ranga to [2, 1]. Różnica wynosi -1. Dla 3h ~ J * -3h ~ J * otrzymujemy „3h ~ J *” i „3h ~ J *”. Ich ranga to [1,5, 1,5] z różnicą 0.
Przykłady testowe
źródło
CoffeeScript,
143140139Oto jsfiddle z wynikami (spójrz w konsolę)
źródło
PERL,
4636 bajtówKonwertuje listę argumentów na ciąg znaków, dzieli myślnik na lewy i prawy argument bez spacji, a następnie zwraca wywołanie cmp.
źródło
"@ARGV"=~/-/;print$`cmp$'
(niesprawdzony)cmp
, ale nie działa, gdy długości łańcuchów są różne."A" cmp "9"
wynosi 1, podczas gdy"11" cmp "Z"
wynosi -1, chociaż oba wejścia powinny zwrócić tę samą wartość dla tego wyzwania.Python 3, 84 bajtów
Podziel ciąg znaków przez
"-"
. Konwertuj ciągi Unicode na ciągi bajtów, a następnie interpretuj te ciągi bajtów jako liczby całkowite big-endian. Na koniec dokonaj porównania - (nie) na szczęściecmp
nie jest już dostępne w Pythonie 3.Python 2, 69 bajtów
źródło
print
icmp
.Python 2, 79 bajtów
Całkiem proste rozwiązanie i łatwe do zrozumienia. Porównuje długości strun, a następnie porównuje struny leksykograficznie.
Wypróbuj tutaj
źródło
perl5, 64
Po prostu uruchom go z wiersza poleceń. chociaż nowa linia wyglądałaby lepiej, ale kosztuje to 1 znak.
Ta dłuższa wersja poprawnie obsługuje niedopasowane długości.
źródło
/-/,$_=$`cmp$'
byłoby łatwiejsze i możesz-aF-
trochę pominąć . Ponadto liczę to jako 20 (16 dla$_=$F[1]cmp$F[0]
i 4 dlapaF-
zapisanych w pliku i uruchomionych jakoperl -paF- file.pl
).cmp
nie działa, gdy dwa ciągi mają różną długość, jak w przypadku11-Z
./-/;$_=length$'<=>length$`||$' cmp$`
i-p
. ($`
przechowuje wszystko przed dopasowaniem wyrażenia regularnego,$'
przechowuje wszystko później.) Korzystanie zmap
faktycznie kosztuje więcej bajtów niż tylkolength
dwukrotne wywołanie .F #, 53
Ma to postać anonimowej funkcji (lambda), więc musisz ją wkleić i podać parametr bezpośrednio po nim (lub używając notacji potokowej). Na przykład (w FSI):
źródło
JavaScript ES6,
4643 bajtówźródło
11-Z
powinien zwrócić,-1
ale zwraca1
.'11'>'Z'
gdy'11'<'ZZ'
nie ma pytania o to, jak porównać ciąg o różnych długościach lub jaką wartość ma pusty ciąg.Ruby, 59 bajtów
źródło
05AB1E ,
12119 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło