La più piccola base Zeroless


28

Dato un numero intero positivo n, genera la base più piccola in b >= 2cui la rappresentazione di nin base bsenza zero iniziale non contiene a 0. Si può presumere che b <= 256per tutti gli input.

Casi test

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])

1
Quali sono i valori di dieci, undici, ecc. Nelle basi superiori che stai usando? Contengono zero?
Stephen,

19
@Stephen I valori scelti per le cifre sopra 9non contano, perché non lo sono 0.
Mego,

9
Questo è OEIS A106370 .
Ingegnere Toast,

1
@Titus Questo è un buon punto. Limiterò la base a qualcosa di ragionevole.
Mego,

1
@Mego: prova 232792560. Sono i mcm di 2,3, ..., 20, quindi in ogni base <= 20 ha uno 0 come cifra meno significativa.
Nate Eldredge,

Risposte:


15

Pyth , 6 byte

f*FjQT

Verifica tutti i casi di test.

Come funziona

f * FjQT ~ Programma completo.

f ~ Primo numero intero positivo in cui la condizione è vera.
   jQT ~ L'input convertito in base dell'elemento corrente.
 * F ~ Prodotto. Se l'elenco contiene 0, allora è 0, altrimenti è strettamente positivo.
          0 -> Falsy; > 0 -> Verità.
        ~ Emette implicitamente il risultato.

Sebbene Pyth's ffunzioni su 1, 2, 3, 4, ...(a partire da 1), Pyth tratta i numeri nella base 1 (unario) come un gruppo di zeri, quindi la base 1 viene ignorata.


Bel abuso del fatto che la rappresentazione di base 1 di Pyth è zero.
Erik the Outgolfer,

@EriktheOutgolfer Grazie! Aggiungerò una spiegazione al riguardo.
Mr. Xcoder,

Pyth non è la sola lingua la cui rappresentazione unaria utilizza zero come suggerimento per le cifre : P
Mego

Hai scritto 0 -> Falsy; > 0 -> Truthy. È che intenzionale che 0è allo stesso tempo Truthye Falsyin quella situazione?
Brian J,

@BrianJ C'è un >segno davanti al secondo 0, il che significa che tutto ciò che è superiore a 0 è veritiero.
Mr. Xcoder,

11

C,  52  50 byte

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

Provalo online!

C (gcc),  47  45 byte

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

Provalo online!


Due byte salvati grazie al suggerimento di @ Nevay sulla risposta di @Kevin Cruijssen!


2
L'ultima versione funziona solo per fortuna, anche se insisti su un compilatore specifico. E, naturalmente, nessuna delle due versioni è in realtà C.
AnT

3
@AnT è C .. darà molti avvertimenti ma verrà compilato. finché trovi un compilatore che funziona per il tuo codice, stai bene
Felipe Nardi Batista,

1
@Blacksilver k%iè un controllo ternario qui. Una variante più leggibile sarebbe k=(k%i?k:n*++i);o anche più chiaramente: if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen,

1
Inoltre, puoi giocare a golf con entrambi 2 byte: i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}e i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Tutto il merito va a @Nevay che ha pubblicato questo suggerimento sulla mia risposta Java 8 con port .
Kevin Cruijssen,

1
@Felipe Nardi Batista: sono consapevole del fatto che le regole di CodeGolf dicono "fintanto che si compila" e così via. Tuttavia, il fatto che si "compili" non prova in alcun modo che sia C. Questo non è C. Dichiarazioni tipografiche come i, k;ed f(n)esistevano nelle antiche versioni di C (K&R), ma solo nell'era in cui erano returnrichieste parentesi tonde attorno al suo discussione. Se vuoi usare K&R con i,k;, devi anche usare return(i);. Quanto sopra potrebbe essere gnuc, ma non C.
AnT

8

Haskell , 56 52 48 byte

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

Provalo online!

Abbastanza semplice ma non riesco a pensare a nessun buon modo per accorciarlo

EDIT: Grazie a Laikoni per avermi salvato 4 byte! Non so perché non ci abbia mai pensato !!0. Probabilmente avrei dovuto provare a rimuovere quelle parentesi ma ho vaghi ricordi di qualche strano errore quando provi a usare ||e &&insieme. Forse lo confondo con gli operatori di uguaglianza.

EDIT 2: Grazie @Lynn per la rasatura di altri 4 byte! Non so come non ho mai saputo untilprima d'ora.


1
Mi hai battuto un minuto con quasi esattamente la stessa soluzione. :) !!0è più breve di heade penso che puoi inserire la parentesi #.
Laikoni,

2
Il criminale sottovalutato until :: (a → Bool) → (a → a) → a → asalva quattro byte:f n=until(#n)(+1)2
Lynn,


6

Buccia , 7 byte

→V▼MBtN

Provalo online!

Spiegazione

→V▼MBtN
     tN    list of natural numbers starting from 2
   MB      convert the (implicit) input to each of those bases
 V▼        find the (1-based) index of the first result where the minimum digit is truthy
→          add 1 to this index

5

Python 2 , 57 byte

n=x=input()
b=2
while x:z=x%b<1;b+=z;x=[x/b,n][z]
print b

Provalo online!

Questo è un byte più corto di una funzione ricorsiva:

f=lambda n,b=1,x=1:b*(x<1)or f(n,b+(x%b<1),[x/b,n][x%b<1])

1
A proposito questo è abbastanza simile alla mia soluzione.
Erik the Outgolfer,



3

Buccia , 9 byte

←foΠ`B⁰tN

Provalo online!

Spiegazione

            -- input N
        tN  -- tail of [1..] == [2..]
←f(    )    -- filter with the following:
    `B⁰     --   convert N to that base
   Π        --   product (0 if it contains 0)
←           -- only keep first element

3

Java 8, 61 56 54 byte

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

Provalo qui.

Spiegazione:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

Ho la sensazione che questo possa essere giocato usando un approccio aritmetico. Può davvero, con una porta della risposta C di @Steadybox , e poi giocato a golf di 2 byte grazie a @Nevay .

Vecchia risposta ( 61 byte ):

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

Provalo qui.

Spiegazione:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method

2
54 byte:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay,

2

Japt , 8 byte

@ìX e}a2

Provalo online!

Spiegazione

@    }a2

Restituisce il primo numero ( X) per passare la funzione, a partire da2

ìX

Converti il ​​numero di input in un array di Xcifre base .

e

Controlla se tutte le cifre sono veritiere.


Non fallirà se l'array contiene multipli di 10?
Shaggy,

@Shaggy La mia comprensione era che, secondo il commento dei PO, le cifre per le basi sopra 9 non contano come zero.
Justin Mariner,

Ah, lo vedo adesso. C'è un problema con il fraseggio della sfida, quindi (o sono solo troppo stanco!).
Shaggy,

2

JavaScript (ES6), 43 41 37 byte

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

Casi test



2

Python 2 , 57 byte

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

Provalo online!

-1 grazie a Felipe Nardi Batista .
-2 grazie a Lynn (e ora questo è un inganno della sua soluzione: D)


59 byte cambiando a,b=a+c,dina+=c;b=d
Felipe Nardi Batista il

Penso che puoi sostituirlo while m>1con while m(e poi siamo in parità!)
Lynn,

@Lynn Ecco perché ho commentato la tua soluzione, sarebbe esattamente la stessa allora.
Erik the Outgolfer,


1
@Lynn lo sapevo già: p altrimenti ti avrei chiesto di cancellare il tuo.
Erik the Outgolfer,

2

APL (Dyalog) , 20 19 byte

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

Provalo online!

Come al solito, grazie a @ Adám per l'aiuto nella chat e per far funzionare il codice in TIO. Inoltre, salvando 1 byte.

Questo è tradfn ( trad itional f unctio n ) del corpo. Per usarlo, devi assegnargli un nome (che si trova nel campo di intestazione di TIO), racchiuderlo in s (uno prima del nome e uno nel campo di piè di pagina di TIO), quindi chiamarlo usando il suo nome. Poiché utilizza un quad ( ) per accettare l'input dell'utente, viene chiamato come al f \n inputposto del solitof input

Come?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

La funzione quindi restituisce la base risultante.


1
Suggerimento per il golf: dato n←⎕che sarà un numero semplice e che è necessario 1come argomento iniziale per il resto del codice, puoi semplicemente contare il numero di elementi in n(che è 1), sostituendolo 1⊣con . Provalo online!
Adám,


1

R , 79 71 66 63 65 byte

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

Provalo online!

Questa risposta si basa sulla riorganizzazione di Giuseppe in un unico ciclo.

Risparmiato 8 byte grazie a JDL e 6 byte grazie a Giuseppe.


1
È possibile sub bper T, che inizia definito come TRUE == 1, eliminando la necessità di b=1. Allo stesso modo è possibile sub Fper k( Fis FALSE)
JDL

Vedo quello che hai fatto lì. È utile da sapere!
NofP,

1
66 byte utilizzando m%/%T(divisione intera) invece di(m-m%%T)/T
Giuseppe

65 byte . era un po 'disordinato ma sospettavo che sbarazzarsi degli anelli annidati avrebbe salvato qualcosa ; Ho pensato che sarebbe stato più di 1 byte :(
Giuseppe

1

MATL , 13 12 byte

`G@Q_YAA~}@Q

Provalo online!

-1 byte grazie a Luis Mendo. Questo programma non gestisce testcase più grandi di 2 ^ 53 ( flintmax, il numero intero consecutivo massimo rappresentabile da un tipo a virgola mobile), poiché il tipo di dati predefinito è doublein MATL. Tuttavia, dovrebbe essere in grado di trovare qualsiasi base arbitraria arbitraria sotto quel numero.

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.

@LuisMendo Dovrei davvero iniziare a leggere meglio i documenti. Grazie.
Sanchises,

Questo non sembra funzionare per i casi di test più grandi, ma non so abbastanza su MATL / Matlab per sapere se è causato o meno da limiti di numeri interi.
Mego,

@Mego Ho testato la mia versione a 13 byte che dovrebbe essere equivalente alla versione corrente fino a 1e6, su MATLAB R2017a. Quale configurazione di test ti ha causato problemi?
Sanchises,

Gli ultimi 2 casi di test causano errori.
Mego,

@Mego Ah non avevo mai visto quelle prove prima. Ciò è dovuto all'implementazione dei MATL che YAutilizzano i doppi internamente, quindi può gestire solo input fino al numero intero consecutivo massimo rappresentabile da un doppio (vedi flintmax). Questo invalida la risposta? In linea di principio l'algoritmo funziona per una base arbitraria, ho esplicitamente aggirato un altro comando che farebbe solo fino alla base 36.
Sanchises,

0

PHP, 59 + 1 byte

utilizzando builtins , max base 36:

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

nessun builtin, 63 60 + 1 byte , qualsiasi base:

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

Esegui come pipe -nRo provali online .



0

J, 26 byte

]>:@]^:(0 e.]#.inv[)^:_ 2:

Mi piacerebbe sapere se questo può essere migliorato.

Il verbo principale è una frase diadica:

>:@]^:(0 e.]#.inv[)^:_

a cui viene dato l'input a sinistra e la costante 2 a destra. La frase del verbo principale usa quindi il costrutto Do..While di J, incrementando l'argomento y giusto fintanto che 0 è un elemento e.dell'argomento originale nella base y.

Provalo online!



0

Via Lattea , 38 byte

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

utilizzo: ./mw base.mwg -i 3


Spiegazione

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

Sono sicuro che questo può essere abbreviato usando un ciclo while anziché un ciclo for, ma non sono riuscito a farlo funzionare.



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.