S'agit-il d'un nombre à trois chiffres se terminant par un?


27

Étant donné un entier non négatif, indiquez s'il s'agit d'un nombre à trois chiffres se terminant par un, dans une base entière cohérente. En d'autres termes, le nombre doit être représenté en base-N, N étant un entier supérieur à zéro.

Règles

  • C'est le , donc la réponse la plus courte l'emporte.
  • Comme unaire se comporte bizarrement, le comportement avec l'entrée 3 10 n'est pas défini.
  • Les failles standard sont interdites.

Exemples

Vrai:

5   
73  
101 
1073
17
22
36
55
99  

Faux:

8
18
23
27
98
90
88
72
68

Une poignée de grands nombres:

46656 true
46657 true
46658 true
46659 true
46660 true
46661 false
46662 false
46663 true
46664 false
46665 true
46666 true
46667 false
46668 false
46669 false
46670 true
46671 true

1
Depuis unaire se comporte bizarrement pas, il ne se comporte pas bizarrement, la représentation unaire d'un entier non négatif nest juste n 1est, par exemple 0 = ()₁, 3 = (111)₁, 10 = (1111111111)₁, etc.
Erik le Outgolfer

6
@EriktheOutgolfer Il se comporte très différemment; vous ne pouvez pas diviser par 1 à n-itshift, par exemple.
wizzwizz4

3
Que signifie une base entière cohérente ? (De plus, au lieu d'exclure unaire dans les règles, vous pouvez simplement spécifier N ≥ 2.)
Lynn

1
@Lynn Une notation positionnelle avec un seul radix, par exemple la base dix, par opposition à un radix dépendant de la position comme vous le voyez avec les unités impériales ou le temps.
HAEM

1
@Lynn comme addendum, j'essayais également d'exclure les bases rationnelles, négatives, complexes, etc. Quant à votre deuxième point, la règle concernant l'unaire ne vise ni à inclure ni à exclure unaire. À moins que ma compréhension du langage juridique ne soit encore plus faible que je ne le pensais, "comportement indéfini" signifie "tout ce que la partie implante veut", ce que je recherchais.
HAEM

Réponses:


10

Gelée , 7 octets

bRṫ€3ċJ

Renvoie le nombre de bases (non nul étant vrai, zéro étant faux) dans lesquelles l'entrée est un nombre à trois chiffres se terminant par un.

Essayez-le en ligne!

Comment ça marche

bRṫ€3ċJ  Main link. Argument: n

 R       Range; yield [1, ..., n].
b        Base; convert n to bases 1, ..., n.
  ṫ€3    Tail each 3; remove the first two elements of each digit array.
      J  Indices of [n]; yield [1].
     ċ   Count the number of times [1] appears in the result to the left.

10

JavaScript (ES7), 43 40 39 octets

f=(n,b)=>n<b*b?0:n%b==1&n<b**3|f(n,-~b)

Cas de test

Commenté

f = (n,           // given n = input
        b) =>     // and using b = base, initially undefined
  n < b * b ?     // if n is less than b²:
    0             //   n has less than 3 digits in base b or above -> failure
  :               // else:
    n % b == 1 &  //   return a truthy value if n is congruent to 1 modulo b
    n < b**3 |    //   and n is less than b³ (i.e. has less than 4 digits in base b)
    f(n, -~b)     //   or the above conditions are true for some greater value of b




4

05AB1E , 11 8 octets

Enregistré 3 octets grâce à Adnan .

Lв3ù€θ1å

Essayez-le en ligne!

Explication

Lв            # convert input to bases [1 ... input]
  ʒg3Q}       # keep only elements of length 3
       €θ     # get the last item of each
         1å   # is there any 1?


3

Mathematica, 43 octets

!FreeQ[IntegerDigits[#,2~Range~#],{_,_,1}]&

Essayez-le en ligne!

ou Essayez-le en ligne! (grands nombres)

Martin Ender a économisé 3 octets


!FreeQ[#~IntegerDigits~Range@#,{_,_,1}]&est un peu plus court si cela ne vous dérange pas de voir l' IntegerDigits::ibase: Base 1 is not an integer greater than 1.avertissement. (Il renvoie toujours les bonnes réponses.)
Misha Lavrov




2

APL (Dyalog Unicode) , 21 20 14 octets SBCS

-5 grâce à @ngn.

Solution purement arithmétique (ne fait en fait aucune conversion de base) et donc très rapide.

3∊⊢(|×∘⌈⍟)⍨1↓⍳

Essayez-le en ligne!

⊢()⍨1↓⍳ Sur l'un des arguments ɩ ndices 1… et l'argument, appliquer:

| la division reste

×∘⌈ fois l'arrondi

 log N Argument

3∊ est trois un membre de cela?


vous pouvez enregistrer 1 avec l'astuce standard de permutation des arguments:⊢(∨/(3=∘⌈⍟)∧1=|)⍨1↓⍳
ngn

@ngn Merci. La prochaine fois, n'hésitez pas à simplement les modifier (si vous en avez envie).
Adám

D'accord. Voici une amélioration plus complexe que je vous laisse gérer - elle est aussi courte que votre autre solution:(⊂1 3)∊⊢(⌈|,¨⍟)⍨1↓⍳
ngn

1
3∊⊢(|×|×∘⌈⍟)⍨1↓⍳
2018

2
@ngn 1=⌈a⍟b, a≤ba=b0=a|b0=b|b
Adám


1

Husk , 15 octets

V§&o=1→o=3LṠMBḣ

Essayez-le en ligne!

Explication

V§&(=1→)(=3L)ṠMBḣ  -- implicit input, for example: 5
             ṠMB   -- map "convert 5 to base" over..
                ḣ  --   range [1..5]
                   -- [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
V                  -- does any of the elements satisfy the following
 §&( 1 )( 2 )      --   apply functions 1,2 and join with & (logical and)
         =3L       --     is length equals to 3?
    =1→            --     is last digit 1?

1

PHP, 48 + 1 octets

while(++$b**2<$n=$argn)$n%$b-1|$n>$b**3||die(1);

sorties avec 0pour fausse (ou entrée 3), 1pour vérité.
Exécuter en tant que pipe avec -nRou l' essayer en ligne .


1

C, 60 octets

Une fonction qui renvoie non nul si l'argument peut être représenté comme un nombre à trois chiffres se terminant par 1:

i,j;f(n){for(j=0,i=sqrt(n);i>cbrt(n);)j+=n%i--==1;return j;}

Remarque: cela fonctionne avec GCC, où les fonctions sont intégrées. Pour les autres compilateurs, vous devez probablement vous assurer que les types d'argument et de retour sont connus:

#include<math.h>

Explication

La base la plus basse dans laquelle nest représentée en 3 chiffres est ⌊∛n⌋, et la base la plus basse dans laquelle nest représentée en 2 chiffres est⌊√n⌋ , donc nous testons simplement si le nombre est congru à 1 modulo toutes les bases dans la plage de 3 chiffres. Nous retournons le compte du nombre de bases satisfaisant à la condition, en donnant une valeur non nulle (véridique) ou zéro (fausse) selon le cas.

Programme de test

Passez un nombre quelconque d'entrées comme paramètres positionnels:

#include<stdio.h>
int main(int c,char**v)
{
    while(*++v)
        printf("%s => %d\n", *v, f(atoi(*v)));
}



0

Pyt , 35 33 octets

←ĐĐ3=?∧∧:ŕĐ2⇹Ř⇹Ľ⅟⌊⁺3=⇹Đ2⇹Ř%*ž1⇹∈;

Explication:

←ĐĐ                                             Push input onto stack 3 times
   3=?  :                       ;               If input equals 3, execute code after the question mark;otherwise, execute code after the colon. In either case, afterwards, execute the code after the semicolon
      ∧∧                                        Get 'True'
        :                                       Input not equal to 3
         ŕ                                      Remove 'False'
          Đ2⇹Ř                                  Push [2,3,...,n]
              ⇹Ľ⅟⌊⁺                             Push [floor(log_2(n))+1,floor(log_3(n))+1,...,floor(log_n(n))+1]
                   3=                           Is each element equal to 3
                     ⇹                          Swap the top two elements on the stack (putting n back on top)
                      Đ2⇹Ř                      Push [2,3,...,n]
                          %                     Push [n%2,n%3,...,n%n]
                           *                    Multiply [n%x] by the other array (i.e. is floor(log_x(n))+1=3?)
                            ž                   Remove all zeroes from the array
                             1⇹∈                Is 1 in the array?
                                ;               End conditional
                                                Implicit print

Essayez-le en ligne!


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.