Несколько баз, но не дважды одна и та же цифра


15

вход

Непустой массив натуральных чисел.

задача

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

Выход

Список баз, которые были использованы для решения головоломки.

Подробный пример

Ожидаемый результат для [16, 17] - [восьмеричное, десятичное] .

Вот почему:

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

                   +---------+---------+--------+
                   | 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 Нет. :) Хорошая попытка!
Арно

Ответы:


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) легитимны. Теперь, как работает поиск -> если он что-то находит, он возвращает элемент (1-8), а затем я добавляю результат внутреннего решения. Если он не находит, то он возвращает undefined + T теперь false -> NaN, который в родительский вызов будет считаться ложным

!/(.).*\1/.test(n=t+b) определить, есть ли в строке дубликаты, если так:

f(a,n)) просто перейдите на следующий номер (теперь это 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].
     CarL декартова мощность по длине входа.
             Фильтр, оставь те, которые удовлетворяют ...
       ³ вход
        б преобразовать в эту базу
         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 в целые.
Кальдо

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