Усі ксенодроми


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

1
чи існує межа до n?
FlipTack

@ Flp.Tkc Ні. Це повинно бути здатне обробляти досить високі n. Я не хочу, щоб виклик обмежувався тим, наскільки високою базовою базою є конвертація вбудованої бази.
Artyer

@Artyer Це, мабуть, було частиною тексту виклику. Здається, деякі відповіді вже роблять це
Луїс Мендо

Я знаю, що базове перетворення в Pyth може обробляти значення, що перевищують 36 , але оскільки для цього потрібні всі ксенодроми, базовий пітон розривається, коли список стає занадто великим, кажучи, що він не може вмістити значення в a 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

Нічого собі, рішення коротше, ніж рішення 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ḅ³

СпробуйтеItOnline!

Працює для будь-якого 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якби точність не була проблемою, що, на мою думку, робить її недійсною ...
ETHproductions

@Artyer Я переніс свою пакетну версію, тож тепер це буде працювати з nвід 1до того, 13як точність з плаваючою комою вбиває її.
Ніл

Мені подобається, як рішення починаються по-справжньому коротко, а потім раптом стрибають на порядок.
Нісса

2

Perl 6 , 47 байт

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

Повертає послідовність . ( Seq - це основна інтерактивна обгортка для Iterator s)

При введенні 16цього потрібно 20 секунд, щоб обчислити 53905-й елемент Seq ( 87887).

Розширено:

{       # 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
  }
}

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-бітну арифметику. Зручно, що Batch оцінює 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

Математика, 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

Математика, 48 55 байт

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

(Потрійний простір між xs потрібно замінити 3-байтовим символом \ uF4A1, щоб код працював.)

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


1
Невдачі для 2. Функція дає {0, 1}. Я вважаю, що вам потрібно Permutations[Range@#-1, #]замість цього Subsets[Range@#-1].
JungHwan Min

Га, яка помилка з головою. Дякуємо, що стежили за цим, і за те, що запропонували ідеальний виправлення!
Грег Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.