Cos'è l'antipasto di questo numero costruito?


14

Un certo numero di linguaggi di programmazione costruisce numeri interi grandi "concatenando" la cifra fino alla fine del numero esistente. Ad esempio, Labyrinth o Adapt . Concatenando la cifra fino alla fine, intendo che, se il numero esistente è 45 e la cifra è , il numero del risultato è .7457(45×10+7)

Un numero costruito è un numero che può essere costruito in questo modo attraverso l'uso dei multipli di numeri a una cifra: AKA un elemento in una di queste 9 sequenze:1,2,3,4,5,6,7,8,9

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,...

Per fornire un esempio di come sono costruite le sequenze, ecco come viene costruita la sequenza per :a=3

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×un'=37020+15=37035u6=10×u5+6×un'=370350+18=370368
u33=10×u32+33×un'=37...260+99=37...359u34=10×u33+34×un'=37...359+102=37...3692

u33 e inclusi per dimostrare quando . Un sacco di cifre punteggiata fuori per lo spazio.u34n×un'100

Potrebbe non essere ancora chiaro come siano costruite queste sequenze, quindi ecco due modi diversi per capirle:

  • Ogni sequenza inizia dalla singola cifra. Il termine successivo viene trovato prendendo il multiplo successivo di quella cifra, moltiplicando il termine precedente per e aggiungendo il multiplo. In termini di sequenza:10

    un=10×un-1+n×un',u1=un'

    dove è una singola cifra (da a )un'19


  • Ognuno dei elementi in qualsiasi punto della sequenza (ad esempio ) sono i multipli di da a , dove è costruito da9n=3123...19123...un+1=10×un+n (1,12,123,...,123456789,1234567900,12345679011,...)

    Quindi i primi valori sono , i secondi sono , il terzo , ecc.1×1,2,3,...,8,912×1,2,3,...,8,9123×1,2,3,...,8,9

Il tuo compito è prendere un numero costruito come input e produrre la cifra iniziale utilizzata per costruirlo. Puoi presumere che l'input sarà sempre un numero costruito e sarà maggiore di . Può essere una singola cifra, che viene mappata su se stessa.0

È possibile accettare input in qualsiasi modo ragionevole, anche come elenco di cifre, come stringa ecc. È accettabile (sebbene non raccomandato) accettare input in modo unario o qualsiasi altra base di propria scelta.

Questo è un quindi vince il codice più corto!

Casi test

       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

o come due elenchi:

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

Quando ho pubblicato questa sfida, non mi rendevo conto che potesse essere semplificato così tanto dal metodo utilizzato nella risposta di Grimy , e quindi sarei molto interessato alle risposte che adottano un approccio più matematico per risolvere questo, piuttosto che una "cifra" trucco (ovviamente tutte le risposte valide sono ugualmente valide, proprio quello che mi interesserebbe vedere).


Posta sandbox . Ho una soluzione a 9 byte in Jelly, se qualcuno vuole sfidarlo.
caird coinheringaahing

Risposte:


26

05AB1E , 7 5 4 byte

>9*н

Provalo online!

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

6
Hmm, questo non è di buon auspicio per questa sfida se può essere semplificato così facilmente
caird coinheringaahing

9
Hai circa 1 byte di codice per 800 byte di spiegazione della sfida. : p
Arnauld

1
Come trovi la soluzione e perché è corretta?
Gioele,

7
@Gioca il termine (n-1) della sequenza che inizia con a is a * (((10**n - 1) / 9 - n) / 9). Moltiplicalo per 9 e aggiungi a*n, e otterrai a * ((10**n - 1) / 9), alias il numero, ripetute n volte. Risulta aggiungendo 9 invece di a*nopere per n = 1, e per n maggiore la differenza costante è trascurabile accanto alla crescita esponenziale.
Grimmy,

3
@Grimy Grazie mille per la spiegazione. Forse puoi metterlo nel tuo post.
Joel

3

MathGolf , 6 byte

)9*▒├Þ

Provalo online!

Sfortunatamente, non c'è nessuna headoperazione in MathGolf, quindi devo accontentarmi ▒├Þdi convertire in stringa, fare pop da sinistra e scartare tutto tranne lo stack.





2

Carbone , 7 byte

§I×⁹⊕N⁰

Provalo online! Il collegamento è alla versione dettagliata del codice. Metodo @ Grimy ovviamente. Ecco un approccio matematico a 27 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Arresti anomali su input non validi. Spiegazione:

Nθ

Immettere il numero costruito.

W¬№Eχ×κ↨υχθ

Interpreta l'elenco come numero nella base 10, moltiplica per tutti i numeri da 0a 9e controlla se viene visualizzato il numero costruito.

⊞υLυ

Spingere la lunghezza della lista su se stessa. L'elenco diventa quindi della forma [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Ricrea i numeri costruiti ma questa volta trova e visualizza l'indice in cui è apparso il numero di input.



2

Spazio bianco , 108 byte

[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]

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.

Porto di @Grimy risposta 05AB1E s' , solo che io non ho un incorporato per ottenere la prima cifra. ;)

Provalo online (solo con spazi non elaborati, schede e nuove righe).

Spiegazione in pseudo-codice:

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 byte

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

Provalo online!

Porto di Grimy 's risposta 05AB1E


Python 3 , 74 byte

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

Provalo online!

Spiegazione

Funzione ricorsiva. Scorre la sequenza per ogni cifra l, iniziando da 1. Se l'ingresso iè uguale all'iterazione corrente j, lviene restituita la cifra corrispondente . Altrimenti, se il valore corrente jnella sequenza supera il valore di input i, aumenterà la cifra le ricomincerà. L'argomento kviene utilizzato per aumentare il fattore di moltiplicazione.


1

JavaScript (ES6),  16  15 byte

Grazie a @Grimy per aver risolto il vincolo a 32 bit che avevo con la versione precedente.

Usando l'incantesimo magico di Grimy . Accetta l'input come stringa.

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

Provalo online!


JavaScript (ES6), 53 byte

Approccio ingenuo alla forza bruta.

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

Provalo online!


-~n*9può essere n*9+9, che è lo stesso bytunt, ma dovrei sbarazzarmi della limitazione a 32 bit se ho capito bene.
Grimmy,

la forza bruta lavora per un> = 10, come14808
Nahuel Fouilleul il

1
@NahuelFouilleul se consideriamo a> = 10, la risposta non è più unica (14808 potrebbe essere il 4 ° termine di a = 12 o il primo termine di a = 14808). Se l'output di uno di questi è consentito, n=>nfunziona per tutti gli input.
Grimmy,

1

Java 8, 23 byte

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

Porto di @Grimy 's risposta 05AB1E , quindi assicuratevi di upvote lui!

Provalo online.

Ma poiché mi sento un po 'male per @cairdCoinheringaahing , qui un approccio a forza bruta con un po' più economico ( 83 byte ):

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;}

Provalo online.

Spiegazione:

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

Gelatina , 8 byte

RRḌ÷@fⱮ9

Provalo online!

Un programma completo che accetta un numero intero e stampa la cifra iniziale. Non usa il metodo intelligente di Grimy! Terribilmente inefficiente per input più grandi. La seguente versione gestisce tutti i casi di test ma è un byte più lungo:

Gelatina , 9 byte

DJRḌ÷@fⱮ9

Provalo online!



0

Keg -rr , 4 byte

⑨9*÷

Provalo online!

Naturalmente, utilizza lo stesso approccio della risposta 05AB1E. Utilizza anche il nuovo -rrflag (reverse e print raw).

Transpiles a:

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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.