Was ist der Starter dieser konstruierten Zahl?


14

Eine Reihe von Programmiersprachen erstellen große Ganzzahlen, indem sie die Ziffer bis zum Ende der vorhandenen Zahl "verketten". Zum Beispiel Labyrinth oder Adapt . Mit Verketten der Ziffer bis zum Ende meine ich, dass, wenn die vorhandene Nummer 45 ist und die Ziffer 7 die Ergebniszahl 457 lautet457(45×10+7) .

Eine konstruierte Zahl ist eine Zahl, die auf diese Weise unter Verwendung der Vielfachen einstelliger Zahlen erstellt werden kann: 1,2,3,4,5,6,7,8,9 AKA Ein Element in einer dieser 9 Folgen:

1,12,123,1234,12345,
2,24,246,2468,24690,
3,36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

Um ein Beispiel dafür zu geben, wie die Sequenzen aufgebaut sind, sehen Sie, wie die Sequenz für a=3 aufgebaut ist:

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×ein=37260+99=37359u34=10×u33+34×ein=37359+102=373692

u33 undu34 enthalten, um zu demonstrieren, wennn×a100 . EineMengevon Stellen punktiert fürWeltraum aus.

Es ist möglicherweise immer noch nicht klar, wie diese Sequenzen aufgebaut sind. Sie können sie also auf zwei verschiedene Arten verstehen:

  • Jede Sequenz beginnt mit der einzelnen Ziffer. Der nächste Term wird gefunden, indem das nächste Vielfache dieser Ziffer genommen, der vorherige Term mit 10 multipliziert und das Vielfache addiert wird. In der Reihenfolge ausgedrückt:

    un=10×un1+n×a,u1=a

    wobei a eine einzelne Ziffer ist ( 1 bis 9 )


  • Jedes der 9 Elemente an einem beliebigen Punkt in der Folge ( zum Beispiel n=3 ) sind die Vielfachen von 123 von 1 bis 9 , wobei 123 durch un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    Die ersten Werte sind also 1×1,2,3,,8,9 , die zweiten sind 12×1,2,3,,8,9 , die dritten 123×1,2,3,,8,9 usw.

Ihre Aufgabe ist es, eine konstruierte Zahl als Eingabe zu nehmen und die Anfangsziffer auszugeben, mit der sie konstruiert wurde. Sie können davon ausgehen, dass die Eingabe immer eine konstruierte Zahl ist und größer als 0 . Es kann sich um eine einzelne Ziffer handeln, die auf sich selbst zurückgeht.

Sie können Eingaben auf jede vernünftige Weise vornehmen, einschließlich als Ziffernliste, als Zeichenfolge usw. Es ist akzeptabel (obwohl nicht empfohlen), Eingaben in unary oder einer anderen Basis Ihrer Wahl vorzunehmen.

Dies ist ein also gewinnt der kürzeste Code!

Testfälle

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

oder als zwei Listen:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

Als ich diese Herausforderung gepostet habe, war mir nicht klar, dass sie durch die in Grimys Antwort verwendete Methode so stark vereinfacht werden könnte, und ich wäre daher sehr an Antworten interessiert, die einen mathematischeren Ansatz zur Lösung dieser Aufgabe verfolgen , anstatt eine 'Ziffer'. Trick (Offensichtlich sind alle gültigen Antworten gleichermaßen gültig, genau das, woran ich interessiert wäre).


Sandkastenpfosten . Ich habe eine 9-Byte-Lösung in Jelly, wenn jemand das in Frage stellen möchte.
Caird Coinheringaahing

Antworten:


26

05AB1E , 7 5 4 Bytes

>9*н

Probieren Sie es online!

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
Hmm, das ist kein
gutes Zeichen

9
Sie haben ungefähr 1 Byte Code für 800 Byte Erklärung der Herausforderung. : p
Arnauld

1
Wie kommt man auf die Lösung und warum ist sie richtig?
Joel

7
@Joel der (n-1) -te Term der Sequenz beginnend mit a ist a * (((10**n - 1) / 9 - n) / 9). Multiplizieren Sie das mit 9 und addieren Sie a*n, und Sie erhalten a * ((10**n - 1) / 9), auch bekannt als die Ziffer, die n-mal wiederholt wird. Es stellt sich heraus, dass a*nfür n = 1 9 anstelle von funktioniert, und für größere n ist die konstante Differenz neben dem exponentiellen Wachstum vernachlässigbar.
Grimmy

3
@ Grimy Vielen Dank für die Erklärung. Vielleicht kannst du es in deinen Beitrag einfügen.
Joel

3

MathGolf , 6 Bytes

)9*▒├Þ

Probieren Sie es online!

Leider gibt es headin MathGolf keine Operation, daher muss ich mich damit begnügen, ▒├Þin einen String zu konvertieren, von links zu springen und alle bis auf den oberen Teil des Stapels zu verwerfen.





2

Kohle , 7 Bytes

§I×⁹⊕N⁰

Probieren Sie es online! Link ist eine ausführliche Version des Codes. @ Grimys Methode natürlich. Hier ist ein mathematischer Ansatz von 27 Byte:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Abstürze bei ungültigen Eingaben. Erläuterung:

Nθ

Geben Sie die konstruierte Zahl ein.

W¬№Eχ×κ↨υχθ

Interpretieren Sie die Liste als Zahl in Basis 10, multiplizieren Sie sie mit allen Zahlen von 0bis 9und prüfen Sie, ob die konstruierte Zahl angezeigt wird.

⊞υLυ

Schieben Sie die Länge der Liste auf sich. Die Liste wird also von der Form [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Erstellen Sie die erstellten Zahlen neu, aber suchen Sie diesmal den Index, an dem die eingegebene Zahl erschien, und geben Sie ihn aus.



2

Leerzeichen , 108 Bytes

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.

Port von @Grimys 05AB1E-Antwort , außer dass ich keinen eingebauten Code habe, um die erste Ziffer zu erhalten. ;)

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Erklärung im Pseudocode:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

Python 3 , 22 Bytes

lambda i:str(-~i*9)[0]

Probieren Sie es online!

Hafen von Grimy ‚s 05AB1E Antwort


Python 3 , 74 Bytes

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

Probieren Sie es online!

Erläuterung

Rekursive Funktion. Durchläuft die Sequenz für jede Ziffer l, beginnend mit 1. Wenn die Eingabe ider aktuellen Iteration entspricht j, wird die entsprechende Ziffer lzurückgegeben. Wenn der aktuelle Wert jin der Sequenz den Eingabewert überschreitet i, wird die Ziffer erhöht lund neu gestartet. Das Argument kwird verwendet, um den Multiplikationsfaktor zu erhöhen.


1

JavaScript (ES6),  16  15 Bytes

Vielen Dank an @Grimy für das Aufheben der 32-Bit-Einschränkung, die ich mit der vorherigen Version hatte.

Mit Grimys magischer Beschwörung . Übernimmt die Eingabe als Zeichenfolge.

n=>(n*9+9+n)[0]

Probieren Sie es online!


JavaScript (ES6), 53 Byte

Naiver Brute-Force-Ansatz.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

Probieren Sie es online!


-~n*9kann sein n*9+9, das ist das gleiche bytecount aber sollte die 32-Bit-Beschränkung loswerden, wenn ich richtig verstanden habe.
Grimmy

Die Brute Force arbeitet für eine> = 10, wie14808
Nahuel Fouilleul

1
@NahuelFouilleul Wenn wir a> = 10 betrachten, ist die Antwort nicht mehr eindeutig (14808 könnte entweder der 4. Term von a = 12 oder der erste Term von a = 14808 sein). Wenn die Ausgabe einer dieser Angaben zulässig ist, gilt dies n=>nfür alle Eingaben.
Grimmy

1

Java 8, 23 Bytes

n->(n*9+9+"").charAt(0)

Port von @Grimys 05AB1E Antwort , also stelle sicher, dass du ihn positiv bewertest!

Probieren Sie es online aus.

Aber weil ich mich für @cairdCoinheringaahing irgendwie schlecht fühle , hier ein Brute-Force-Ansatz mit etwas mehr Geld ( 83 Bytes ):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

Probieren Sie es online aus.

Erläuterung:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result


0

Gelee , 8 Bytes

RRḌ÷@fⱮ9

Probieren Sie es online!

Ein vollständiges Programm, das eine Ganzzahl annimmt und die Startziffer ausgibt. Verwendet nicht Grimys clevere Methode! Schrecklich ineffizient für größere Eingaben. Die folgende Version verarbeitet alle Testfälle, ist jedoch ein Byte länger:

Gelee , 9 Bytes

DJRḌ÷@fⱮ9

Probieren Sie es online!



0

Fass -rr , 4 Bytes

⑨9*÷

Probieren Sie es online!

Verwendet natürlich den gleichen Ansatz wie die 05AB1E-Antwort. Verwendet auch das neue -rrFlag (reverse und print raw).

Transpiles zu:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.