Copycat reciproci


17

Lasciate UN un intero positivo costituito da n cifre decimali d1,d2,...,dn . Sia B un altro numero intero positivo.

Ai fini di questa sfida, chiamiamo un copione di se esiste almeno un elenco di numeri interi positivi tale che:UNBp1,p2,...,pn

i=1ndipi=B

A e sono chiamati imitazioni reciproche se è un imitatore di e è un imitatore di .BABBA

Esempio

526 e sono copioni reciproci perché:853

53+29+63=853

e:

83+51+32=526

La sfida

Dati due numeri interi positivi e , il tuo compito è stampare o restituire un valore di verità se e sono copie reciproche o un valore di falsa in caso contrario.ABAB

Chiarimenti e regole

  • Puoi prendere e in qualsiasi formato ragionevole e inequivocabile (ad esempio numeri interi, stringhe, elenchi di cifre, ...)AB
  • A e possono essere uguali. Se un numero è un copione reciproco di se stesso, appartiene a A007532 .B
  • Invece di valori di verità / falsità, è possibile restituire due valori coerenti distinti .
  • Per e , il codice deve essere completato in meno di un minuto . Se ci vuole troppo tempo per valori più alti, deve comunque essere in grado di risolverli in teoria.1A<10001B<1000
  • Questo è .

Casi test

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

Caso consigliato: 17 2401 -> false. Sono quasi inciampato su questo.
Shieru Asakoto,

Risposte:


8

Brachylog , 19 byte

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

Provalo online!

Uscite true.ofalse.

Spiegazione

ẹ                     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

2
@Arnauld Risolto al costo di 1 byte. Non è riuscito perché 2401conteneva un file 0che non funzionava con il modo in cui ho verificato che Iera strettamente positivo (perché l'ho mappato su entrambi Ie sulla cifra per salvare i byte)
Fatalizza il

6

Buccia , 17 byte

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

Provalo online! Termina tutti i casi di test inferiori a 1000 in circa 11 secondi.

Spiegazione

Λλ€⁰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.

Perché funziona

Se abbiamo B=d1p1++dnpn dove il dio sono le cifre e pio sono numeri interi positivi, allora diopioB per tutti io , o equivalentemente piologdioB . Possiamo ignorare il caso dio1 , poiché l'esponente 0 o 1 non lo modifica. Nel mio programma lo spazio di ricerca è1pioB (per rispettare la limitazione temporale;altrimentiuserei1pioB), quindi se abbiamologdioBB, allora va tutto bene. Sedio3, questo vale per tutti i numeri naturaliB, quindi l'unico caso pericoloso èdio=2. Abbiamolog2B>Bsolo perB=8. In questo caso23=8, ma la ricerca considera solo gli esponenti1e2. Se l'altro numero numeroUNcontiene la cifra2, o ha anche altre cifre diverse da zero (quindi l'esponente di2non può essere3nella somma), oppureUN=210Kper qualcheK. In quest'ultimo caso,UNnon è un potere di8, quindi non può essere un copione diB comunque, e il programma restituisce correttamente un valore errato indipendentemente dall'altro calcolo.


Ottima risposta che mi fa venire voglia di imparare Husk. Due domande: 1. l'argomento implicito viene nuovamente menzionato dopo averlo introdotto. Quando viene usato? 2. Potresti approfondire il motivo per cui questo algoritmo è equivalente a quello proposto nel PO?
Giona

1
@Jonah 1. La funzione digit daccetta l'argomento implicito. Ho chiarito questo nella spiegazione. 2. Ho aggiunto un argomento per la correttezza del programma.
Zgarb,

Grazie ... a proposito, la parte che mi aveva confuso era "da dove viene l'elenco di tutti?" .... rileggendo ora mi rendo conto che questo è solo perché tutti i poteri di 1 sono solo uno ....
Giona


4

05AB1E , 26 22 byte

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

Prende l'input come un elenco (ovvero [526,853]).

Provalo online o verifica la maggior parte dei casi di test nella gamma[1,999] .

Simile alla mia vecchia risposta di seguito, tranne per il fatto che l' [1,n]elenco è hardcoded [1,100]e crea l'elenco cartesiano due volte, una volta per ogni input-mapping, che è il principale collo di bottiglia in termini di prestazioni.


I vecchi 26 byte rispondono meglio per le prestazioni:

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

In questa versione ho scambiato alcuni byte per rendere le prestazioni molto migliori in modo che possano funzionare [1,1000]con facilità. I casi di test contenenti numeri nell'intervallo [1,9999]vengono eseguiti in circa un secondo su TIO. Casi di test nell'intervallo [10000,99999]in circa 10-15 secondi su TIO. Oltre a ciò, il timeout.

Provalo online o verifica tutti i casi di test con numeri nell'intervallo[1,9999] .

Spiegazione:

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


4

Perl 6 , 87 84 69 byte

-15 byte grazie a nwellnhof!

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

Provalo online!

Blocco di codice anonimo che restituisce True o False.

Spiegazione:

{!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

@Arnauld, A Junction è Truthy / Falsey, come ho dimostrato utilizzando l'operatore boolify prima di emettere. L'ho giocato a qualcos'altro comunque, anche se potrei salvare un byte se potessi produrre un valore di verità per falso e viceversa ...?
Jo King,

Grazie per il chiarimento. A proposito dell'inversione verità / falsa: preferirei dire di no.
Arnauld,


2

J , 56 byte

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

Provalo online!

Sì, definizione esplicita nidificata!

Come funziona

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.

1

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

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

Provalo online!

-4 byte, grazie a Vedant Kandoi


>0può essere rimosso. not a: a<1. b==0:b<1
Vedant Kandoi,

@VedantKandoi Grazie, anche b<0se non funziona
TFeld

1

J, 68 byte

Ho pensato che J si sarebbe comportato abbastanza bene qui, ma alla fine è stato più duro di quanto mi aspettassi e mi piacerebbe qualsiasi suggerimento per ulteriori golf ...

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

Provalo online!

NOTA: sottraiamo 3 caratteri dal conteggio TIO poiché f=.la funzione principale non conta

ungolfed

1 1 -: [: (([: +./ [ = 1 #. ] ^"#. 1 + g #.inv [: i. g ^ #@]) "."0@":)/"1 ] ,: |.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.