¿Es un número satisfactorio?

10

inspirado en esta conversación de chat

Un número satisfactorio es un número cuya representación decimal es de la formaabx , con las siguientes propiedades:

  • xes el sufijo de repetición final más largo, o el último dígito si no hay repetición al final ( 123333-> 3333, 545656-> 5656,123 -> 3)
  • bes el único dígito anterior a x( 123333-> 2,55545656 -> 4)
  • aes el prefijo restante ( 123333-> 1,55545656 -> 555)
  • a == c**b( **denota exponenciación), donde ces el número de repeticiones de la porción repetitiva más pequeña de x( 1623333-> 4( 3 3 3 3, not 33 33))

Por ejemplo, 8300es un número que satisface con a = 8, b = 3, c = 2, y x = 00. 24651no es un número que satisface, porque x = 1, b = 5, a = 246, y no hay ningún número entero cque satisface c^5 = 246. 1222tampoco es un número satisfactorio, porque con x = 222y b = 1, no quedan dígitos restantes a.

Dado un número entero positivo n >= 100, la salida es o no nun número satisfactorio.

Ejemplos

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
fuente
Sandbox
Mego
2
También algo relacionado .
Sr. Xcoder
¿Con 8333es x,c,b,a=33,2,3,8y por lo tanto satisfactorio?
Jonathan Allan
@JonathanAllan No, porque xes codicioso.
Mego
1
@ JonathanAllan Exactamente. Un número que tiene al menos dos dígitos antes de una porción repetida es una condición necesaria para ser satisfactorio.
Mego

Respuestas:

2

Jalea , 26 bytes

se siente demasiado tiempo

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

Un enlace monádico que toma un número entero y regresa 1si la entrada es satisfactoria y 0si no.

Pruébalo en línea! o ver un conjunto de pruebas

¿Cómo?

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
fuente
1
No te preocupes, no estás solo. Este pedazo de tortura inacabada debería probar mi punto.
Erik the Outgolfer
1
Si la respuesta es Jelly> 20 bytes, se conocen algunas cosas mal ...
Fantac
1

Python 3 , 141 bytes

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

Pruébalo en línea!

Python 3 , 144 bytes

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

Pruébalo en línea!

la salida es a través del código de salida

ovs
fuente
Puede modificar su whilecondición para guardar un byte: TIO
FlipTack
0

Python 3 , 101 bytes

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

Python 3 , 107 bytes

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

La salida es por código de salida.

Este código no se ejecuta correctamente en Tio debido a un error de rango. Funciona perfectamente en IDLE.

Neil
fuente
0

JavaScript (ES6), 282 268 bytes

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
fuente
0

Python 2, 286 bytes

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

Nes una función recursiva que encuentra el número de veces que se repite una subcadena de sufijo en una cadena. Esto básicamente recorre todos los sufijos posibles, encontrando el número de veces que cada uno se repite usando N; esto excluye todos los valores dondeN==1 porque no se refieren a repeticiones; Si la lista termina vacía, el sufijo del último carácter se agrega a la lista.

Luego, se toma el sufijo más largo, ( q), se encuentra el número de caracteres que ocupa ( i) y a==c**bse marca ( print ...).

Si se produce un error en el camino (lo que suele ocurrir), queda atrapado en el exceptbloque.

Cualquier sugerencia es más que bienvenida!

Daniel
fuente