Вызов
Напишите самую короткую программу или функцию для расчета алгоритма Луна для проверки номеров (кредитных карт).
Алгоритм Луна объяснил
От RosettaCode этот алгоритм для целей этой задачи указан как таковой, с примером ввода 49927398716
:
Reverse the digits, make an array:
6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4
Double the numbers in odd indexes:
6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4
Sum the digits in each number:
6, 2, 7, 7, 9, 6, 7, 4, 9, 9, 4
Sum all of the numbers:
6 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 4 = 70
If the sum modulo 10 is 0, then the number is valid:
70 % 10 = 0 => valid
Правила IO
Ввод : строка или число (на ваш выбор) в выбранном вами формате ввода / вывода.
Вывод : истинное или ложное значение , соответственно, указывающее, является ли ввод действительным в соответствии с тестом выше.
Примечания / Советы
Старайтесь не оставлять случайно свои номера кредитных карт или счетов, если вы используете их для проверки :)
Если ввод неверен и его невозможно обработать с помощью указанного алгоритма (т. Е. Слишком короток для работы), вы можете делать все, что захотите, в том числе взорвать мой компьютер.
Однако предыдущий пункт не означает, что ваш язык может делать все, что захочет, с числами, которые слишком велики для него. Если ваш язык не способен обрабатывать контрольные примеры, подумайте о том, чтобы взять строку в качестве входных данных.
Примеры
Следующие примеры были проверены с помощью этого скрипта Python ; если вы думаете, что кто-то не прав или у вас есть вопрос, просто пинг @cat.
49927398716 True
49927398717 False
1234567812345670 True
1234567812345678 False
79927398710 False
79927398711 False
79927398712 False
79927398713 True
79927398714 False
79927398715 False
79927398716 False
79927398717 False
79927398718 False
79927398719 False
374652346956782346957823694857692364857368475368 True
374652346956782346957823694857692364857387456834 False
8 False **
0 True **
** в соответствии с реализацией Python, но вы можете сделать что-нибудь, потому что они слишком короткие, чтобы соответствовать строгой приверженности спецификации.
Если что-либо из вышеперечисленного лишает законной силы существующие ответы (хотя я считаю, что это не должно быть возможно), то эти ответы все еще действительны. Тем не менее, новые ответы, чтобы быть действительными, должны соответствовать спецификации выше.
Leaderboard
var QUESTION_ID=22,OVERRIDE_USER=73772;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
echo -n
-1% 2/
могут быть объединены в-2/
.1,
может быть заменено на0
(0 приводится к массиву, затем+
сцепляется).9>9*-
можно заменить на9>+
(поскольку нас интересует только последняя цифра). Кроме того, проверка нечетных длин немного длиннее, использование.,2%,\+
короче. После этого мы также можем изменить{16%}%
и(\0=
в{16}/
(внутри цикла). После того, как вы сделали все , что, это будет выглядеть примерно так:.,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
.Python,
7369 символовисточник
D[-2::-2]
-> такD[1::2]
как порядок сумм не важен :)==0
можно сократить до<1
Python 3, 77 байт
источник
Символы C # 119:
Надеюсь, это не так уж плохо для гольф-кода n00b на статически типизированном языке.
Это может быть уменьшено до 100 :
источник
i%2<1?1:2
задом наперед. Благодарю.Golfscript - 34 символа
Номер примера со страницы википедии 4992739871
источник
.+(9%)
очень инновационный (для меня, во всяком случае). Мне нравится! +10(9%)
равно 9, а не 0).PHP, 108 байт
источник
Рубин - 85 символов
источник
Haskell, 96 байт
Должен быть лучший / более короткий путь, но вот мое решение на Haskell в 96 символов :
К сожалению,
digitToInt
функция может быть использована только если вы вimport Data.Char
первую очередь. В противном случае я мог бы получить до 88 символов, заменив((+(-48)).fromEnum)
наdigitToInt
.источник
Windows PowerShell, 82
История:
+1 + +3
еще можно оценить.источник
Q, 63
использование
источник
{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)
другим способом удвоить нечетные индексы.D, 144 байта
Более разборчиво:
источник
APL, 28 байт
В разобранном виде
Примеры
источник
{0=10|+/⍎¨∊⍕¨⍵×⌽2-2|⍳⍴⍵}⍎¨
PowerShell 123
источник
Perl,
464241 байтВключает +1 для
-p
Внесите свой вклад в STDIN:
luhn.pl
:источник
$=-=-$&-$&*/\G(..)+$/
?0..4
* 2 дает,0, 2, 4, 6, 8
но5..9
дает10,12,14,16,18
сумму, к1 3 5 7 9
которой имеют те же последние цифры,11 13 15 17 19
что и те же значения, что и0..9 * 2.2
при усечении до целого числа. Первое$&
уже вносит свой вклад1
, поэтому коррекция по-1.2
прежнему необходима.$=
может содержать только целые числа и начинается со значения, оканчивающегося на 0, поэтому заботится об усечении. Отрицательные значения необходимы, так как/\G/
регулярное выражение меняет все$&
еще в стеке оценки, поэтому их необходимо изменитьJavaScript (ES6), 61 байт
Не конкурирует, так как JavaScript в 2011 году сильно отличался.
Сумма цифр
2*n
в2*n
случаеn in 0..4
,2*n-9
еслиn in 5..9
. При этом вся сумма может быть вычислена за один шаг.источник
Желе ,
1211 байтПопробуйте онлайн! (со всеми тестами)
Как это устроено
В качестве альтернативы для 12 байтов:
источник
x86-16 ASM , IBM PC DOS, 23 байта
Использует (злоупотребляет) инструкцию x86 в двоично-двоичном формате
AAM
для обработки разделения иmodulo 10
проверки отдельных цифр .Указатель строки номера входной карты в
SI
, длина вCX
. Вывод:ZF
если допустимо.Пример тестовой программы:
Загрузите тестовую программу LUHN.COM IBM PC DOS.
источник
Скала: 132
вызов:
источник
JavaScript 1.8: 106 символов
Это оригинальное решение, которое я придумал до того, как нашел этот пост:
Читаемая форма:
источник
К4, 35 байт
источник
Сетчатка ,
4342 байтаСетчатка (намного) новее, чем этот вызов.
Ведущая пустая строка имеет большое значение.
Отпечатки
0
для ложных и1
правдивых результатов.Попробуйте онлайн! (Немного изменен для запуска всех тестовых случаев одновременно.)
объяснение
Вставьте
;
в каждую позицию, чтобы отделить цифры.С самого начала
r
мы неоднократно сопоставляем две цифры и удваиваем левую. Таким образом мы избегаем дорогостоящего изменения списка.Мы сопоставляем каждую цифру и преобразуем ее в такое количество
1
s (то есть мы конвертируем каждую цифру в унарную).Это соответствует каждому унарному числу и преобразует его обратно в десятичную, заменяя его длиной. Вместе с предыдущим этапом это добавляет удвоенные цифры.
Опять же, мы сопоставляем каждого персонажа и превращаем его во множество
1
s. То есть мы переводим каждую цифру индивидуально обратно в унарную. Это также соответствует;
разделителям, которые при преобразовании рассматриваются как нули, что означает, что они просто удаляются. Поскольку все унарные числа теперь сведены вместе, мы автоматически добавили унарные представления всех цифр вместе.В конце мы вставляем длину всей строки, то есть десятичное представление унарной контрольной суммы.
Наконец, мы подсчитываем количество совпадений этого регулярного выражения, т.е. проверяем, заканчивается ли десятичное представление
0
, печатается0
или,1
соответственно.источник
Powershell, 74 байта
объяснение
Тестовый скрипт
Выход
источник
05AB1E ,
1210 байтПопробуйте онлайн! или как тестовый набор
объяснение
источник
Haskell: 97
По некоторым причинам это не работает для меня , так что вот моя версия
источник
GNU sed, 140 байт
(включая +1 за
-r
флаг)Сед почти никогда не является самым естественным языком для арифметики, но здесь мы идем:
источник
APL, 38 байт
ожидает число как число, а не как строку, но это только потому, что tryAPL (понятно) не реализует
⍎
дальнейшее сводимое, я уверен ...
источник
PHP - 136 символов
источник
MATL ,
2320 байтов (не конкурирует)Попробуйте онлайн!
Выходы 1 для действительного числа, 0 в противном случае.
Сохранено три байта благодаря предложениям Луиса Мендо.
объяснение
источник
Желе , 14 байт
Попробуйте онлайн!
Объяснение:
источник