Это очень очень простой алгоритм, который, я уверен, может быть решен во многих разных языках. В Испании идентификационные карты (известные как DNI ) состоят из 8 цифр и контрольного символа. Управляющий символ рассчитывается по следующему алгоритму: разделите число на 23, возьмите оставшуюся часть операции и замените ее символом в соответствии с этой таблицей:
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
Если DNI принадлежит иностранному лицу , проживающему в Испании, первая цифра меняется на X
, Y
или , Z
и это называется NIE . В этом случае перед вычислением контрольного символа делаются следующие замены:
X Y Z
0 1 2
В сети есть множество калькуляторов, которые помогают вам получить управляющий символ, но как быстро вы можете написать этот код? Напишите алгоритм (программу или функцию), который получает a string
с номером DNI (который всегда будет состоять из 8 буквенно-цифровых символов) и возвращает только один вычисленный управляющий символ и ничего более (завершающий перевод строки принимается).
Примечания:
- DNI всегда пишется в верхнем регистре, но в вашем алгоритме вы можете выбрать ввод и вывод в верхнем или нижнем регистре, просто быть последовательными.
- В реальной жизни некоторые NIE, выпущенные до 2008 года, имеют 8 цифр после
X
,Y
илиZ
, но для целей этой игры вы можете считать, что они имеют 7 цифр, как в настоящее время. - Вы можете считать, что входная строка всегда будет иметь 8 символов, но если они не в формате «8 цифр» или в формате «[XYZ] плюс 7 цифр», вы должны вернуть ошибку (по вашему выбору) или просто бросить исключение.
Тестовые случаи:
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>
Это код-гольф , поэтому победит самый короткий код для каждого языка!
Ответы:
Python 3 , 83 байта
Попробуйте онлайн!
-5 благодаря АликсЭйнсенхардту (с 99 до 94). -1 спасибо Джонатану Аллану .
источник
str('XYZ'.index(n[0]))
наstr(ord(n[0])-88)
и сохранить 5 байт-88
на%4
.Haskell ,
1079392 байтаПопробуйте онлайн!
источник
Pyth,
3534 байтаКод содержит некоторые непечатаемые символы, так что здесь есть обратимый
xxd
hexdump.Используются строчные буквы .
Попробуйте онлайн. Тестирование.
Версия для печати
объяснение
cz]1
разбивает ввод в позиции 1, например,"y0000369"
на["y", "0000369"]
.>3G
получает последние 3 символа алфавита"xyz"
.U3
получает диапазон [0, 3 [ ,[0, 1, 2]
.X
отображаетсяxyz
на[0, 1, 2]
в массиве split, например,["y", "0000369"]
на[1, "0000369"]
. Это заменяет первый символ, если он является одним изxyz
, оставляя хвост из 7 символов нетронутым, поскольку любая строка из 7 символов не может быть равна одному символу.s
объединяет массив с пустой строкой, например,[1, "0000369"]
в"10000369"
.s
преобразует эту строку в целое число, например,"10000369"
в10000369
. Это выдает ошибку, если в строке остаются лишние нецифровые символы.%
…23
Получает значение по модулю 23, например,10000369
в15
.C"
…"
Преобразует двоичную строку из базы 256 в целое число (около 3,06 × 10 26 )..P
...G
получает перестановку алфавита с этим индексом.@
получает правильный характер от перестановки.источник
MATL ,
6259 байтОшибка для неверного ввода:
A(I): index out of bounds
(компилятор работает в Octave) илиIndex exceeds matrix dimensions
(компилятор работает в Matlab).Попробуйте онлайн!
объяснение
источник
ES6,
83 8281 байтВ бою!
Только в верхнем регистре, код ошибки для недопустимых номеров
undefined
.Один байт спасен благодаря Джонатану Аллану.
Еще один байт сохранен благодаря Shaggy.
источник
%4
а не-88
.0
отcharCodeAt()
тоже.Java 8
154145104 байта-9 байт благодаря @ OliverGrégoire .
-41 байт благодаря @ OliverGrégoire снова, принимая входные данные как массив символов (
char[]
).Если ввод неверен, он либо потерпит неудачу с помощью
java.lang.NumberFormatException
илиjava.lang.StringIndexOutOfBoundsException
.Объяснение:
Попробуй это здесь. (Недопустимые тестовые примеры окружены try-catch, поэтому он не останавливается при первой ошибке.)
источник
|
в регулярном выражении. Такжеint t=s.charAt(0)-88
иt<0?t+40:t
сэкономить вам байт.'a'
или'0'
или любой не заглавная буква, и вернуться , что вместо того , чтобыt/0
и литье все многоchar
. Думаю, вы бы сэкономили 7 байтов таким образом. Таким образом , вы получаете 145 байтов..matches
этого регулярного выражения, кстати. Но, возможно, я ошибаюсь.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
всего за 94 байта (при этомs
бытьchar[]
): ps[0]<88&s[0]>90
8 байтов.PHP , 88 байт
печатает 1 за ошибку
Попробуйте онлайн!
источник
Желе , 42 байта
Попробуйте онлайн!
Слишком долго, Желе! Денис разочарован в тебе! [нужна цитата]
источник
q / kdb +, 68 байт
Решение:
Примеры:
Объяснение:
Если первый символ,
x 0
находится в строке,"XYZ"
тоa
будет0
,1
или2
. Если первого символа нет в строке, тоa
будет3
. Еслиa
меньше , чем 3, мы переходим из первого символа для строки а (0
,1
или2
), в противном случае мы включаем за первый символ (таким образом , эффективно ничего не делать). Эта строка приведена к long ("J"$
), который затемmod
с 23 возвращает остаток. Этот остаток используется для индексации в таблице поиска.Примечания:
" "
возвращается в сценариях ошибок, это потому, что приведение возвращает ноль, а индексирование в строку с индексом ноль - пустой символ. Я мог бы добавить 4 байта в начало ("!"^
), чтобы сделать более очевидным, что произошла ошибка:источник
JavaScript (ES6), 121 байт
источник
Japt , 50 байтов
Подобно большинству других подходов.
Вход и выход строчные, выходы
undefined
для неверного ввода.Проверьте это
Проверьте все действительные тестовые случаи
источник
Ржавчина, 206 байт
Я не думаю, что ржавчина хорошо подходит для игры в гольф.
источник
05AB1E ,
414039 байтПринимает ввод в нижнем регистре (чтобы сохранить 1 байт yay )
Попробуйте онлайн!
Печатает ввод в STDERR, если он искажен
объяснение
источник
Дьялог АПЛ, 95 байт
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Это монадический оператор, который принимает символьную строку в качестве своего операнда и возвращает ее результат.
FIXME он не проверяет свой ввод. Это не правильно гольф.
Использование:
источник