Все ксенодромы

15

Вступление

Ксенодром в базе n - это целое число, в котором все его цифры в базе n различны. Вот некоторые последовательности OEIS ксенодромов.

Так , например, в базе 16, FACE, 42и FEDCBA9876543210некоторые xenodromes (которые 64206, 66и 18364758544493064720в базе 10), но 11и DEFACEDне являются.

Вызов

Учитывая входную базу n , выведите все ксенодромы для этой базы в базе 10 .

Вывод должен быть в порядке от наименьшего к наибольшему. Должно быть понятно, где заканчивается термин в последовательности и начинается новый (например [0, 1, 2], ясно, где 012нет.)

n будет целым числом больше 0.

Разъяснения

Эта задача делает IO специально в базе 10, чтобы избежать обработки целых чисел и их базы в виде строк. Задача заключается в абстрактной обработке любой базы. Поэтому я добавляю это дополнительное правило:

Целые числа не могут быть сохранены как строки в базе, отличной от базы 10.

Ваша программа должна быть способна теоретически обрабатывать достаточно высокие значения n, если бы не было времени, памяти, точности или других технических ограничений при реализации языка.

Это , поэтому выигрывает самая короткая в байтах программа.

Пример ввода и вывода

1  # Input
0  # Output
2
0, 1, 2
3
0, 1, 2, 3, 5, 6, 7, 11, 15, 19, 21
4
0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 18, 19, 24, 27, 28, 30, 33, 35, 36, 39, 44, 45, 49, 50, 52, 54, 56, 57, 75, 78, 99, 108, 114, 120, 135, 141, 147, 156, 177, 180, 198, 201, 210, 216, 225, 228
Artyer
источник
1
есть ли предел?
FlipTack
@ Flp.Tkc Нет. Должно быть в состоянии справиться с достаточно высоким n. Я не хочу, чтобы проблема была ограничена тем, насколько высокой может справиться встроенная базовая конверсия языка.
Artyer
@Artyer Это должно было быть частью текста вызова. Кажется, некоторые ответы уже делают это
Луис Мендо
Я знаю, что базовое преобразование в Pyth может обрабатывать значения больше 36 , но поскольку для этого нужны все ксенодромы, базовый питон разрывается, когда список становится слишком большим, говоря, что он не может соответствовать значению в ssize_t. Разбивается ли это таким образом?
FryAmTheEggman
2
Кто-то, кажется, недооценил все ответы, которые не могут обрабатывать большие базы из-за встроенного предела точности, который также кажется реализацией, а не проблемой алгоритма. Не могли бы вы уточнить?
Деннис

Ответы:

10

Pyth , 8 байт

f{IjTQU^

Фильтрует числа в [0, n ^ n - 1], если в базе n нет повторяющихся элементов . Преобразование базы в Pyth будет работать с любой базой, но, поскольку при этом просматривается очень быстро растущий список чисел, он в конечном итоге не сможет сохранить значения в памяти.

Попробуйте онлайн!

Объяснение:

f{IjTQU^QQ    - Auto-fill variables
      U^QQ    - [0, n^n-1]
f             - keep only those that ...
 {I           - do not change when deduplicated
   jTQ        - are converted into base n
FryAmTheEggman
источник
Ничего себе, решение, которое короче, чем решение Jelly, которое сделал Деннис! : 'P
HyperNeutrino
3
Никто не побеждает Желе. ¶:
Роман Греф
5

Python 2, 87 байт

n=input()
for x in range(n**n):
 s={n};a=x
 while{a%n}|s>s:s|={a%n};a/=n
 print-~-a*`x`

Печатает лишние пустые строки для не ксенодромов:

golf % python2.7 xenodromes.py <<<3
0
1
2
3

5
6
7



11



15



19

21
Линн
источник
5

Желе , 9 8 байт

ð*ḶbQ€Qḅ

Спасибо @JonathanAllan за отыгрывание 1 байта!

Попробуйте онлайн! или проверьте все тестовые случаи .

Как это устроено

ð*ḶbQ€Qḅ  Main link. Argument: n

ð         Make the chain dyadic, setting both left and right argument to n.
          This prevents us from having to reference n explicitly in the chain.
 *        Compute nⁿ.
  Ḷ       Unlength; yield A := [0, ..., nⁿ - 1].
   b      Convert each k in A to base n.
    Q€    Unique each; remove duplicate digits.
      Q   Unique; remove duplicate digit lists.
       ḅ  Convert each digit list from base n to integer.
Деннис
источник
4

Желе , 12 байт

*`ḶbµQ⁼$Ðfḅ³

TryItOnline!

Будет работать для любого n , учитывая достаточно памяти, базовое преобразование Jelly не является ограничительным.

Как?

*`ḶbµQ⁼$Ðfḅ³ - Main link: n
    µ        - monadic chain separation
*            - exponentiation with
 `           - repeated argument, i.e. n^n
  Ḷ          - lowered range, i.e. [0,1,2,...,n^n-1]
   b         - covert to base n (vectorises)
        Ðf   - filter keep:
       $     -     last two links as a monad
     Q       -         unique elements
      ⁼      -         equals input (no vectorisation)
           ³ - first program argument (n)
          ḅ  - convert from base (vectorises)
Джонатан Аллан
источник
3

JavaScript (ES7), 86 байт

n=>{a=[];for(i=n**n;i--;j||a.unshift(i))for(j=i,b=0;(b^=f=1<<j%n)&f;j=j/n|0);return a}
Нил
источник
Сбой для 1(должен выводить [0], но RangeErrors.)
Artyer
Именно то, что у меня было, но это теоретически не 37
помогло
@Artyer Я портировал свою пакетную версию, так что теперь это будет работать nот 1до 13до, пока точность с плавающей запятой не убьет его.
Нил
Мне нравится, как решения начинаются очень коротко, а потом внезапно прыгают на порядок.
Нисса
2

Perl 6 , 47 байт

{(0..$_**$_).grep: !*.polymod($_ xx*).repeated}

Возвращает Seq . ( Seq - это базовая оболочка Iterable для Iterator. )

Для ввода 1653905-го элемента Seq требуется 20 секунд.87887 ) .

Expanded:

{       # bare block lambda with implicit parameter 「$_」

  ( 0 .. ($_ ** $_) )    # Range of values to be tested

  .grep:                 # return only those values

    !\                   # Where the following isn't true
    *\                   # the value
    .polymod( $_ xx * )  # when put into the base being tested
    .repeated            # has repeated values
  }
}
Брэд Гилберт b2gills
источник
2

Пакет, 204 200 байт

@set/an=%1,m=1
@for /l %%i in (1,1,%1)do @set/am*=n
@for /l %%i in (0,1,%m%)do @set/ab=0,j=i=%%i&call:l
@exit/b
:l
@set/a"f&=b^=f=1<<j%%n,j/=n"
@if %f%==0 exit/b
@if %j% gtr 0 goto l
@echo %i%

Не будет работать при n> 9, потому что Batch имеет только 32-битную арифметику. Удобно, Пакет оценивает f &= b ^= f = 1 << j % nкак f = 1 << j % n, b = b ^ f, f = f & bа не f = f & (b = b ^ (f = 1 << j % n)).

Нил
источник
2

Mathematica, 59 48 байтов

Select[Range[#^#]-1,xMax[x~DigitCount~#]==1]&

Содержит U + F4A1 «Персональное использование»

объяснение

Range[#^#]-1

Генерировать {1, 2, ..., n^n}. Вычесть 1. (дает {0, 1, ..., n^n - 1})

xMax[x~DigitCount~#]==1

Булева функция: Trueесли каждая цифра встречается в базе не более одного раза n.

Select[ ... ]

Из списка {0, 1, ..., n^n - 1}выберите те, которые выдаются Trueпри применении вышеуказанной логической функции.

59-байтовая версия

Select[Range[#^#]-1,xDuplicateFreeQ[x~IntegerDigits~#]]&
Юнг Хван Мин
источник
2

Mathematica, 48 55 байтов

Union[(x   x~FromDigits~#)/@Permutations[Range@#-1,#]]&

(Тройной пробел между x символами s должен быть заменен 3-байтовым символом \ uF4A1, чтобы код работал.)

Безымянная функция одного аргумента. Вместо проверки целых чисел на ксенодромность, он просто генерирует все возможные перестановки подмножеств разрешенных цифр (что автоматически избегает повторения) и преобразует соответствующие целые числа в основание 10. Каждый ксенодром генерируется дважды, как с начальным 0, так и без него; Unionудаляет дубликаты и сортирует список для загрузки.

Грег Мартин
источник
1
Терпит неудачу за 2. Функция дает {0, 1}. Я считаю, что вам нужно, Permutations[Range@#-1, #]а не Subsets[Range@#-1].
JungHwan Мин
Что за глупая ошибка. Спасибо за то, что вы наблюдали за этим, и за то, что предложили идеальное решение!
Грег Мартин