Кілька баз, але не вдвічі більше однієї цифри


15

Вхідні дані

Непорожній масив додатних цілих чисел.

Завдання

Перетворіть кожне ціле число у двійкове, восьмеричне, десяткове або шістнадцяткове, таким чином, щоб кожна цифра ( 0 до F ) була використана не більше одного разу.

Вихідні дані

Список баз, які використовувались для розгадування загадки.

Детальний приклад

Очікуваний вихід для [16, 17] - [вісімковий, десятковий] .

Ось чому:

  • Ми не можемо просто використовувати десятковий для обох чисел, оскільки вони обидва містять 1 .
  • 16 не може бути перетворений у двійковий, оскільки його представлення в цій базі ( 10000 ) містить кілька 0 's.
  • 17 також не може бути перетворений у двійковий, оскільки його представлення в цій базі ( 10001 ) містить кілька 0 's та кілька 1 ' s.
  • 17 не може бути перетворений у шістнадцятковий, оскільки його представлення в цій базі ( 11 ) складається з двох 1 's.
  • Розглянемо всі інші можливості:

                   +---------+---------+--------+
                   | oct(16) | dec(16) | hex(16)|
                   | = 20    | = 16    | = 10   |
    +--------------+---------+---------+--------+
    | oct(17) = 21 | 20,21   | 16,21   | 10,21  |
    | dec(17) = 17 | 20,17   | 16,17   | 10,17  |
    +--------------+---------+---------+--------+
    

    Єдине можливе рішення - перетворити 16 в восьмеричний ( 20 ) і зберегти 17 в десятковий ( 17 ). Таким чином, цифри 0 , 1 , 2 і 7 використовуються рівно один раз.

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

  • Вхід гарантовано призведе до унікального рішення. Ваш код не повинен підтримувати масиви, які дають кілька рішень або взагалі не мають рішення.
  • Ви можете виводити бази в будь-якому розумному форматі, наприклад ["bin", "oct", "dec", "hex"] , ['b', 'o', 'd', 'h'] , "BODH " , [2,8,10,16] , [0,1,2,3] тощо. Але це слід чітко пояснити у вашій відповіді.
  • Порядок основ у висновку повинен відповідати порядку вхідних цілих чисел.
  • Якщо це допомагає, ви можете припустити, що вхід сортується від найнижчого до найвищого або від найвищого до найнижчого.
  • Це , тому найкоротша відповідь у байтах виграє!

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

Вам не доведеться виводити наведені нижче результати переходів. Вони суто інформаційні.

Input                                  | Output          | Conversion result
---------------------------------------+-----------------+------------------------
[ 119 ]                                | O               | 167
[ 170 ]                                | D               | 170
[ 64222 ]                              | H               | FADE
[ 16, 17 ]                             | O/D             | 20/17
[ 14, 64, 96 ]                         | H/H/D           | E/40/96
[ 34, 37, 94 ]                         | O/D/H           | 42/37/5E
[ 2, 68, 82 ]                          | B/D/H           | 10/68/52
[ 22, 43, 96 ]                         | O/O/O           | 26/53/140
[ 3639, 19086, 57162 ]                 | H/D/H           | E37/19086/DF4A
[ 190, 229, 771 ]                      | O/H/O           | 276/E5/1403
[ 2, 44, 69, 99 ]                      | B/H/H/H         | 10/2C/45/63
[ 75, 207, 218, 357, 385 ]             | H/H/H/D/O       | 4B/CF/DA/357/601
[ 12, 28, 46, 78, 154, 188, 222, 240 ] | D/O/O/D/H/H/H/H | 12/34/56/78/9A/BC/DE/F0

Список необробленого входу доступний тут .


ми повинні дбати про якийсь аспект ефективності? (наприклад, якщо масив довжиною 1000 або щось подібне)
— DanielIndie

3
@DanielIndie Ні, не потрібно. Крім того, головоломка з 1000 записів міститиме багато повторюваних цифр, незалежно від використовуваних баз, тому вона не може бути дійсною. (Це гарантовано не відбудеться відповідно до першого правила.)
— Арнальд,

так, ти маєш рацію ... дурний мене ... :)
— DanielIndie

1
Дуже чекаю рішення Japt, тому що я спробував це і не зміг знайти хорошого.
— Ніт

2
@Scrooble Nope. :) Хороша спроба!
— Арнольд

Відповіді:


4

JavaScript (Node.js) , 192,155,154,152,151,145,136,113,99,92 90 байт

  • дякую @Arnauld за те, що він нагадав мені, що я можу повернути [0,1,2,3] -> що є [2,8,10,16] економить 8 байт, і за геніальну ідею (яка допоможе зменшити на 23+ байт)
  • завдяки @Kevin Cruijssen за зменшення на 1 байт
f=([c,...a],t="")=>c?[1,4,5,8].find(b=>T=!/(.).*\1/.test(n=t+c.toString(b*2))&&f(a,n))+T:a

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

Пояснення:

[c,...a]- @Arnauld хитрість приймати по одному предмету за раз c?***:" "-> якщо c не визначено, нам вдалося дійти до кінцевого результату- [] - якщо я поставив би "", ніж знахідка не вважала б це законним. ([] + 5 = "5" JS FTW) [1,4,5,8].findкожного разу, коли ми знаходимо правильну базу (вихід буде з цього масиву (1,4,5,8) -> (2,8,10,16) його легітим. тепер як працює find -> якщо він знаходить щось, він повертає елемент (1-8), а потім я додаю результат внутрішнього рішення. Якщо він не знаходить, то він повертає невизначений + T тепер хибно -> NaN, який у батьківський дзвінок буде вважатися помилковим

!/(.).*\1/.test(n=t+b) визначте, чи є в рядку дублікати, якщо так:

f(a,n)) просто перейдіть до наступного числа (a зараз array.slice (1)) з новим рядком (n)

ми присвоюємо результат T (temp) результату, тому що знаходимо зупинки, коли він знаходить, і тому ми знаємо, що останнім результатом буде f (), що є результатом B


1
t="",B=""щоб t="",B=tзберегти байт.
— Кевін Кройсейсен

@KevinCruijssen оновлює рішення, дякую :) (і вам Арнольд)
— DanielIndie

@Arnauld я взяв вашу геніальну ідею і зробив щось подібне. дивіться на рішення зараз
— DanielIndie

@Arnauld чиста дивовижність
— DanielIndie

1
Класно! Давайте поголимо ще 2 байти (і більше не потрібно trim()).
— Арнольд


3

Рубін, 72 71 байт

->a{a.map{%w[b o d x]}.inject(&:product).find{|c|/(.).*\1/!~[p,c]*?%%a}}

Формат виводу - це якась зворотна чудовисько S-виразу:

f[[12, 28, 46, 78, 154, 188, 222, 240]]
=> [[[[[[["d", "o"], "o"], "d"], "x"], "x"], "x"], "x"]

Сліш-поділ цього замість цього коштував би ще 3 байти (додається *?/).

Цей формат походить від структури циклу, трохи коротший, ніж більш ідіоматичний repeated_combination(a.size), який генерує масив масивів символів, а потім зменшує його над функцією перехресного продукту.

Редагувати: Збережено 1 байт завдяки Лінні.


2

Pyth, 21 20 байт

f{Is.bjYNTQ^[8T2y8)l

Повертає список усіх можливих списків баз (який завжди має довжину 1).
Спробуйте тут

Пояснення

f{Is.bjYNTQ^[8T2y8)l
           ^[8T2y8)lQ  Get the tuples of bases of the same length as the input.
f                      Filter to get those...
    .bjYNTQ            ... where converting bases elementwise...
   s                   ... and joining together...
 {I                    ... has no repeats.


2

Желе , 17 16 байт

⁴⁽%ʠḃṗL³bF⁼Q$ƲÐf

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

Повернути список баз.

 == Пояснення ==
⁴⁽% ʠḃṗL³bF⁼Q $ ƲÐf Головна посилання.
 ⁽% ʠ Число.
    ḃ конвертувати його в біективну базу ...
⁴ 16. Результат [2,8,10,16].
     ṗL декартовий живлення за вхідною довжиною.
             ƲÐf Фільтр, зберігайте ті, які задовольняють ...
       ³ вхід
        b перетворити на цю базу
         F, коли вирівняти (приєднайте всі цифри \
                      різні цифри разом)
          ⁼Q $, що дорівнює собі, неоднорідний.


2

05AB1E , 17 байт

2žv8T)sgãʒIsв˜DÙQ

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


Я не знаю 05AB1E, тому, можливо, я повинен зачекати, поки ви не додасте пояснення, перш ніж я запитаю це, але чому це результат для 8символу '8', а для інших трьох ціле число? +1, однак, здається, працює чудово, включаючи довші останні тестові випадки.
— Кевін Круїйсен

2
@KevinCruijssen Це походить від "2žv8T". Числа у вихідному коді висуваються як символи в 05AB1E, тоді як žv (16) і T (10) є вбудованими модулями, які висувають їх відповідні номери на стеку. Зазвичай це залишається непоміченим, оскільки неявне відображення останнього елемента в стеку 05AB1E перетворюється на числа, але оскільки в цьому випадку відображений результат є масивом елементів, ці елементи залишаються недоторканими, отже, і лапки. Команда ï, наприклад, може бути використана після) для передачі двох елементів char до ints.
— Калдо

@KevinCruijssen Приклад мого пояснення: tio.run/##MzBNTDJM/f/fyPbQDtv//wE Код: push 2, друк, загортання в масив, друк.
— Калдо


1

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

fȯS=UΣz`B¹πmDd1458L

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

Повертає списки баз

Пояснення

fȯS=UΣz`B¹πmDd1458L  Implicit input
                  L  Length of input
          π          Cartesian power of
             d1458     The digits of 1458  [1,4,5,8]
           mD          Double the digits   [2,8,10,16]
fȯ                   Filter by
      z`B¹             Zip with input by converting to its base
     Σ                 Concatenate
  S=U                  Equal to itself with unique elements
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.