Piega il numero intero per risparmiare spazio!


20

Il folle matematico possiede una vasta collezione di numeri, e quindi lo spazio che ha lasciato è piuttosto limitato. Per salvarne un po ', deve piegare i suoi numeri interi, ma sfortunatamente è davvero pigro. Il tuo compito, se desideri aiutarlo, è creare una funzione / programma che pieghi un dato intero positivo per il nostro maniaco numerico.

Come piegare un numero intero?

Se è uniformemente divisibile per la somma delle sue cifre, dividerlo per la somma delle sue cifre. Se non soddisfa tale requisito, prendi il resto quando diviso per la somma delle sue cifre. Ripeti il ​​processo fino a quando il risultato non raggiunge 1. Il numero intero piegato è il numero di operazioni che è stato necessario eseguire. Facciamo un esempio (diciamo 1782):

  1. Ottenere la somma delle sue cifre: 1 + 7 + 8 + 2 = 18. 1782è uniformemente divisibile per 18, quindi il numero successivo è 1782 / 18 = 99.

  2. 99Non è divisibile per 9 + 9 = 18, quindi prendiamo il resto: 99 % 18 = 9.

  3. 9è ovviamente divisibile per 9, quindi lo dividiamo e otteniamo 1.

Il risultato è 3perché sono necessarie 3 operazioni per raggiungere 1.

Regole e specifiche

  • Alcuni numeri interi possono avere la somma di cifre pari a 1, come 10o 100. Non è necessario che il tuo programma gestisca tali casi. Ciò significa che ti verrà garantito che il numero intero indicato come input non ha la somma delle cifre uguale a 1, e nessuna operazione con il numero intero dato si tradurrà in un numero la cui somma delle cifre è 1(tranne che per 1se stesso, che è il " bersaglio"). Ad esempio, non riceverai mai 10o 20come input.

  • L'input sarà un numero intero positivo maggiore di 1.

  • Si applicano le lacune predefinite .

  • Puoi prendere input e fornire output con qualsiasi media standard .


Casi test

Ingresso -> Uscita

2 -> 1
5 -> 1
9 -> 1
18 -> 2
72 -> 2
152790 -> 2
152 -> 3
666 -> 3
777 -> 3
2010 -> 3
898786854 -> 4

Ecco un programma che ti consente di visualizzare il processo e provare altri casi di test.


Questo è , quindi vince il codice più corto in ogni lingua (segnato in byte)!


Ispirato da questa sfida , anche se all'inizio potrebbe non sembrare correlato.
Mr. Xcoder,

3
Funzionerà come soluzione di stopgap, ma a lungo termine, il matematico dovrebbe davvero prendere in considerazione l'acquisto di uno degli hotel di Hilbert . Puoi sempre trovare una stanza inutilizzata in una di quelle.
Ray,

mentre 8987868546è un input valido, romperà il tuo strumento di test e anche molte (se non tutte) le risposte ...
Mischa

@MischaBehrend Il tuo esempio non è un input valido. Penso che tu abbia copiato male il mio ultimo test case. L'input valido è stato 898786854no 8987868546(hai aggiunto 6a alla fine)
Mr. Xcoder il

nvm ... dovresti leggere tutta la prima regola ... lasciandola qui così sai perché ho pensato che fosse valida: non era un errore ... l'ho cambiata intenzionalmente per testare questi script ... e leggere le regole è un input valido. La somma di tutte le cifre in 8987868546 non è 1 ( regola 1 soddisfatta ) ed 8987868546è un numero intero positivo superiore a 1 ( regola 2 soddisfatta ).
Mischa,

Risposte:


6

05AB1E , 13 12 byte

[¼DSO‰0Kθ©#®

Provalo online!

Spiegazione

[               # start loop
 ¼              # increment counter
  D             # duplicate current value
   SO           # sum the digits in the copy
     ‰          # divmod the current value by its digit-sum
      0K        # remove 0 from the resulting list
        θ       # pop the last element
         ©      # store a copy in register
          #     # if the current value is 1, break
           ®    # push the copy from register
                # implicitly output counter


5

Haskell, 85 78 byte

f 1=0
f n|r<1=1+f(n`div`s)|1<2=1+f r where s=sum(read.pure<$>show n);r=n`rem`s

Risparmiato 7 byte grazie a Bruce Forte.

Provalo online.


Salvare qualche altro byte usando divMode rilasciando where: Provalo online!
Laikoni,

@Laikoni Wow, è un bel miglioramento! Si prega di pubblicarlo come risposta diversa; è abbastanza diverso dal mio. A proposito: stavo cercando un trucco per sbarazzarmi di where. Lo userò in futuro. :)
Cristian Lupascu,

sum[read[d]|d<-show n]salva un byte
nimi

5

JavaScript (ES6), 66 58 51 49 byte

Accetta l'input come numero intero. Restituisce falseper 0o 1e genera un errore di overflow quando rileva un numero le cui cifre si sommano 1.

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1
  • 8 byte salvati con l'aiuto di Justin .

Provalo

o.innerText=(

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

)(i.value=898786854);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


1
Potresti salvare alcuni byte sommando le cifre usando eval(array.join`+`)?
Justin Mariner,

Potrei davvero, @JustinMariner - mi hai fatto impazzire! Grazie :)
Shaggy,

4

Buccia , 12 byte

←€1¡Ṡ§|÷%oΣd

Provalo online!

Spiegazione

←€1¡Ṡ§|÷%oΣd  Implicit input, e.g. n=1782
    Ṡ§|÷%oΣd  This part defines the transformation.
         oΣ   Sum of
           d  digits: s=18
    Ṡ   %     n mod s: 0
     §|       or (take this branch if last result was 0)
       ÷      n divided by s: 99
   ¡          Iterate the transformation: [1782,99,9,1,1,1,...
 €1           Index of 1 (1-based): 4
←             Decrement: 3
              Print implicitly.



2

Retina , 100 byte

$
;
{`(.+);
$1$*1;$&
(?<=;.*)\d(?=.*;)
$*
.*;1;(.*)
$.1
r`(1)*(\3)*;(1+);
$#1;$#2;1
0;(.*);|;.*;
$1;

Provalo online! Il collegamento include solo casi di test più piccoli poiché quelli più grandi impiegano troppo tempo.


2

Mathematica, 73 byte

(t=#;For[r=0,t>1,r++,If[(s=Mod[t,g=Tr@IntegerDigits@t])<1,t=t/g,t=s]];r)&

Può ==0essere sostituito con <1?
Mr. Xcoder,

@ Mr.Xcoder sì, certo! Ho realizzato una versione selezionatrice ...
J42161217

2

PHP, 68 + 1 byte

uscita unaria:

for($n=$argn;$n>1;$n=$n%($s=array_sum(str_split($n)))?:$n/$s)echo 1;

uscita decimale, 73 + 1 byte:

for($n=$argn;$n>1;$i++)$n=$n%($s=array_sum(str_split($n)))?:$n/$s;echo$i;

Esegui come pipe con -nRo provalo online .


L'operatore Elvis richiede PHP 5.3 o successivo. Per PHP più vecchi, sostituiscili ?:con ?$n%$s:(+5 byte).


2

Rubino, 46 ​​byte

f=->n{s=n.digits.sum;n<2?0:1+f[n%s<1?n/s:n%s]}

2

Haskell , 94 93 89 88 byte

Sembra molto lungo ..

length.fst.span(/=1).iterate g
g x|(d,m)<-x`divMod`sum[read[d]|d<-show x]=last$m:[d|m<1]

Provalo online!

Grazie @Laikoni & @nimi per il golf off da 1 byte ciascuno!





1

Perl, 71 byte, 64 byte, 63 byte

-pl

$c=0;while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c};$_=$c

Provalo online

EDIT: salvato 7 byte, grazie al commento di Xcali

-p

while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

EDIT: da 5.14 sostituzione non distruttiva s /// r

-pl

while($_>1){$s=eval s/\B/+/gr;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

Si -plsuppone invece che il top sia un flag della riga di comando?
Erik the Outgolfer

sì, sono opzioni perl
Nahuel Fouilleul,

Dovresti contare la -plbandiera in base a questo post .
Erik the Outgolfer

Ho contato 69 byte +2 per le opzioni pl, è corretto?
Nahuel Fouilleul,

Puoi giocare a golf un po '. $cnon ha bisogno di essere inizializzato. Inizierà a partire da undef0. Il punto e virgola dopo la chiusura di while può andare. Inoltre, non è necessario -l. Non è necessario prendere più input in una volta.
Xcali,

1

Dyalog APL, 36 byte

{x←+/⍎¨⍕⍵⋄1=⍵:00=x|⍵:1+∇⍵÷x1+∇x|⍵}

Provalo online!

Come?

{
   x←+/⍎¨⍕⍵       x = digit sum
   1=⍵:0          if arg = 1: bye
   0=x|⍵:1+∇⍵÷x   if arg divisible by x: recurse with arg/x
   1+∇x|⍵         recurse with arg mod x
}

1

Gaia , 13 byte

-@{:ΣZ¤∨)‡}°\

Provalo online!

Spiegazione

-              Push -1 (this will be the counter)
 @             Push input (the starting number)
  {:ΣZ¤∨)‡}°   Repeat this block until the results of 2 consecutive runs are the same:
   :            Copy the number
    Σ           Digital sum
     Z          Divmod number by digital sum
      ¤         Swap
       ∨        Logical or: left-most non-zero out of (number mod sum, number div sum)
        )‡      Increment the counter
            \  Delete the final 1, implicitly print the counter

1

Matlab, 150 byte

function[d]=X(x) 
d=0;while ~strcmp(x,'1')z='sum(str2num(x(:)))';a=eval(['rem(',x,',',z,')']);y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));x=y;d=d+1;end

Gli input dovrebbero essere dati alla funzione come una stringa, come X ('152').

La funzione funziona durante il ciclo e l'incremento d. Ilx=y; riga era necessaria per evitare un errore di Matlab nel tentativo di leggere e sovrascrivere un valore variabile allo stesso tempo, apparentemente, che era nuovo per me.

Ungolfed:

function[d]=X(x) 
d=0;
while ~strcmp(x,'1')
    z='sum(str2num(x(:)))';
    a=eval(['rem(',x,',',z,')']);
    y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));
    x=y;
    d=d+1;
end


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.