Gegenseitige Nachahmer

17

Sei eine positive ganze Zahl bestehend aus Dezimalstellen . Sei eine andere positive ganze Zahl.And1,d2,...,dnB

Für diesen Zweck bezeichnen wir als Nachahmer von wenn mindestens eine Liste positiver ganzer Zahlen so dass:AB p 1 , p 2 , . . . , p nBp1,p2,...,pn

i=1ndipi=B

AB A B B A und heißen wechselseitige Nachahmer, wenn ein Nachahmer von und ein Nachahmer von .BEINBBEIN

Beispiel

526853 und sind gegenseitige Nachahmer, weil:853

53+29+63=853

und:

83+51+32=526

Die Herausforderung

Bei zwei positiven ganzen Zahlen und besteht Ihre Aufgabe darin, einen Wahrheitswert zu drucken oder zurückzugeben, wenn und reziproke Kopien sind, oder einen anderen falschen Wert.EINBEINB

Erläuterungen und Regeln

  • Sie können und in jedem vernünftigen, eindeutigen Format verwenden (z. B. Ganzzahlen, Zeichenfolgen, Ziffernlisten usw.).EINB
  • EINB und können gleich sein. Wenn eine Zahl ein wechselseitiger Nachahmer ist, gehört sie zu A007532 .B
  • Anstelle wahrer / falscher Werte können Sie auch zwei unterschiedliche konsistente Werte zurückgeben.
  • Für und muss Ihr Code in weniger als einer Minute abgeschlossen sein . Wenn es für höhere Werte zu lange dauert, muss es sie jedoch theoretisch lösen können.1EIN<10001B<1000
  • Das ist .

Testfälle

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
quelle
Empfohlene Fall: 17 2401 -> false. Ich bin fast darüber gestolpert.
Shieru Asakoto

Antworten:

8

Brachylog , 19 Bytes

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

Probieren Sie es online!

Ausgänge true.oderfalse.

Erläuterung

ẹ                     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
Tödlich
quelle
2
@Arnauld Auf Kosten von 1 Byte behoben. Es schlug fehl, weil es ein 2401enthielt, 0das nicht mit der Art und Weise funktionierte, wie ich es überprüfte, Idas streng positiv war (weil ich es beiden Iund der Ziffer zugeordnet habe, um Bytes zu sparen)
Fatalize 13.11.18
6

Schale , 17 Bytes

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

Probieren Sie es online! Beendet alle Testfälle unter 1000 in ca. 11 Sekunden.

Erläuterung

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

Warum es funktioniert

B=d1p1++dnpndichpichdichpichBichpichLogdichBdich1011pichB1pichBLogdichBBdich3Bdich=2Log2B>BB=823=812EIN223EIN=210kkEIN8B trotzdem, und das Programm gibt unabhängig von der anderen Berechnung einen falschen Wert zurück.

Zgarb
quelle
Tolle Antwort, die mich dazu bringt, Husk zu lernen. Zwei Fragen: 1. Das implizite Argument wird nach der Einführung erneut erwähnt. Wann wird es verwendet? 2. Können Sie erläutern, warum dieser Algorithmus dem im OP gestellten Algorithmus entspricht?
Jona,
1
@Jonah 1. Die Ziffernfunktion dübernimmt das implizite Argument. Ich habe dies in der Erklärung klargestellt. 2. Ich habe ein Argument für die Richtigkeit des Programms hinzugefügt.
Zgarb
Danke ... Übrigens, der Teil, der mich verwirrt hat, war "Woher kommt die Liste aller?" ... beim erneuten Lesen wird mir klar, dass dies nur deshalb der Fall ist, weil alle Kräfte von 1 nur eine sind ...
Jona,
4

05AB1E , 26 22 Bytes

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

Nimmt die Eingabe als Liste (dh [526,853]).

Probieren Sie es online aus oder überprüfen Sie die meisten Testfälle in diesem Bereich[1,999] .

Ähnlich wie meine alte Antwort weiter unten, mit der Ausnahme, dass die [1,n]Liste fest codiert [1,100]ist und die kartesische Liste zweimal erstellt wird, und zwar einmal für jedes Input-Mapping, was den größten Leistungsengpass darstellt.


Alte 26-Byte-Antwort, die für die Leistung besser ist:

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

In dieser Version habe ich einige Bytes eingetauscht, um die Leistung zu verbessern, damit sie [1,1000]problemlos ausgeführt werden kann. Testfälle, die Zahlen im Bereich enthalten, [1,9999]werden mit TIO in etwa einer Sekunde ausgeführt. Testfälle im Bereich [10000,99999]von ca. 10-15 Sekunden auf TIO. Darüber hinaus wird es eine Zeitüberschreitung geben.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle mit Zahlen im Bereich[1,9999] .

Erläuterung:

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
quelle
4

Perl 6 , 87 84 69 Bytes

-15 bytes dank nwellnhof!

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

Probieren Sie es online!

Anonymer Codeblock, der True oder False zurückgibt.

Erläuterung:

{!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
Scherzen
quelle
@Arnauld, A Junction ist Truthy / Falsey, wie ich vor der Ausgabe mit dem Operator boolify gezeigt habe. Ich habe es trotzdem auf etwas anderes gespielt, obwohl ich ein Byte sparen könnte, wenn ich einen wahren Wert für falsch ausgeben könnte und umgekehrt ...?
Jo King
Danke für die Klarstellung. Über die wahrheitsgemäße / falsche Umkehrung: Ich würde lieber nein sagen.
Arnauld
4

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

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)

Probieren Sie es online!

Erwarten Sie die Eingabe als (A)(B).

Shieru Asakoto
quelle
Saiten sind in Ordnung. (Ich habe das Eingabeformat in der Herausforderung geklärt.)
Arnauld
@Arnauld Oh, ich habe gerade eine Methode gefunden, die keinen String, sondern 108 Bytes verwendet.
Shieru Asakoto
2

J , 56 Bytes

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

Probieren Sie es online!

Ja, geschachtelte explizite Definition!

Wie es funktioniert

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
quelle
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

Probieren Sie es online!

-4 Bytes, danke an Vedant Kandoi

TFeld
quelle
>0kann entfernt werden. not a: a<1. b==0:b<1
Vedant Kandoi
@VedantKandoi Danke, b<0funktioniert aber nicht
TFeld
1

J, 68 Bytes

Ich dachte, J würde hier ganz gut abschneiden, aber es wurde härter als erwartet und ich würde mich über Vorschläge für weiteres Golfen freuen ...

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

Probieren Sie es online!

HINWEIS: Wir subtrahieren dort 3 Zeichen von der TIO-Anzahl, da f=.die Hauptfunktion nicht zählt

ungolfed

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