Est-ce un nombre satisfaisant?


10

inspiré par cette conversation de chat

Un nombre satisfaisant est un nombre dont la représentation décimale est de la forme abx, avec les propriétés suivantes:

  • xest le suffixe répété le plus long ou le dernier chiffre s'il n'y a pas de répétition à la fin ( 123333-> 3333, 545656-> 5656, 123-> 3)
  • best le chiffre unique avant x( 123333-> 2, 55545656-> 4)
  • aest le préfixe restant ( 123333-> 1, 55545656-> 555)
  • a == c**b( **dénote l'exponentation), où cest le nombre de répétitions de la plus petite portion répétée de x( 1623333-> 4( 3 3 3 3, pas 33 33))

Par exemple, 8300est un nombre satisfaisant avec a = 8, b = 3, c = 2et x = 00. 24651n'est pas un nombre satisfaisant, parce que x = 1, b = 5, a = 246et il n'y a pas entier cqui satisfait c^5 = 246. 1222n'est pas non plus un nombre satisfaisant, car avec x = 222et b = 1, il ne reste aucun chiffre pour a.

Étant donné un entier positif n >= 100, la sortie est ou non nun nombre satisfaisant.

Exemples

8300: True (a=8, b=3, c=2, x=00)
24651: False 
1222: False
92555: True (a=9, b=2, c=3, x=555)
64633: True (a=64, b=6, c=2, x=33)
512944: True (a=512, b=9, c=2, x=44)
123: True (a=1, b=2, c=1, x=3)
822809: False 
376664: False 
723799: False 
1234: False 
34330000000: True (a=343, b=3, c=7, x=0000000)
92313131: True (a=9, b=2, c=3, x=313131)
16424442444: True (a=16, b=4, c=2, x=24442444)


2
Aussi quelque peu lié .
M. Xcoder

Avec 8333est x,c,b,a=33,2,3,8donc satisfaisant?
Jonathan Allan

@JonathanAllan Non, car xc'est gourmand.
Mego

1
@JonathanAllan Exactement. Un nombre ayant au moins deux chiffres avant une partie répétée est une condition nécessaire pour être satisfaisant.
Mego

Réponses:


2

Gelée , 26 octets

se sent trop longtemps

DŒṖṖEÐƤḄ$ÐṀLÐṂṪµḢ*@0¦LµṪ⁼Ḍ

Un lien monadique prenant un entier et retournant 1si l'entrée est satisfaisante et 0sinon.

Essayez-le en ligne! ou voir une suite de tests

Comment?

DŒṖṖEÐƤḄ$ÐṀLÐṂṪµḢ*@0¦LµṪ⁼Ḍ - Link: integer, n    e.g. 8300
D                          - to decimal list          [8,3,0,0]
 ŒṖ                        - all partitions           [[[8],[3],[0],[0]],[[8],[3],[0,0]],[[8],[3,0],[0]],[[8],[3,0,0]],[[8,3],[0],[0]],[[8,3],[0,0]],[[8,3,0],[0]],[[8,3,0,0]]]
   Ṗ                       - pop (the "no tail" one)  [[[8],[3],[0],[0]],[[8],[3],[0,0]],[[8],[3,0],[0]],[[8],[3,0,0]],[[8,3],[0],[0]],[[8,3],[0,0]],[[8,3,0],[0]]]
         ÐṀ                - keep maximal under the operation: e.g. for [[8,3],[0],[0]]
        $                  -   last two links as a monad:
     ÐƤ                    -     for suffixes:   i.e. [[[8,3],[0],[0]],[[0],[0]],[[0]]]
    E                      -       all equal?         [0              ,1        ,1]
       Ḅ                   -     convert from binary  3
                           -          ...which yields [[[8],[3],[0],[0]],[[8,3],[0],[0]]]
            ÐṂ             - keep minimal under the operation:
           L               -   length
                           -          ...which yields [[[8,3],[0],[0]]]
              Ṫ            - tail (rightmost)         [[8,3],[0],[0]] 
               µ           - monadic chain separation
                Ḣ          - yield head and modify    [8,3]   ...leaving [[0],[0]]
                     L     - length (of modified)     2
                    ¦      - sparse application       (to the [8,3])
                   0       -   ...to index: 0         (to the rightmost digit, the 3)
                 *@        -   power (sw@p args)      [8,8]  ([8, 3*@2] = [8, 2*3] = [8,8])
                      µ    - monadic chain separation
                       Ṫ   - yield tail and modify    8   ...leaving [8]
                         Ḍ - from decimal (modified)  8
                        ⁼  - equal?                   1

1
Ne vous inquiétez pas, vous n'êtes pas seul. Ce morceau de torture inachevé devrait prouver mon point.
Erik the Outgolfer

1
Si la réponse Jelly est> 20 octets, vous savez que quelque chose ne va pas ...
FantaC

1

Python 3 , 141 octets

a=b=0;k=[]
c=[*input()];l=len(c)
while c[1:]>[]==k:a=a*10+b;b=int(c.pop(0));k=[i for i in range(2,l)if c==i*c[:l//i]];l-=1
a==(k+[1])[0]**b>q

Essayez-le en ligne!

Python 3 , 144 octets

a=b='';k=[]
c=[*input()];l=len(c)
while c[1:]>[]==k:a+=b;b,*c=c;k=[i for i in range(2,l)if c==i*c[:l//i]];l-=1
int(a or-1)==(k+[1])[0]**int(b)>q

Essayez-le en ligne!

la sortie se fait via le code de sortie


Vous pouvez modifier votre whilecondition pour enregistrer un octet: TIO
FlipTack


0

Python 3 , 101 octets

import re
x,_,b,a=re.findall(r"((.+?)\2+)(.)(.*)",input()[::-1])[0]
if int(a[::-1])!=len(x)**int(b):d

Python 3 , 107 octets

import re
x,_,b,a=re.findall(r"((.+?)\2+)(.)(.*)",input()[::-1])[0]
if int(a[::-1])!=len(x)**int(b):int('')

La sortie se fait par code de sortie.

Ce code ne fonctionne pas correctement sur Tio en raison d'une erreur de plage. Fonctionne parfaitement dans IDLE.


0

JavaScript (ES6), 282 268 octets

t=(d,n,l,i,r)=>d.slice((m=-l*i)-l,m).join``!=n?r:t(d,n,l,i+1,{p:r.p+n,r:r.r+1});p=(d,l,r)=>l<1?r:p(d,l-1,r.r<(z=t(d,(m=d.slice(-l).join``),l,1,{p:m,r:1})).r&&(z.r>1|l==1)?z:r);u=n=>(d=[...n]).slice(0,(q=(s=d.length)-(m=p(d,s,{p:"",r:0})).p.length-1)).join``==m.r**d[q]

function onChange() {
  var value = document.getElementById("input").value;
  console.log("%s => %s", value, u(value));
}
<input id="input" type="number" onchange="onChange()" />


0

Python 2, 286 octets

yeesh.

n=`input()`
N=lambda p,l=0:N(n[:-len(p)],p,l+1)if n[-len(p):]==p else l
try:
    s=[(N(n[-i-1:]),n[-i-1:])for i,_ in enumerate(n)if N(n[-i-1:])!=1]
    if len(s)==0:s=[(1,n[-1])]
    q=max(s,key=lambda a:len(a[0]*a[1]))
    i=len(q[0]*q[1])
    print n[:-i-1]==`min(s)[0]**int(n[-i-1])`
except:print 0

Nest une fonction récursive qui trouve le nombre de fois qu'une sous-chaîne de suffixe est répétée dans une chaîne. Cela passe en boucle à travers tous les suffixes possibles, en trouvant le nombre de fois que chacun est répété en utilisant N; cela exclut toutes les valeurs où N==1parce qu'elles ne font référence à aucune répétition; si la liste finit par être vide, le suffixe du dernier caractère est ajouté à la liste.

Ensuite, le suffixe le plus long est pris, ( q), le nombre de caractères qu'il prend est trouvé ( i) et a==c**bvérifié ( print ...).

Si une erreur se produit en cours de route (ce qui arrive souvent), elle est prise dans le exceptbloc.

Toutes les suggestions sont plus que bienvenues!

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.