La plus petite base sans zéro


28

Étant donné un entier positif n, affichez la plus petite base b >= 2où la représentation de nin base bsans zéros non significatifs ne contient pas a 0. Vous pouvez supposer que b <= 256pour toutes les entrées.

Cas de 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
Quelles sont les valeurs de dix, onze, etc. dans les bases supérieures que vous utilisez? Contiennent-ils des zéros?
Stephen

19
@Stephen Les valeurs choisies pour les chiffres ci 9- dessus n'ont pas d'importance, car elles ne le sont pas 0.
Mego

9
Il s'agit d'OEIS A106370 .
Ingénieur Toast

1
@Titus C'est un bon point. Je limiterai la base à quelque chose de raisonnable.
Mego

1
@Mego: Essayez 232792560. C'est le ppcm de 2,3, ..., 20, donc dans chaque base <= 20, il a un 0 comme chiffre le moins significatif.
Nate Eldredge

Réponses:


15

Pyth , 6 octets

f*FjQT

Vérifiez tous les cas de test.

Comment ça marche

f * FjQT ~ Programme complet.

f ~ Premier entier positif où la condition est vraie.
   jQT ~ L'entrée convertie en base de l'élément courant.
 * F ~ Produit. Si la liste contient 0, alors c'est 0, sinon elle est strictement positive.
          0 -> Falsy; > 0 -> Truthy.
        ~ Afficher le résultat implicitement.

Bien que Pyth ffonctionne sur 1, 2, 3, 4, ...(à partir de 1), Pyth traite les nombres en base 1 (unaire) comme un groupe de zéros, donc la base 1 est ignorée.


Bon abus du fait que la représentation de base 1 de Pyth est entièrement composée de zéros.
Erik the Outgolfer

@EriktheOutgolfer Merci! J'ajouterai une explication à ce sujet.
M. Xcoder,

Pyth n'est pas le seul langage dont la représentation unaire utilise des zéros comme indice des chiffres : P
Mego

Vous avez écrit 0 -> Falsy; > 0 -> Truthy. Est-ce intentionnel qui 0est à la fois Truthyet Falsydans cette situation?
Brian J

@BrianJ Il y a un >signe devant le second 0, ce qui signifie que tout ce qui est supérieur à 0 est vrai.
M. Xcoder

11

C,  52  50 octets

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

Essayez-le en ligne!

C (gcc),  47  45 octets

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

Essayez-le en ligne!


Deux octets enregistrés grâce à la suggestion de @ Nevay sur la réponse de @Kevin Cruijssen!


2
Cette dernière version ne fonctionne que par hasard, même si vous insistez sur un compilateur spécifique. Et, bien sûr, aucune des versions n'est vraiment C.
AnT

3
@AnT c'est C .. cela donnera beaucoup d'avertissements mais il compilera. tant que vous trouvez un compilateur qui fonctionne pour votre code, tout va bien
Felipe Nardi Batista

1
@Blacksilver k%iest un test ternaire ici. Une variante plus lisible serait k=(k%i?k:n*++i);ou encore plus clairement: if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen

1
En outre, vous pouvez jouer au golf à la fois sur 2 octets: i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}et i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Tout le mérite revient à @Nevay qui a posté cette suggestion sur ma réponse Java 8 portée .
Kevin Cruijssen

1
@Felipe Nardi Batista: Je suis conscient du fait que les règles de CodeGolf disent "tant qu'il compile" et ainsi de suite. Cependant, le fait qu'il "compile" ne prouve en aucun cas qu'il s'agit de C. Ce n'est pas des déclarations sans type C. comme i, k;et f(n)existaient dans les anciennes versions de C (K&R), mais seulement à l'époque où des returncrochets autour de son argument. Si vous souhaitez utiliser K&R avec i,k;, vous devez également utiliser return(i);. Ce qui précède pourrait être gnuc, mais pas C.
AnT

8

Haskell , 56 52 48 octets

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

Essayez-le en ligne!

Assez basique mais je ne vois pas de bonnes façons de le raccourcir

EDIT: Merci à Laikoni de m'avoir sauvé 4 octets! Je ne sais pas pourquoi je n'y ai jamais pensé !!0. J'aurais probablement dû essayer de supprimer ces parenthèses, mais j'ai de vagues souvenirs d'une erreur étrange lorsque vous essayez d'utiliser ||et&& ensemble. Peut-être que je le confond avec les opérateurs d'égalité.

EDIT 2: Merci @Lynn pour avoir rasé encore 4 octets! Je ne sais pas comment je ne l'ai jamais su untilauparavant.


1
Vous m'avez battu d'une minute avec presque exactement la même solution. :) !!0est plus court que headet je pense que vous pouvez déposer la parenthèse #.
Laikoni

2
Le criminellement sous-estimé until :: (a → Bool) → (a → a) → a → aenregistre quatre octets:f n=until(#n)(+1)2
Lynn


6

Husk , 7 octets

→V▼MBtN

Essayez-le en ligne!

Explication

→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




3

Coque , 9 octets

←foΠ`B⁰tN

Essayez-le en ligne!

Explication

            -- 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 octets

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

Essayez-le ici.

Explication:

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

J'ai l'impression que cela peut être joué au golf en utilisant une approche arithmétique. Il peut en effet, avec un port de réponse @Steadybox 'C , puis jouer au golf de 2 octets grâce à @Nevay .

Ancienne ( 61 octets ) réponse:

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

Essayez-le ici.

Explication:

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 octets:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japt , 8 octets

@ìX e}a2

Essayez-le en ligne!

Explication

@    }a2

Renvoie le premier nombre ( X) pour passer la fonction, en commençant par2

ìX

Convertissez le numéro d'entrée en un tableau de Xchiffres de base .

e

Vérifiez si tous les chiffres sont véridiques.


Cela n'échouera-t-il pas si le tableau contient un multiple de 10?
Shaggy

@Shaggy J'ai cru comprendre, selon les commentaires des OP, que les chiffres des bases supérieures à 9 ne comptent pas comme zéro.
Justin Mariner du

Ah, je vois ça maintenant. Il y a un problème avec la formulation du défi, alors (ou je suis juste trop fatigué!).
Shaggy

2

JavaScript (ES6), 43 41 37 octets

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

Cas de test



2

Python 2 , 57 octets

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

Essayez-le en ligne!

-1 merci à Felipe Nardi Batista .
-2 merci à Lynn (et maintenant c'est une dupe de sa solution: D)


59 octets en changeant a,b=a+c,dpoura+=c;b=d
Felipe Nardi Batista

Je pense que vous pouvez remplacer while m>1par while m(et alors nous sommes à égalité!)
Lynn

@Lynn C'est pourquoi j'ai commenté votre solution, ce serait alors exactement la même chose.
Erik the Outgolfer


1
@Lynn que je connaissais déjà: p sinon je vous aurais demandé de supprimer le vôtre.
Erik the Outgolfer

2

APL (Dyalog) , 20 19 octets

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

Essayez-le en ligne!

Comme d'habitude, merci à @ Adám d'avoir aidé dans le chat et d'avoir fait fonctionner le code dans TIO. En outre, économiser 1 octet.

Ceci est tradfn ( trad itional f unctio n corps). Pour l'utiliser, vous devez lui attribuer un nom (qui se trouve dans le champ d'en-tête de TIO), l'enfermer dans s (un avant le nom et un dans le champ de pied de page de TIO), puis l'appeler en utilisant son nom. Puisqu'il utilise un quad ( ) pour prendre l'entrée de l'utilisateur, il est appelé comme f \n inputau lieu de l'habituelf input

Comment?

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 fonction renvoie ensuite la base résultante.


1
Astuce golf: étant donné qu'il n←⎕s'agira d'un simple nombre et que vous avez besoin 1comme argument initial pour le reste du code, vous pouvez simplement compter le nombre d'éléments dans n(qui est 1), en remplaçant 1⊣par . Essayez-le en ligne!
Adám


1

R , 79 71 66 63 65 octets

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

Essayez-le en ligne!

Cette réponse est basée sur le réarrangement de Giuseppe en une seule boucle.

8 octets enregistrés grâce à JDL et 6 octets grâce à Giuseppe.


1
Vous pouvez sous bpour T, qui commence défini comme TRUE == 1, supprimant le besoin de b=1. De même, vous pouvez vous abonner Fpour k( Fest FALSE)
JDL

Je vois ce que tu as fait là. C'est utile à savoir!
NofP

1
66 octets utilisant m%/%T(division entière) au lieu de(m-m%%T)/T
Giuseppe

65 octets . c'était un peu désordonné mais je soupçonnais que se débarrasser des boucles imbriquées sauverait quelque chose ; Je pensais juste que ce serait plus d'un octet :(
Giuseppe

1

MATL , 13 12 octets

`G@Q_YAA~}@Q

Essayez-le en ligne!

-1 octet merci à Luis Mendo. Ce programme ne gère pas les cas de test supérieurs à 2 ^ 53 ( flintmax, l'entier consécutif maximum représentable par un type à virgule flottante), car le type de données par défaut est doubleen MATL. Cependant, il devrait être en mesure de trouver une base arbitraire sans zéro en dessous de ce nombre.

`            % 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 Je devrais vraiment commencer à mieux lire les documents. Merci.
Sanchises

This doesn't seem to work for the larger test cases, but I don't know enough about MATL/Matlab to know if that's caused by integer limits or not.
Mego

@Mego I tested my 13 byte version which should be equivalent to the current version up to 1e6, on MATLAB R2017a. What test setup resulted in problems for you?
Sanchises

The last 2 test cases cause errors.
Mego

@Mego Ah, je n'ai jamais vu ces tests avant. Cela est dû à l'implémentation des MATL YAutilisant des doubles en interne, de sorte qu'il ne peut gérer que les entrées jusqu'au nombre entier consécutif maximum représentable par un double (voir flintmax). Est-ce que cela invalide la réponse? En principe, l'algorithme fonctionne pour une base arbitraire, j'ai explicitement travaillé autour d'une autre commande qui ne ferait que jusqu'à la base 36.
Sanchises

0

PHP, 59 + 1 octets

en utilisant des éléments intégrés , base max 36:

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

pas de builtins, 63 60 + 1 octets , n'importe quelle base:

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

Exécuter en tant que pipe avec -nRou essayez-les en ligne .



0

J, 26 bytes

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

Would love to know if this can be improved.

The main verb is a the dyadic phrase:

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

which is given the input on the left and the constant 2 on the right. That main verb phrase then uses J's Do..While construct, incrementing the right y argument as long as 0 is an element of e. the original argument in base y.

Try it online!



0

Milky Way, 38 bytes

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

usage: ./mw base.mwg -i 3


Explanation

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.

I'm sure this can be shortened using a while-loop instead of a for loop, but I couldn't get it to work.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.