Это кандидат Кэлвин номер?


27

Это испытание - дань уважения нашему легендарному автору испытаний , хобби Кальвина - теперь переименованному в Хелка Хомба - в том же духе, что и Generate Dennis Numbers .

Кальвин довольно внушительный вклад в PPCG, с 6 по репутации в целом и, вероятно, indisputibly лучшие навыки вызов письма из всех нас. Однако, конечно, для этого вызова мы сосредоточимся на его идентификаторе пользователя.

Поначалу 26997 может показаться не очень интересным. На самом деле, это почти интересно несколькими способами. Например, вот график 26997 mod <n>для определенных значений n:

n   |  26997 % n
----+-----------
3   |  0
4   |  1
5   |  2
6   |  3
7   |  5 :(
8   |  5
9   |  6
10  |  7

Тем не менее, 26997 является одним из немногих чисел, которые могут быть представлены , где целое число> 0.(n * 10)n - nn

Вот первые несколько чисел, которые могут быть выражены таким образом, которые мы и впредь будем называть числами Кальвина :

9
398
26997
2559996
312499995
46655999994
8235429999993
1677721599999992
387420488999999991
99999999999999999990
28531167061099999999989
8916100448255999999999988
3028751065922529999999999987
1111200682555801599999999999986
437893890380859374999999999999985
184467440737095516159999999999999984
82724026188633676417699999999999999983
39346408075296537575423999999999999999982
19784196556603135891239789999999999999999981
10485759999999999999999999999999999999999999980

Эти номера Кальвина имеют некоторые интересные свойства. Больше шаблонов появляется, когда мы выравниваем их по правому краю и выделяем все 9s:

Скриншот

Те, которые нас интересуют для этой задачи:

  • Независимо от того n, каждый номер Кельвина заканчивается .10n - n

    Так, Кельвин (1) концы с 9, Кальвина (2) заканчивается 98, и образец продолжается 997, 9996, 99995и т.д., при этом каждый последующий Calvin Количество отсчет и добавить дополнительный 9к началу.

  • Для значений nгде n % 10 == 0(то nесть делится на 10), Calvin (n) заканчивается на .102n - n

    То есть шаблон расширяется на вдвое больше цифр, чем обычно, с дополнительным числом 9s в начале, равным n.

  • Когда nэто сила 10( 10, 100, 1000и т.д.), шаблон простирается еще дальше-каждая одна цифра является либо 9или 0.

    Этот шаблон выглядит следующим образом: девятки и нули. Это легче понять на диаграмме (в любом случае вашему решению придется обрабатывать числа до 10000, так что это все, что вам нужно):(n + 1) * 10n - nn

    n      |  Calvin(n)
    -------+-----------------------
    10     |  19 nines, 1 zero
    100    |  298 nines, 2 zeroes
    1000   |  3997 nines, 3 zeroes
    10000  |  49998 nines, 4 zeroes
    

    Число девяток даже демонстрирует несколько свойств самих номеров Кельвина , но это слишком много деталей для этой задачи.

Вызов

Числа Кельвина становятся слишком большими, слишком быстрыми для того, чтобы задача «получить n-е число Кэлвина» выполнилась в языках без целых чисел произвольной точности. Поэтому задача состоит в том, чтобы определить, соответствует ли число указанным выше шаблонам, то есть число является «номером кандидата Кельвина» или нет.

Вот критерии для номера, который будет считаться кандидатом в число Кэлвина (далее для краткости называемый CCN):

  • Он заканчивается числом, которое соответствует шаблону для целого числа .10n - nn

    Таким образом, чтобы быть CCN, число должно заканчиваться на 9, или 98, или 997, 9996, 99995 и т. Д.

  • Если последняя цифра есть 0, она также должна заканчиваться , как и в предыдущем пункте.102n - nn

    Это означает, что 12312312399999999999999999999999999999999999980это не CCN, а 10485759999999999999999999999999999999999999980есть (это на самом деле правильный).

  • Если значение nв предыдущих двух шагах является степенью 10, все число должно соответствовать третьему шаблону, описанному выше.

Ввод, вывод

Ввод будет предоставлен в виде строки, и он всегда будет представлять число меньше чем Calvin(10000) + 10000(которое также может быть выражено как ). (Чтобы уточнить, максимально возможный ввод составляет 50000 девяток, а минимально возможный ввод .)10500001

Выход должен быть истинным значением, если вход представляет число, которое является CCN, и ложным значением иначе. Для определения этих терминов см. Мета .

Контрольные примеры

Входные данные, которые должны привести к истинному значению:

9
26997
99999999999999999990
437893890380859374999999999999985
10485759999999999999999999999999999999999999980
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999850
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999028

Входы, которые должны привести к ложному значению:

1
26897
79999999999999999990
437893890380859374299999999999985
12312312399999999999999999999999999999999999980
999998999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999911111
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999027

правила

  • Вы не можете ни в какой точке вашей программы обрабатывать целые числа, превышающие 18446744073709551615( ), если ваш язык поддерживает целые числа произвольной точности (или числовые типы с достаточно высокой точностью, позволяющей хранить числа больше этой).264

    Это просто для предотвращения решений, которые проходят через все возможные числа Кальвина (или все возможные значения ).10n - n

  • Это , поэтому выиграет самый короткий код в байтах.


«Если значение n в предыдущих двух шагах является степенью 10, все число должно соответствовать третьему шаблону, описанному выше». Что означает «третий шаблон»?
Feersum

@feersum Это маркированный список из трех вещей - это последнее.
дверная ручка

Я не понимаю, почему второстепенный ложный тест - ложный. Какое правило это нарушает?
Алексис Кинг,

@AlexisKing Хороший улов; все, что заканчивается, 9должно быть правдой. Исправлена.
Дверная ручка

@ Doorknob Даже с этим изменением число все еще соответствует критериям. Разве число, заканчивающееся на 845, не должно иметь 152 девяток? Вроде бы более чем достаточно. Должна ли была быть половина числа?
Алексис Кинг,

Ответы:


8

Ракетка, 353

(require srfi/13)(let([s(~a(read))])(for/or([n(range 1 999)])(and(let*([y(string-length(~a n))])(string-suffix?(string-append(make-string(-(if(=(modulo n 10)0)(* 2 n)n)y)#\9)(~r #:min-width y #:pad-string"0"(-(expt 10 y)n)))s))(let([n(inexact->exact(/(log n)(log 10)))])(or(not(integer? n))(string-prefix?(make-string(-(*(+ 1 n)(expt 10 n))n)#\9)s))))))

Принимает число из стандартного ввода, выходов #tили #f.

Безголовая версия:

(require srfi/13)

(define (calvin? str)
  (for/or ([n (in-range 1 10001)])
    (and (10^n-n$? n str)
         (or (not (integer? (/ (log n) (log 10))))
             (expt-of-ten-check? n str)))))

(define (10^n-n$? n str)
  (let* ([div-by-ten? (zero? (modulo n 10))]
         [digits (string-length (~a n))]
         [nines (- (if div-by-ten? (* 2 n) n) digits)]
         [suffix (string-append (make-string nines #\9)
                                (~r #:min-width digits #:pad-string "0" (- (expt 10 digits) n)))])
    (string-suffix? suffix str)))

(define (expt-of-ten-check? n str)
  (let* ([n (inexact->exact (/ (log n) (log 10)))]
         [nines (- (* (add1 n) (expt 10 n)) n)]
         [prefix (make-string nines #\9)])
    (string-prefix? prefix str)))

Я обычно не занимаюсь гольф-кодом, и Ракет, конечно, не самый подходящий язык для него, но никто еще не ответил, поэтому я решил, что попробую. ;)


Возможно, они ждали от меня ответа, но, учитывая мою историю сообщений, вероятно, лучше, чтобы вы не ждали;)
Увлечения Кэлвина
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.