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


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.