Взаємні копікати


17

Нехай натуральне число , що складається з п десяткових цифр d 1 , d 2 , . . . , д н . Нехай ВAnd1,d2,...,dnB - ще одне додатне ціле число.

Для цього завдання, ми називаємо в наслідувач з B , якщо існує хоча б один список позитивних цілих чисел р 1 , р 2 , . . . , p n такий, що:ABp1,p2,...,pn

i=1ndipi=B

A іB називаютьсявзаємними копікатами,якщоA є копієюB іB є копієюA .

Приклад

526 та853 це взаємні копікати, оскільки:

53+29+63=853

і:

83+51+32=526

Змагання

Враховуючи два натуральних числа A і B , ваше завдання - друкувати або повертати триєдине значення, якщо A і B є взаємними копікатами або фальшивим значенням в іншому випадку.

Роз'яснення та правила

  • Ви можете приймати A і B у будь-якому розумному, однозначному форматі (наприклад, цілі числа, рядки, списки цифр, ...)
  • A іB можуть бути рівними. Якщо число є зворотною копією самого себе, воно належить доA007532 .
  • Замість правдивих / хибних значень ви можете повернути два чіткі послідовності значення.
  • Для 1A<1000 та 1B<1000 ваш код повинен заповнитися менше ніж за одну хвилину . Якщо знадобиться занадто багато часу для отримання більш високих значень, воно, однак, повинно бути здатним вирішити їх теоретично.
  • Це .

Тестові справи

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

Схожі випадок: 17 2401 -> false. Я майже зіткнувся з цього приводу.
Шиеру Асакото

Відповіді:


8

Брахілог , 19 байт

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

Спробуйте в Інтернеті!

Виходи true. абоfalse.

Пояснення

ẹ                     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 Виправлено вартістю 1 байт. Не вдалось, тому що 2401містив a, 0який не працював із тим, як я перевірив, що Iце суто позитивно (тому що я відобразив його на обидва Iта цифру для збереження байтів)
Fatalize

6

Лушпиння , 17 байт

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

Спробуйте в Інтернеті! Завершує всі тестові справи до 1000 за приблизно 11 секунд.

Пояснення

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

Чому це працює

Якщо ми маємо B=d1p1++dnpn , де di являюсь цифрами і pi позитивні цілі числа, то dipiB для всіх i , або , що еквівалентно pilogdiB . Ми можемо ігнорувати випадок di1 , оскільки показник 0 або 1 не змінює його. У моїй програмі пошуковий простір є1piB (для дотримання обмеження часу; я б використовував1piBіншому випадку), тож якщо ми маємоlogdiBB, тоді все добре. Якщоdi3, це справедливо для всіх натуральних чиселB, тому єдиний небезпечний випадокdi=2. Маємоlog2B>Bлише дляB=8. У цьому випадку23=8, але пошук враховує лише показники1і2. Якщо інше число числоAмістить цифру2, воно також має інші ненульові цифри (тому показник2не може бути3у сумі), абоA=210kдля деякогоk. В останньому випадкуАне є силою8, тому він не може бути копієюБ у будь-якому випадку, і програма правильно повертає помилкове значення незалежно від інших обчислень.


Прекрасна відповідь, яка змушує мене хочу навчитися лушпиння. Два питання: 1. неявна аргументація знову згадується після її введення. Коли він використовується? 2. Чи можете ви детальніше пояснити, чому цей алгоритм еквівалентний алгоритму, встановленому в ОП?
Іона

1
@Jonah 1. Функція цифри dприймає неявний аргумент. Я пояснив це в поясненні. 2. Я додав аргумент щодо коректності програми.
Згарб

Дякую ... btw, частина, яка мене збентежила, була "звідки береться список усіх?" .... перечитуючи, я тепер усвідомлюю, що це лише тому, що всі повноваження 1 - лише одна ....
Йона


4

05AB1E , 26 22 байт

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

Приймає дані як список (тобто [526,853]).

Спробуйте в Інтернеті або перевірте більшість тестових випадків у асортименті[1,999] .

Подібно до моєї старої відповіді нижче, за винятком того, що цей [1,n]список жорстко кодується [1,100], і він створює декартовий список двічі, один раз для кожного введення-карти, що є основним вузьким місцем у плані продуктивності.


Старі 26 байт відповідають, що краще для продуктивності:

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

У цій версії я торгував деякими байтами, щоб зробити продуктивність набагато кращою, щоб вона могла працювати [1,1000]з легкістю. Тестові випадки, що містять числа в діапазоні [1,9999], робляться приблизно через секунду на TIO. Випробування в діапазоні [10000,99999]приблизно через 10-15 секунд на TIO. Вище цього буде тайм-аут.

Спробуйте в Інтернеті або перевірити всі тестові випадки з цифрами в діапазоні[1,9999] .

Пояснення:

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 байт

-15 байт завдяки nwellnhof!

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

Спробуйте в Інтернеті!

Блок анонімного коду, який повертає значення True або False.

Пояснення:

{!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, як я показав, використовуючи оператор boolify перед виведенням. Я все-таки гольфував його чимось іншим, хоч міг би зберегти байт, якби міг вивести триєдне значення за хибне і навпаки ...?
Джо Кінг

Дякуємо за роз’яснення. Про правду / хибну інверсію: я б краще сказати «ні».
Арнольд

4

JavaScript (Node.js) , 116 92 89 86 83 77 байт

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)

Спробуйте в Інтернеті!

Очікуйте введення як (A)(B).


Струни прекрасні. (Я уточнив формат введення у виклику.)
Арнольд

@Arnauld О, я щойно знайшов метод, що не використовує рядок, але також 108 байт.
Шиеру Асакото

2

J , 56 байт

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

Спробуйте в Інтернеті!

Так, вкладене явне визначення!

Як це працює

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

J, 68 байт

Я думав, що Дж. Тут виступить непогано, але в кінцевому підсумку він виявився жорсткішим, ніж я очікував, і хотів би будь-які пропозиції щодо подальшого гольфу ...

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

Спробуйте в Інтернеті!

ПРИМІТКА: ми віднімаємо 3 символи з підрахунку TIO, оскільки f=.основна функція не враховується

неозорий

1 1 -: [: (([: +./ [ = 1 #. ] ^"#. 1 + g #.inv [: i. g ^ #@]) "."0@":)/"1 ] ,: |.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.