Ist das ein Kandidat für Calvin Number?

27

Diese Herausforderung ist eine Hommage an unseren Legendary Challenge Writer ™, Calvins Hobbys - jetzt umbenannt in Helka Homba - im selben Sinne wie Generate Dennis Numbers .

Calvin leistet einen ziemlich beeindruckenden Beitrag zu PPCG. Insgesamt steht er an sechster Stelle und ist wahrscheinlich die beste Herausforderung, wenn es um das Schreiben von Texten geht. Bei dieser Herausforderung konzentrieren wir uns natürlich auf seine Benutzer-ID.

26997 mag zunächst nicht sehr interessant aussehen. Tatsächlich ist es in mancher Hinsicht fast interessant. Hier ist zum Beispiel ein Diagramm 26997 mod <n>für bestimmte Werte von n:

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

26997 ist jedoch eine der wenigen Zahlen, die dargestellt werden können , wobei eine ganze Zahl> 0 ist.(n * 10)n - nn

Hier sind die ersten Zahlen, die auf diese Weise ausgedrückt werden können und die wir nachfolgend als Calvin-Zahlen bezeichnen :

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

Diese Calvin-Zahlen haben einige interessante Eigenschaften. Weitere Muster entstehen, wenn wir sie nach rechts ausrichten und alle 9s hervorheben :

Bildschirmfoto

Diejenigen, die uns für diese Herausforderung interessieren, sind:

  • Unabhängig davon endet njede Calvin-Zahl mit .10n - n

    So, Calvin (1) mit Enden 9, Calvin (2) mit Enden 98, und das Muster weiter 997, 9996, 99995usw., wobei jede aufeinanderfolgenden Calvin Anzahl Abzählen und Hinzufügen eines zusätzlichen 9zum Anfang zurück .

  • Für Werte von nwhere n % 10 == 0(dh nist teilbar durch 10) endet Calvin (n) mit .102n - n

    Das heißt, das Muster erstreckt sich über doppelt so viele Stellen wie normal, wobei eine zusätzliche Anzahl von 9s am Anfang gleich ist n.

  • Wenn neine Potenz von 10( 10, 100, 1000, etc.), erstreckt sich das Muster noch weiter jede einzelne Ziffer entweder a 9oder a 0.

    Dieses Muster ist das folgende: Neunen und Nullen. Dies ist in einem Diagramm einfacher zu verstehen (Ihre Lösung muss ohnehin nur Zahlen bis 10000 verarbeiten, das ist also alles, was Sie benötigen):(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
    

    Die Anzahl der Neunen weist sogar mehrere Eigenschaften von Calvin Numbers selbst auf, aber das ist zu detailliert für diese Herausforderung.

Herausforderung

Calvin-Zahlen werden viel zu groß, viel zu schnell, als dass die n-te Calvin -Zahlen-Herausforderung in Sprachen ohne Ganzzahlen mit willkürlicher Genauigkeit durchgeführt werden könnte Eine Zahl ist eine "Kandidaten-Calvin-Zahl" oder nicht.

Hier sind die Kriterien für eine Nummer, die als Kandidat für eine Calvin-Nummer angesehen werden soll (im Folgenden kurz als CCN bezeichnet):

  • Es endet mit einer Zahl, die zum Muster einer ganzen Zahl passt .10n - nn

    Als CCN muss eine Zahl also mit 9 oder 98 oder 997, 9996, 99995 usw. enden.

  • Wenn die letzte Ziffer ist 0, muss es auch am Ende mit , für die gleichen wie im vorherigen Punkt.102n - nn

    Dies bedeutet, dass 12312312399999999999999999999999999999999999980es sich nicht um eine CCN handelt, sondern 10485759999999999999999999999999999999999999980um eine (in der Tat die richtige).

  • Wenn der Wert nin den beiden vorherigen Schritten eine Potenz von 10 ist, muss die gesamte Zahl dem oben beschriebenen dritten Muster entsprechen.

Input-Output

Die Eingabe wird als Zeichenfolge bereitgestellt und stellt immer eine Zahl dar, die kleiner ist als Calvin(10000) + 10000(was auch ausgedrückt werden kann als ). (Zur Verdeutlichung ist die größtmögliche Eingabe 50000 Neunen und die kleinstmögliche Eingabe ist .)10500001

Die Ausgabe sollte ein wahrer Wert sein, wenn die Eingabe eine Zahl darstellt, die eine CCN ist, und andernfalls ein falscher Wert. Die Definitionen dieser Begriffe finden Sie unter Meta .

Testfälle

Eingaben, die einen Wahrheitswert ergeben sollen:

9
26997
99999999999999999990
437893890380859374999999999999985
10485759999999999999999999999999999999999999980
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999850
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999028

Eingaben, die zu einem falschen Wert führen sollen:

1
26897
79999999999999999990
437893890380859374299999999999985
12312312399999999999999999999999999999999999980
999998999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999900
259232147948794494594485446818048254863271026096382337884099237269509380022108148908589797968903058274437782549758243999867043174477180579595714249308002763427793979644775390624999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999911111
1027092382693614216458468213549848274267264533712122209400214436472662418869004625362768700557725707157332451380426829473630485959339004149867738722096608953864534215649211386152032635755501464142277508289403434891444020975243742942368836579910208098242623061684967794815600266752580663281483595687307649904776800899000484103534573979334062832465904049046104660220505973505050538180250643437654409375728443182380726453925959886901573523090619465866810938078629561306599174923972607310649219442207992951278588892681161967770532314854195892941913447519131828356181219857012229150315613569162930098836696593474888020746503116685472977764615483225628639443918309216648893055765917642528801571387940219884056021782642758517893124803355573565644666880920219871370649806723296262307899148031362558110611562055614190049332906933360406981359187305353360484377948591528385990255894034369523166777375785900198782250651053530165824984161319460372145229568890321167955690544235365954748429659526071133879976348254667755220636244075595290123987745560038255541751251200827018722242010925729483977388235141539109139120069464709993781356334885359200734157439642935779132120725231008699003342908280056975158266782782304550273268246184659474285971272532354920744956064671379745219778013465792544241259691493098443741845166419905920702654683993902052727208789915748213660571390107102976665776293366616518962323688316843422737162297255648351087284877987537325761187239807598009767936409247247417410607537333841650998421607775989879490006136112078031237742552602618996017404602674987181629319060214150458746352191115606789019875790921190573561400752476956787515392210098071407806221412149732955903681690377998882038499470092453400748916257640501488510563314141992573250882286817352407459053866180642034662845694338400386823496563185664221362457851894843439705365082614359220653285052800751906334000698723288454227654466240011140570190301931122357632719033275258503935182047714841766010764632214069382579660602964184231995352310981811428980530707871661256260926759509418970021224649566130995825802676411575264295689037775857674060557127369881379685432291930869072749065675720647595081516460449973211035071920099349836074945813885239767788449030051892470053308048906746273036871919251738920141071153777908913021898541658119513188402271468288293408246833819954990709460114510017598873554406350044072275643892449218394225569069468466660333869360644718801813500285081977089623921689922204185138003164149106921903053243405307546841149889662566529697217181329051855403329741409045760789280950603184354320839342588593832348459938736210265795978675460906504449491132656307256451707333439200130425932724262464823848348296787445624028385464112471408499986690593095395244034885421580844176161027627954578726208600199909963055422192706751708210693468639072881081717288837393188012794669089175022406897622823484220002211676520484520241135615999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999027

Regeln

  • Sie dürfen nicht an einem beliebigen Stelle in Ihrem Programm, handelte ganze Zahlen größer als 18446744073709551615( ), wenn Sie Ihre Sprache hat die Unterstützung für beliebige Genauigkeit Integer (oder Zahlentypen mit einer ausreichend hohen Genauigkeit zu ermöglichen Zahlen größer als diese Speicherung).264

    Dies dient lediglich dazu, Lösungen zu verhindern, die alle möglichen Calvin-Zahlen (oder alle möglichen Werte von ) durchlaufen .10n - n

  • Das ist , also gewinnt der kürzeste Code in Bytes.

Türknauf
quelle
"Wenn der Wert von n in den beiden vorhergehenden Schritten eine Potenz von 10 ist, muss die gesamte Zahl dem oben beschriebenen dritten Muster entsprechen." Worauf bezieht sich das dritte Muster?
Feersum
@feersum Es gibt eine Aufzählung von drei Dingen - es ist die letzte.
Türknauf
Ich verstehe nicht, warum der vorletzte Testfall falsch ist. Welche Regel verletzt es?
Alexis King
@ Alexisking Guter Fang; Alles, was damit endet, 9sollte wahr sein. Fest.
Türklinke
@Doorknob Auch mit dieser Änderung scheint die Nummer immer noch den Kriterien zu entsprechen. Sollte eine Zahl, die auf 845 endet, nicht 152 Neunen haben? Es scheint mehr als genug zu haben. Sollte es die Hälfte geben?
Alexis King

Antworten:

8

Schläger, 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))))))

Akzeptiert eine Zahl aus stdin, output #toder #f.

Ungolfed-Version:

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

Ich spiele normalerweise kein Code-Golf und Racket ist sicherlich nicht die am besten geeignete Sprache dafür, aber noch hatte niemand geantwortet, also dachte ich mir, ich würde es versuchen. ;)

Alexis King
quelle
Sie haben vielleicht darauf gewartet, dass ich antworte, aber angesichts meines Beitragsverlaufs ist es wahrscheinlich das Beste, dass Sie nicht herumgewartet haben;)
Calvins Hobbys