Czy to kandydat Calvin Number?


27

To wyzwanie jest hołdem dla naszego Legendary Challenge Writer ™, Calvin's Hobbies - teraz przemianowanego na Helka Homba - w tym samym duchu, co Generate Dennis Numbers .

Calvin jest dość imponującym współpracownikiem PPCG, z szóstą pod względem ogólnej reputacji i prawdopodobnie bezdyskusyjnie najlepszymi umiejętnościami pisania z nas wszystkich. Oczywiście w przypadku tego wyzwania skupimy się na jego identyfikatorze użytkownika.

26997 może początkowo nie wyglądać zbyt interesująco. W rzeczywistości, to niemal interesująca na kilka sposobów. Na przykład, oto tabela 26997 mod <n>niektórych wartości n:

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

Jednak 26997 jest jedną z niewielu liczb, które mogą być reprezentowane przez , gdzie jest liczbą całkowitą> 0.(n * 10)n - nn

Oto kilka pierwszych liczb, które można wyrazić w ten sposób, które odtąd będziemy nazywać Liczbami Calvina :

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

Te liczby Calvina mają kilka interesujących właściwości. Więcej wzorów pojawia się, gdy wyrównujemy je do prawej i wyróżnimy wszystkie 9s:

zrzut ekranu

Do tego zadania jesteśmy zainteresowani:

  • Niezależnie od tego nkażda liczba Calvina kończy się na .10n - n

    Tak, Calvin (1) kończy się 9, Kalwina (2) kończy się 98, a wzór kontynuuje 997, 9996, 99995, itd., Z każdym kolejnym Calvin Liczba odliczanie i dodając dodatkowy 9do początku.

  • Dla wartości ngdzie n % 10 == 0(tj. Można npodzielić przez 10), Calvin (n) kończy się na .102n - n

    Oznacza to, że wzór rozciąga się na dwa razy więcej cyfr niż zwykle, z dodatkową liczbą 9s na początku równą n.

  • Kiedy njest potęgą 10( 10, 100, 1000, itd.), Wzór rozciąga się nawet dalej, każda cyfra jest albo 9albo 0.

    Ten wzór jest następujący: dziewiątki i zera. Łatwiej to zrozumieć na wykresie (twoje rozwiązanie i tak będzie musiało obsłużyć liczby do 10000, więc to wszystko, czego potrzebujesz):(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
    

    Liczba dziewiątek wykazuje nawet kilka właściwości samej liczby Calvina , ale to zbyt wiele szczegółów, by sprostać temu wyzwaniu.

Wyzwanie

Liczby Calvina stają się o wiele za duże, o wiele za szybkie, aby „uzyskać n-te wyzwanie Calvin Number, które byłoby wykonalne w językach bez liczb całkowitych o dowolnej dokładności. Dlatego wyzwanie polega na ustaleniu, czy liczba pasuje do powyższych wzorów - to znaczy, czy liczba jest „kandydacką liczbą Calvina” lub nie.

Oto kryteria uznania numeru Calvina za liczbę Calvina (w skrócie zwaną dalej CCN):

  • Kończy się liczbą pasującą do wzorca liczby całkowitej .10n - nn

    Tak więc, aby być CCN, liczba musi kończyć się cyfrą 9 lub 98 lub 997, 9996, 99995 itd.

  • Jeśli ostatnia cyfra to 0, musi ona również kończyć się , tak jak w poprzednim punkcie.102n - nn

    Oznacza to, że 12312312399999999999999999999999999999999999980nie jest to CCN, ale 10485759999999999999999999999999999999999999980jest (jest to właściwie właściwy).

  • Jeśli wartość z npoprzednich dwóch kroków wynosi potęgę 10, cała liczba musi pasować do trzeciego wzorca opisanego powyżej.

Wejście wyjście

Dane wejściowe będą dostarczane w postaci ciągu i zawsze będą reprezentować liczbę mniejszą niż Calvin(10000) + 10000(którą można również wyrazić jako ). (Aby wyjaśnić, największy możliwy wkład to 50000 dziewiątek, a najmniej możliwy wkład to .)10500001

Dane wyjściowe powinny być zgodne z prawdą, jeśli dane wejściowe reprezentują liczbę, która jest CCN, a wartość falsy w przeciwnym razie. Do definicji tych terminów, patrz meta .

Przypadki testowe

Dane wejściowe, które powinny dać prawdziwą wartość:

9
26997
99999999999999999990
437893890380859374999999999999985
10485759999999999999999999999999999999999999980
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999850
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999028

Dane wejściowe, które powinny skutkować wartością falsy:

1
26897
79999999999999999990
437893890380859374299999999999985
12312312399999999999999999999999999999999999980
999998999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999911111
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999027

Zasady

  • Ty może nie , w każdym momencie swojego programu, liczby całkowite większe niż handle 18446744073709551615( ), jeśli język posiada wsparcie dla liczb całkowitych arbitralny precyzji (lub typów numerycznych z wystarczająco dużą dokładnością, aby umożliwić przechowywanie liczb powyżej tego).264

    Ma to na celu zapobieżenie rozwiązaniom przechodzącym przez wszystkie możliwe liczby Calvina (lub wszystkie możliwe wartości ).10n - n

  • To jest , więc wygra najkrótszy kod w bajtach.


„Jeśli wartość nw poprzednich dwóch krokach jest potęgą 10, cała liczba musi pasować do trzeciego wzorca opisanego powyżej.” Do czego odnosi się „trzeci wzór”?
feersum

@feersum Jest wypunktowana lista trzech rzeczy - jest to ostatnia.
Klamka

Nie rozumiem, dlaczego przedostatni przypadek falsji jest fałszem. Jaką zasadę to narusza?
Alexis King,

@AlexisKing Dobry połów; wszystko, co się kończy, 9powinno być prawdą. Naprawiony.
Klamka

@Doorknob Nawet przy tej zmianie liczba nadal wydaje się spełniać kryteria. Czy liczba kończąca się na 845 nie powinna mieć 152 dziewiątek? Wydaje się, że ma go więcej niż wystarczająco. Czy miała być połowa tej liczby?
Alexis King,

Odpowiedzi:


8

Rakieta, 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))))))

Akceptuje liczbę ze standardowego wyjścia, wyjść #tlub #f.

Wersja bez golfa:

(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)))

Zwykle nie gram w golfa, a Rakieta z pewnością nie jest najlepszym językiem, ale nikt jeszcze nie odpowiedział, więc pomyślałem, że spróbuję. ;)


Być może czekali na moją odpowiedź, ale biorąc pod uwagę moją historię postów, prawdopodobnie najlepiej nie czekać w pobliżu;)
Hobby Calvina
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.