Imitadores recíprocos

17

Deje que A sea un número entero positivo que consiste en n dígitos decimales d1,d2,...,dn . Deje B ser otro entero positivo.

A los efectos de este desafío, que llamamos UN un imitador de B si existe al menos una lista de números enteros positivos p1,p2,...,pn tal que:

i=1ndipi=B

A ysi se denominanimitadores recíprocossiA es un imitador deB yB es un imitador deA .

Ejemplo

526 y853 son imitadores recíprocos porque:

53+29+63=853

y:

83+51+32=526

El reto

Dados dos enteros positivos A y B , su tarea es imprimir o devolver un valor verdadero si A y B son copias recíprocas o un valor falso de lo contrario.

Aclaraciones y reglas.

  • Puede tomar A y B en cualquier formato razonable y sin ambigüedades (por ejemplo, enteros, cadenas, listas de dígitos, ...)
  • A yB pueden ser iguales. Si un número es una copia recíproca de sí mismo, pertenece aA007532.
  • En lugar de valores de verdad / falsedad, puede devolver dos valores consistentes distintos .
  • Para 1A<1000 y 1B<1000 , su código debe completarse en menos de un minuto . Si está tomando demasiado tiempo para valores más altos, debe ser capaz de resolverlos en teoría.
  • Este es el .

Casos de prueba

Truthy:
1 1
12 33
22 64
8 512
23 737
89 89
222 592
526 853
946 961
7 2401
24 4224
3263 9734
86 79424
68995 59227
32028 695345

Falsy:
1 2
3 27
9 24
24 42
33 715
33 732
222 542
935 994
17 2401
8245 4153
Arnauld
fuente
Caso sugerida: 17 2401 -> false. Estoy casi tropezado con esto.
Shieru Asakoto

Respuestas:

8

Brachylog , 19 bytes

ẹ{∧ℕ₁;?↔^}ᵐ².+ᵐ↔?∧≜

Pruébalo en línea!

Salidas true.ofalse.

Explicación

ẹ                     Split the numbers into lists of digits
 {       }ᵐ²          For each digit
  ∧ℕ₁                 Let I be a strictly positive integer
     ;?↔^                Compute the digit to the power I (which is unknown currently)
            .         Call . the list of those new numbers
            .+ᵐ       Their mapped sum results…
               ↔?     …in the reverse of the input
                 ∧≜   Find if there effectively are values for the numbers in . to satisfy
                        these relationships
Fatalizar
fuente
2
@Arnauld Corregido al costo de 1 byte. Falló porque 2401contenía uno 0que no funcionaba con la forma en que lo verifiqué, que Iera estrictamente positivo (porque lo asigné en ambos Iy en el dígito para guardar bytes)
Fatalize
6

Casco , 17 bytes

Λλ€⁰mΣΠTṪ^ḣ√⁰d)De

Pruébalo en línea! Termina todos los casos de prueba por debajo de 1000 en aproximadamente 11 segundos.

Explicación

Λλ€⁰mΣΠTṪ^ḣ√⁰d)De  Implicit inputs, say 12 and 33.
                e  Put into a list: [12,33]
               D   Duplicate: [12,33,12,33]
Λ                  Does this hold for all adjacent pairs:
                    (12,33 is checked twice but it doesn't matter)
                    For example, arguments are 33 and 12.
 λ            )     Anonymous function with arguments 33 (explicit) and 12 (implicit).
             d      Base-10 digits of implicit argument: [1,2]
          ḣ√⁰       Range to square root of explicit argument: [1,2,3,4]
        Ṫ^          Outer product with power: [[1,2],[1,4],[1,8],[1,16],[1,32]]
       T            Transpose: [[1,1,1,1,1],[2,4,8,16,32]]
      Π             Cartesian product: [[1,2],[1,4],...,[1,32]]
    mΣ              Map sum: [3,5,...,33]
  €⁰                Is the explicit argument in this list? Yes.

Por que funciona

B=d1p1++dnpndipidipiBipilogdiBdi1011piB1piBlogdiBBdi3Bdi=2log2B>BB=823=812A223A=210kkA8B de todos modos, y el programa devuelve correctamente un valor falso independientemente del otro cálculo.

Zgarb
fuente
Gran respuesta que me hace querer aprender Husk. Dos preguntas: 1. el argumento implícito se menciona nuevamente después de que lo presenta. Cuando se usa 2. ¿Podría explicar por qué este algoritmo es equivalente al planteado en el OP?
Jonás
1
@ Jonás 1. La función de dígitos dtoma el argumento implícito. Aclaré esto en la explicación. 2. Agregué un argumento para la corrección del programa.
Zgarb
Gracias ... por cierto, la parte que me había confundido era "¿de dónde viene la lista de todos?" ... releyendo ahora me doy cuenta de que esto es simplemente porque todos los poderes de 1 son solo uno ...
Jonás
4

05AB1E , 26 22 bytes

εVтLIàgãεYSym}OIyKå}˜P

Toma la entrada como una lista (es decir [526,853]).

Pruébalo en línea o verifique la mayoría de los casos de prueba en el rango[1,999] .

Similar a mi respuesta anterior a continuación, excepto que la [1,n]lista está codificada para[1,100] y crea la lista cartesiana dos veces, una para cada asignación de entrada, que es el principal cuello de botella en términos de rendimiento.


Antigua respuesta de 26 bytes que es mejor para el rendimiento:

Z©bgL®gãUεVXεYSym}OsN>èå}P

En esta versión, cambié algunos bytes para mejorar mucho el rendimiento y poder ejecutarlo [1,1000]con facilidad. Casos de prueba que contienen números en el rango[1,9999] se realizan en aproximadamente un segundo en TIO. Pruebe los casos en el rango [10000,99999]en aproximadamente 10-15 segundos con TIO. Por encima de eso, se agota el tiempo de espera.

Pruébelo en línea o verifique todos los casos de prueba con números en el rango[1,9999] .

Explicación:

Z                 # Push the max of the (implicit) input-list (without popping)
                  #  i.e. [526,853] → 853
 ©                # Store it in the register (without popping)
  b               # Convert to binary
                  #  i.e. 853 → 1101010101
   g              # Take its length
                  #  i.e. 1101010101 → 10
    L             # Pop and push a list [1, n]
                  #  i.e. 10 → [1,2,3,4,5,6,7,8,9,10]
     ®            # Push the max from the register
      g           # Take its length
                  #  i.e. 853 → 3
       ã          # Cartesian product the list that many times
                  #  i.e. [1,2,3,4,5,6,7,8,9,10] and 3
                  #   → [[1,1,1],[1,1,2],[1,1,3],...,[10,10,8],[10,10,9],[10,10,10]]
        U         # Pop and store it in variable `X`
ε              }  # Map both values of the input list:
 V                # Store the current value in variable `Y`
  Xε    }         # Map `y` over the numbers of variable `X`
    Y             # Push variable `Y`
     S            # Convert it to a list of digits
                  #  i.e. 526 → [5,2,6]
      ym          # Take each digit to the power of the current cartesian product sublist
                  #  i.e. [5,2,6] and [3,9,3] → [125,512,216]
         O        # Take the sum of each inner list
                  #  i.e. [[5,2,6],[5,2,36],[5,2,216],...,[125,512,216],...]
                  #   → [13,43,223,...,853,...]
          s       # Swap to push the (implicit) input
           N>     # Push the index + 1
                  #  i.e. 0 → 1
             è    # Index into the input-list (with automatic wraparound)
                  #  i.e. [526,853] and 1 → 853
              å   # Check if it's in the list of sums
                  #  i.e. [13,43,223,...,853,...] and 853 → 1
                P # Check if it's truthy for both both (and output implicitly)
                  #  i.e. [1,1] → 1
Kevin Cruijssen
fuente
4

Perl 6 , 87 84 69 bytes

-15 bytes gracias a nwellnhof!

{!grep {!grep $^b,[X+] 0,|map (*X**1..$b.msb+1),$^a.comb},.[0,1,1,0]}

Pruébalo en línea!

Bloque de código anónimo que devuelve verdadero o falso.

Explicación:

{!grep {!grep $^b,[X+] 0,|map (*X**1..$b.msb+1),$^a.comb},.[0,1,1,0]}

{                                                                   }  # Anonymous code block
 !grep    # None of:
                                                          .[0,1,1,0]   # The input and the input reverse
       {!grep       # None of
                  [X+]       # All possible sums of
                       0,|   # 0 (this is to prevent single digit numbers being crossed with themself)
                          map                  ,$^a.comb   # Each digit mapped to
                              (*X**           )  # The power of
                                   1..$b.msb+1   # All of 1 to the most significant bit of b plus 1
                                                 # This could just be b+1, but time constraints...
              $^b,  # Is equal to b
Jo King
fuente
@Arnauld, A Junction is Truthy / Falsey, como he demostrado al usar el operador boolify antes de la salida. De todos modos, lo convertí en otra cosa, aunque podría guardar un byte si pudiera generar un valor verdadero para falso y viceversa ...?
Jo King
Gracias por la aclaración. Sobre la inversión de verdad / falsedad: prefiero decir que no.
Arnauld el
4

JavaScript (Node.js) , 116 92 89 86 83 77 bytes

a=>b=>(G=(c,g,f=h=g%10)=>g?c>f&f>1&&G(c,g,h*f)||G(c-f,g/10|0):!c)(a,b)&G(b,a)

Pruébalo en línea!

Espere entrada como (A)(B).

Shieru Asakoto
fuente
Las cuerdas están bien. (He aclarado el formato de entrada en el desafío.)
Arnauld
@Arnauld Oh, acabo de encontrar un método que no usa cadenas pero también 108 bytes.
Shieru Asakoto
2

J , 56 bytes

h~*h=.4 :'x e.+/|:>,{x 4 :''<y&*^:(x&>)^:a:y''"+"."+":y'

Pruébalo en línea!

¡Sí, definición explícita anidada!

Cómo funciona

powers =. 4 :'<y&*^:(x&>)^:a:y'  Explicit aux verb. x = target, y = digit
                             y   Starting from y,
               y&*^:     ^:a:    collect all results of multiplying y
                    (x&>)        until the result is at least x
              <                  Box it.

h=.4 :'x e.+/|:>,{x powers"+"."+":y'  Explicit aux verb. x, y = two input numbers
                            "."+":y   Digits of y
                  x powers"+          Collect powers of digits of y under x
                 {            Cartesian product of each item
           +/|:>,             Format correctly and compute the sums
       x e.                   Does x appear in the list of sums?

h~*h  Tacit main verb. x, y = two input numbers
      Since h tests the condition in only one direction,
      test again the other way around (~) and take the AND.
Bubbler
fuente
1

Python 2 , 149 147 143 139 132 118 108 107 106 105 bytes

lambda a,b:g(a,b)*g(b,a)
g=lambda a,b:any(g(a/10,b-(a%10)**-~i)for i in(a*b>0)*range(len(bin(b))))or b==0

Pruébalo en línea!

-4 bytes, gracias a Vedant Kandoi

TFeld
fuente
>0se puede quitar. not a: a<1.b==0:b<1
Vedant Kandoi
@VedantKandoi Gracias, aunque b<0no funciona
TFeld
1

J, 68 bytes

Pensé que J se desempeñaría bastante bien aquí, pero terminó siendo más difícil de lo que esperaba y me encantaría cualquier sugerencia para seguir jugando al golf ...

g=.#@#:@[
1 1-:[:(([:+./[=1#.]^"#.1+g#.inv[:i.g^#@])"."0@":)/"1],:|.

Pruébalo en línea!

NOTA: restamos 3 caracteres del recuento de TIO allí ya que f=.en la función principal no cuenta

sin golf

1 1 -: [: (([: +./ [ = 1 #. ] ^"#. 1 + g #.inv [: i. g ^ #@]) "."0@":)/"1 ] ,: |.
Jonás
fuente