Peniru timbal balik


17

Mari A bilangan bulat positif yang terdiri dari n angka desimal d1,d2,...,dn . Biarkan B menjadi bilangan bulat positif lainnya.

Untuk tujuan tantangan ini, kita sebut A sebuah tiruan dari B jika ada setidaknya satu daftar bilangan bulat positif p1,p2,...,pn sedemikian rupa sehingga:

i=1ndipi=B

A danB disebutpeniru timbal balikjikaA adalah peniru dariB danB adalah peniruA .

Contoh

526 dan853 adalah peniru timbal balik karena:

53+29+63=853

dan:

83+51+32=526

Tantangan

Diberi dua bilangan bulat positif A dan B , tugas Anda adalah mencetak atau mengembalikan nilai kebenaran jika A dan B adalah peniru timbal balik atau nilai palsu sebaliknya.

Klarifikasi dan aturan

  • Anda dapat menggunakan A dan B dalam format beralasan dan tidak ambigu (mis. Integer, string, daftar digit, ...)
  • A danB mungkin sama. Jika angka adalah peniru timbal balik dari dirinya sendiri, itu milikA007532.
  • Alih-alih nilai kebenaran / kepalsuan, Anda dapat mengembalikan dua nilai konsisten yang berbeda .
  • Untuk 1A<1000 dan 1B<1000 , kode Anda harus selesai dalam waktu kurang dari satu menit . Jika butuh terlalu banyak waktu untuk nilai yang lebih tinggi, namun harus dapat menyelesaikannya secara teori.
  • Ini adalah .

Uji kasus

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

Disarankan kasus: 17 2401 -> false. Saya hampir tersandung ini.
Shieru Asakoto

Jawaban:


8

Brachylog , 19 byte

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

Cobalah online!

Output true.ataufalse.

Penjelasan

ẹ                     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 Diperbaiki dengan biaya 1 byte. Gagal karena 2401berisi 0yang tidak berfungsi dengan cara saya memeriksa yang Ibenar-benar positif (karena saya memetakannya pada keduanya Idan digit untuk menyimpan byte)
Fatalize

6

Sekam , 17 byte

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

Cobalah online! Selesaikan semua test case di bawah 1000 dalam waktu sekitar 11 detik.

Penjelasan

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

Mengapa ini berhasil?

Jika kita memiliki B=d1p1++dnpn dimana di adalah digit dan pi adalah bilangan bulat positif, maka dipiB untuk semua i , atau ekuivalen pilogdiB . Kita dapat mengabaikan case di1 , karena exponentiating 0 atau 1 tidak mengubahnya. Dalam program saya, ruang pencarian adalah1piB (untuk mematuhi batasan waktu; Saya akan menggunakan1piBsebaliknya), jadi jika kita memilikilogdiBB, maka semuanya baik-baik saja. Jikadi3, ini berlaku untuk semua bilangan asliB, jadi satu-satunya kasus berbahaya adalahdi=2. Kami memilikilog2B>Bhanya untukB=8. Dalam hal ini23=8, tetapi pencarian hanya mempertimbangkan eksponen1dan2. Jika yang lain NoAberisi angka2, baik itu memiliki angka nol lain juga (sehingga eksponen dari2tidak bisa3di sum), atauA=210kuntuk beberapak. Dalam kasus terakhir,SEBUAHbukan kekuatan8, jadi itu tidak bisa menjadi peniru dariB lagi pula, dan program dengan benar mengembalikan nilai palsu terlepas dari perhitungan lainnya.


Jawaban yang bagus yang membuat saya ingin belajar Husk. Dua pertanyaan: 1. argumen implisit disebutkan lagi setelah Anda memperkenalkannya. Kapan itu digunakan? 2. Bisakah Anda menguraikan mengapa algoritma ini setara dengan yang diajukan dalam OP?
Jonah

1
@Jonah 1. Fungsi digit dmengambil argumen implisit. Saya menjelaskan ini dalam penjelasannya. 2. Saya menambahkan argumen untuk kebenaran program.
Zgarb

Terima kasih ... btw, bagian yang membingungkan saya adalah "dari mana daftar semua berasal?" .... membaca ulang saya sekarang menyadari ini hanya karena semua kekuatan 1 hanya satu ....
Jonah


4

05AB1E , 26 22 byte

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

Mengambil input sebagai daftar (yaitu [526,853]).

Cobalah secara online atau verifikasi sebagian besar kasus uji dalam kisaran[1,999] .

Mirip dengan jawaban lama saya di bawah ini, kecuali bahwa [1,n]daftar itu di-hardcode [1,100], dan itu membuat daftar cartesian dua kali, satu kali untuk setiap pemetaan input, yang merupakan hambatan utama dalam hal kinerja.


Jawaban 26 byte yang lebih baik untuk kinerja:

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

Dalam versi ini saya berdagang dalam beberapa byte untuk membuat kinerja jauh lebih baik sehingga dapat berjalan [1,1000]dengan mudah. Kasus uji yang berisi angka dalam kisaran [1,9999]dilakukan dalam waktu sekitar satu detik di TIO. Uji kasus dalam kisaran [10000,99999]sekitar 10-15 detik pada TIO. Di atas itu akan habis.

Cobalah secara online atau verifikasi semua kasus uji dengan angka dalam kisaran[1,9999] .

Penjelasan:

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 terima kasih kepada nwellnhof!

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

Cobalah online!

Blok kode anonim yang mengembalikan Benar atau Salah.

Penjelasan:

{!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, Persimpangan adalah Truthy / Falsey, seperti yang saya tunjukkan dengan menggunakan operator boolify sebelum menghasilkan. Saya bermain golf ke sesuatu yang lain, meskipun saya bisa menghemat satu byte jika saya bisa menampilkan nilai kebenaran untuk false dan sebaliknya ...?
Jo King

Terimakasih atas klarifikasinya. Tentang inversi kebenaran / kepalsuan: Saya lebih suka mengatakan tidak.
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)

Cobalah online!

Harapkan input sebagai (A)(B).


String baik-baik saja. (Saya sudah mengklarifikasi format input dalam tantangan.)
Arnauld

@Arnauld Oh saya baru saja menemukan metode yang tidak menggunakan string tetapi juga 108 byte.
Shieru Asakoto

2

J , 56 byte

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

Cobalah online!

Yay, definisi eksplisit bersarang!

Bagaimana itu bekerja

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

Cobalah online!

-4 byte, terima kasih kepada Vedant Kandoi


>0dapat dihapus. not a: a<1. b==0:b<1
Vedant Kandoi

@VedantKandoi Terima kasih, meskipun b<0tidak berfungsi
TFeld

1

J, 68 byte

Saya pikir J akan tampil cukup baik di sini, tetapi akhirnya menjadi lebih keras dari yang saya harapkan dan akan menyukai saran untuk bermain golf lebih lanjut ...

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

Cobalah online!

CATATAN: kami mengurangi 3 karakter dari jumlah TIO di sana sejak itu f=. pada fungsi utama tidak dihitung

ungolfed

1 1 -: [: (([: +./ [ = 1 #. ] ^"#. 1 + g #.inv [: i. g ^ #@]) "."0@":)/"1 ] ,: |.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.