To bardzo prosty algorytm, który z pewnością można rozwiązać w wielu różnych językach. W Hiszpanii dowody osobiste (znane jako DNI ) składają się z 8 cyfr i znaku kontrolnego. Znak kontrolny jest obliczany za pomocą następującego algorytmu: podziel liczbę przez 23, weź pozostałą część operacji i zastąp ją znakiem zgodnie z poniższą tabelą:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E
Jeśli DNI należy do osoby obcej mieszkającej w Hiszpanii, pierwsza cyfra zmienia się na X
, Y
lub Z
i to nazywa się NIE . W takim przypadku przed obliczeniem znaku kontrolnego wprowadza się następujące podstawienia:
X Y Z
0 1 2
Istnieje wiele kalkulatorów online, które pomagają uzyskać znak kontrolny, ale jak krótkie jest napisanie tego kodu? Napisz algorytm (program lub funkcję), który otrzyma a string
z numerem DNI (który zawsze będzie się składał z 8 znaków alfanumerycznych) i zwróci tylko jeden obliczony znak kontrolny i nic więcej (nowa linia jest akceptowana).
Uwagi:
- Nazwa DNI jest zawsze zapisywana wielkimi literami, ale w algorytmie możesz wybrać, czy dane wejściowe i wyjściowe mają być pisane wielkimi lub małymi literami, po prostu zachowaj spójność.
- W rzeczywistości niektóre NIE wydane przed 2008 rokiem mają 8 cyfr po
X
,Y
lubZ
, ale dla celów tej gry można uznać, że mają 7 cyfr, tak jak obecnie. - Możesz wziąć pod uwagę, że ciąg wejściowy zawsze będzie miał 8 znaków, ale jeśli nie są one w formacie „8 cyfr” ani w formacie „[XYZ] plus 7 cyfr”, musisz zwrócić błąd (do wyboru) lub po prostu rzucić wyjątek.
Przypadki testowe:
00000010 -> X (HRM Juan Carlos I's DNI number)
01234567 -> L
98765432 -> M
69696969 -> T
42424242 -> Y
Z5555555 -> W (Z=2)
Y0000369 -> S (Y=1)
A1234567 -> <Error code or exception>
1231XX12 -> <Error code or exception>
To jest golf golfowy , więc wygrywa najkrótszy kod dla każdego języka!
źródło
Odpowiedzi:
Python 3 , 83 bajty
Wypróbuj online!
-5 dzięki AlixEinsenhardt (od 99 do 94). -1 dzięki JonathanAllan .
źródło
str('XYZ'.index(n[0]))
przezstr(ord(n[0])-88)
i zaoszczędzić 5 bajtów-88
go%4
.Haskell ,
1079392 bajtyWypróbuj online!
źródło
Pyth,
3534 bajtówKod zawiera niektóre niedrukowalne znaki, więc oto odwracalny
xxd
zrzut heksowy.Używa małych liter .
Wypróbuj online. Zestaw testowy.
Wersja do druku
Wyjaśnienie
cz]1
dzieli wejście w pozycji 1, np ."y0000369"
na["y", "0000369"]
.>3G
dostaje 3 ostatnie znaki alfabetu"xyz"
.U3
pobiera zakres [0, 3 [ ,[0, 1, 2]
.X
odwzorowujexyz
na[0, 1, 2]
w podzielonej tablicy, np .["y", "0000369"]
na[1, "0000369"]
. Zastępuje to pierwszy znak, jeśli jest jednym z nichxyz
, pozostawiając ogon 7 znaków nietkniętych, ponieważ każdy ciąg 7 znaków nie może być równy jednemu znakowi.s
łączy tablicę z pustym łańcuchem, np .[1, "0000369"]
do"10000369"
.s
rzutuje ten ciąg na liczbę całkowitą, np ."10000369"
na10000369
. Zgłasza to błąd, jeśli w łańcuchu pozostaną jakieś dodatkowe znaki inne niż cyfry.%
...23
Pobiera wartość modulo 23, na przykład10000369
do15
.C"
…"
Konwertuje ciąg binarny z bazy 256 na liczbę całkowitą (około 3,06 × 10 26 )..P
…G
Pobiera permutację alfabetu z tym indeksem.@
pobiera prawidłowy znak z permutacji.źródło
MATL ,
6259 bajtówBłąd niepoprawnego wejścia to
A(I): index out of bounds
(kompilator działający w Octave) lubIndex exceeds matrix dimensions
(kompilator działający w Matlab).Wypróbuj online!
Wyjaśnienie
źródło
ES6,
83 8281 bajtówW akcji!
Tylko wielkie litery, kod błędu dla nieprawidłowych liczb to
undefined
.Jeden bajt zaoszczędzony dzięki Jonathanowi Allanowi.
Kolejny bajt uratowany dzięki Kudłatemu.
źródło
%4
zamiast tego zaoszczędzić bajt-88
.0
odcharCodeAt()
zbyt.Java 8,
154145104 bajtów-9 bajtów dzięki @ OliverGrégoire .
-41 bajtów dzięki @ OliverGrégoire ponownie, przyjmując dane wejściowe jako char-array (
char[]
).Jeśli dane wejściowe są niepoprawne, albo nie powiedzie się za pomocą a,
java.lang.NumberFormatException
albojava.lang.StringIndexOutOfBoundsException
.Wyjaśnienie:
Wypróbuj tutaj. (Nieprawidłowe przypadki testowe są otoczone przez try-catch, więc nie kończy się na pierwszym błędzie).
źródło
|
wyrażenia regularnego. Równieżint t=s.charAt(0)-88
it<0?t+40:t
oszczędzam bajt.'a'
lub'0'
czy jakikolwiek zakaz pisania wielkimi literami, i powrócić że zamiastt/0
i oddające cały loschar
. W ten sposób zaoszczędziłbyś 7 bajtów. Gra w golfa w ten sposób , masz 145 bajtów..matches
tego wyrażenia regularnego, btw. Ale może się mylę.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
tylko dla 94 bajtów (zs
byciu achar[]
): ps[0]<88&s[0]>90
o 8 kolejnych bajtów.PHP , 88 bajtów
drukuje 1 dla błędu
Wypróbuj online!
źródło
Galaretka , 42 bajty
Wypróbuj online!
Za długo, galaretko! Dennis jest z ciebie rozczarowany! [wymagany cytat]
źródło
q / kdb +, 68 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Jeśli pierwszy znak,,
x 0
jest w ciągu,"XYZ"
toa
będzie0
,1
lub2
. Jeśli pierwszego znaku nie ma w ciągu,a
będzie3
. Jeślia
jest mniejsze niż 3, zamieniamy pierwszy znak na ciąg znaków (0
,1
lub2
), w przeciwnym razie zamieniamy na pierwszy znak (w ten sposób skutecznie nic nie robiąc). Ciąg ten jest rzutowany na long ("J"$
), który jest następniemod
oznaczony jako 23, dając resztę. Ta reszta służy do indeksowania w tabeli odnośników.Uwagi:
" "
jest zwracany w scenariuszach błędów, ponieważ rzutowanie zwraca wartość NULL, a indeksowanie w łańcuch o wartości NULL jest pustym znakiem. Mógłbym dodać 4 bajty na początku ("!"^
), aby było bardziej oczywiste, że wystąpił błąd:źródło
JavaScript (ES6), 121 bajtów
źródło
Japt , 50 bajtów
Podobne do większości innych podejść.
Dane wejściowe i wyjściowe są pisane małymi literami, a dane wyjściowe
undefined
dla nieprawidłowego wprowadzania.Przetestuj
Przetestuj wszystkie poprawne przypadki testowe
źródło
Rdza, 206 bajtów
Nie sądzę, że rdza nadaje się do gry w golfa kodowego -_-
źródło
05AB1E ,
414039 bajtówWprowadza dane małymi literami (aby zaoszczędzić 1 bajt yay )
Wypróbuj online!
Drukuje dane wejściowe do STDERR, jeśli są zniekształcone
Wyjaśnienie
źródło
Dyalog APL, 95 bajtów
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Jest to operator monadyczny, który akceptuje ciąg znaków jako operand i zwraca wynik.
FIXME nie sprawdza danych wejściowych. To nie jest właściwie gra w golfa.
Stosowanie:
źródło