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)
Mego
la source
Sandbox
Mego
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
Jonathan Allan
la source
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

ovs
la source
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.

Neil
la source
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()" />

Huntro
la source
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!

Daniel
la source