Copies réciproques


17

Soit un entier positif composé de chiffres décimaux . Soit un autre entier positif.And1,d2,...,dnB

Aux fins de ce défi, nous appelons un copieur de s'il existe au moins une liste d'entiers positifs tels que:ABp1,p2,...,pn

i=1ndipi=B

A et sont appelés imitateurs réciproques si est un imitateur de et est un imitateur de .BABBA

Exemple

526 et sont des imitations réciproques parce que:853

53+29+63=853

et:

83+51+32=526

Le défi

Étant donné deux entiers positifs et , votre tâche consiste à imprimer ou à renvoyer une valeur véridique si et sont des contre-copies réciproques ou une valeur fausse dans le cas contraire.ABAB

Clarifications et règles

  • Vous pouvez prendre et dans n'importe quel format raisonnable et sans ambiguïté (par exemple des entiers, des chaînes, des listes de chiffres, ...)AB
  • A etB peuvent être égaux. Si un nombre est une copie réciproque de lui-même, il appartient à A007532 .
  • Au lieu de valeurs véridiques / fausses, vous pouvez renvoyer deux valeurs cohérentes distinctes .
  • Pour et , votre code doit se terminer en moins d'une minute . Si cela prend trop de temps pour des valeurs plus élevées, il faut cependant pouvoir les résoudre en théorie.1A<10001B<1000
  • C'est du .

Cas de 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

Cas suggéré: 17 2401 -> false. Je suis presque tombé sur ça.
Shieru Asakoto

Réponses:


8

Brachylog , 19 octets

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

Essayez-le en ligne!

Sorties true.oufalse.

Explication

ẹ                     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 Fixé au coût de 1 octet. Il a échoué car il 2401contenait un 0qui ne fonctionnait pas avec la façon dont je vérifiais qui Iétait strictement positif (parce que je l'ai mappé sur les deux Iet le chiffre pour économiser des octets)
Fatalize

6

Husk , 17 octets

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

Essayez-le en ligne! Termine tous les cas de test sous 1000 en environ 11 secondes.

Explication

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

Pourquoi ça marche

Si nous avons B=1p1++npnje sont des chiffres et des pje sont des nombres entiers positifs, alors jepjeB pour tous les je , ou de manière équivalente pjeJournaljeB . On peut ignorer le cas je1 , puisque exponentiariser 0 ou 1 ne le change pas. Dans mon programme, l'espace de recherche est1pjeB (pour respecter la restriction de temps; j'utiliserais1pjeBsinon), donc si nous avonsJournaljeBB, alors tout va bien. Sije3, cela vaut pour tous les nombres naturelsB, donc le seul cas dangereux estje=2. Nous avonsJournal2B>Buniquement pourB=8. Dans ce cas,23=8, mais la recherche ne prend en compte que les exposants1et2. Si l'autre numéro numéroUNEcontient le chiffre2, soit il a aussi d'autres chiffres non nuls (donc l'exposant de2ne peut pas être3dans la somme), soitUNE=2dixkpour certainsk. Dans ce dernier cas,UNEn'est pas une puissance de8, il ne peut donc pas être un copieur deB de toute façon, et le programme renvoie correctement une valeur falsifiée indépendamment de l'autre calcul.


Excellente réponse qui me donne envie d'apprendre Husk. Deux questions: 1. l'argument implicite est à nouveau mentionné après l'avoir introduit. Quand est-il utilisé? 2. Pourriez-vous expliquer pourquoi cet algorithme est équivalent à celui posé dans le PO?
Jonah

1
@Jonah 1. La fonction digit dprend l'argument implicite. J'ai clarifié cela dans l'explication. 2. J'ai ajouté un argument pour l'exactitude du programme.
Zgarb

Merci ... btw, la partie qui m'avait dérouté était "d'où vient la liste de tous ceux-là?" .... relisant je me rends compte maintenant que c'est simplement parce que tous les pouvoirs de 1 sont juste un ....
Jonah


4

05AB1E , 26 22 octets

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

Prend l'entrée comme une liste (c. [526,853]-à-d.).

Essayez-le en ligne ou vérifiez la plupart des cas de test de la gamme[1,999] .

Similaire à mon ancienne réponse ci-dessous, sauf que la [1,n]liste est codée en dur [1,100]et crée la liste cartésienne deux fois, une fois pour chaque mappage d'entrée, qui est le principal goulot d'étranglement en termes de performances.


Ancienne réponse de 26 octets, meilleure pour les performances:

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

Dans cette version, j'ai échangé quelques octets pour améliorer considérablement les performances afin de pouvoir fonctionner [1,1000]facilement. Les cas de test contenant des nombres dans la plage [1,9999]sont effectués en environ une seconde sur TIO. Cas de test de l'ordre [10000,99999]de 10 à 15 secondes sur TIO. Au-dessus, cela expirera.

Essayez-le en ligne ou vérifiez tous les cas de test avec des nombres dans la plage[1,9999] .

Explication:

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 octets

-15 octets grâce à nwellnhof!

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

Essayez-le en ligne!

Bloc de code anonyme qui renvoie True ou False.

Explication:

{!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 is Truthy / Falsey, comme je l'ai montré en utilisant l'opérateur boolify avant de sortir. Je l'ai joué à quelque chose d'autre de toute façon, même si je pouvais enregistrer un octet si je pouvais sortir une valeur véridique pour faux et vice-versa ...?
Jo King

Merci pour la clarification. À propos de l'inversion vérité / fausse: je préfère dire non.
Arnauld


2

J , 56 octets

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

Essayez-le en ligne!

Oui, définition explicite imbriquée!

Comment ça fonctionne

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 octets

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

Essayez-le en ligne!

-4 octets, merci à Vedant Kandoi


>0Peut être enlevé. not a: a<1. b==0:b<1
Vedant Kandoi

@VedantKandoi Merci, mais b<0cela ne fonctionne pas
TFeld

1

J, 68 octets

Je pensais que J se comporterait assez bien ici, mais cela a fini par être plus difficile que ce à quoi je m'attendais et j'adorerais toute suggestion pour continuer à jouer au golf ...

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

Essayez-le en ligne!

REMARQUE: nous soustrayons 3 caractères du nombre de TIO car f=.la fonction principale ne compte pas

non golfé

1 1 -: [: (([: +./ [ = 1 #. ] ^"#. 1 + g #.inv [: i. g ^ #@]) "."0@":)/"1 ] ,: |.
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.