Магічне число заданої довжини


13

Ваша програма повинна взяти вхід ( nз метою опису) та вивести всі перестановки числа, яке розраховується nдовгими цифрами без повторюваних цифр, де кожна з цифр, що передують, включаючи її індекс, ділиться на місце на число, яке вона падає .

Про магічні числа ви можете прочитати тут .

Правила:

  • 1 <= n <= 10
  • Жодні цифри не можуть повторюватися
  • Попередній 0 повинен бути присутнім (якщо застосовується)
  • Перша- xй цифра числа (починаючи з першого символу як 1) повинна ділитися на x, тобто в 30685, 3ділиться на 1, 30ділиться на 2, 306ділиться на 3, 3068ділиться на 4, ділиться на 4, і 30685ділиться на 5 .
  • Програма повинна взяти ціле число як вхідне (через командний рядок, як аргумент функції тощо) та надрукувати всі перестановки, які відповідають правилам.
  • Вихідні дані повинні бути розділені одним або більше символом пробілу
  • Перестановки можуть починатися і з нуля (тому вони технічно не магічні числа).
  • Порядок виходу не має значення
  • Вам не потрібно обробляти несподіване введення
  • Найменше символів у байтах виграє

Приклади

Дано 1:

0
1
2
3
4
5
6
7
8
9

Дано 2:

02
04
06
08
10
12
14
16
18
20
24
26
28
30
32
34
36
38
40
42
46
48
50
52
54
56
58
60
62
64
68
70
72
74
76
78
80
82
84
86
90
92
94
96
98

Дано 10:

3816547290

Заслуга Pizza Hut та John H. Conway за оригінальну головоломку (Варіант A). Дякуємо @Mego та @ sp3000 за їх посилання .



6
@DavisDude "Пов'язане" не означає "дублікат". Метою розміщення пов’язаного посилання є те, щоб ця задача відображалася як "Зв'язане" на бічній панелі.
Мартін Ендер

1
Пов’язане читання: багатовіддільні числа
Sp3000

3
Чи потрібно включати вхідні номери 0, у яких вони є?
xnor

4
Ви згадуєте простір друку та пробілів, коли мова йде про вихід, але для функції найбільш природною формою виводу, ймовірно, буде повернення списку. Це дозволено?
Денніс

Відповіді:


4

Желе , 20 17 16 байт

QḣQV%S
ØDṗçÐḟRj⁷

Це дуже повільно і об'єм пам'яті ... Спробуйте в Інтернеті!

Як це працює

ØDṗçÐḟRj⁷  Main link. Input: n (integer)

ØD         Yield d := '0123456789'.
  ṗ        Compute the nth Cartesian power of d.
      R    Range; yield [1, ..., n].
    Ðḟ     Filter false; keep strings of digits for which the following yields 0.
   ç         Apply the helper link to each digit string and the range to the right.
       j⁷  Join the kept strings, separating by linefeeds.


QḣQḌ%S     Helper link. Arguments: s (digit string), r (range from 1 to n)

Q          Unique; deduplicate s.
 ḣ         Head; get the prefixes of length 1, ..., n or less.
           If s had duplicates, the final prefixes fill be equal to each other.
  Q        Unique; deduplicate the array of prefixes.
   V       Eval all prefixes.
    %      Compute the residues of the kth prefixes modulo k.
           If s and the array of prefixes have different lengths (i.e., if the
           digits are not unique), some right arguments of % won't have corr. left
           arguments. In this case, % is not applied, and the unaltered right
           argument is the (positive) result.
     S     Add all residues/indices. This sum is zero iff all digits are unique
           and the kth prefixes are divisible by k.

3
Якщо це повільно ... моя відповідь - сонний слимак
Луїс Мендо

6

JavaScript (Firefox 30-57), 77 байт

f=n=>n?[for(s of f(n-1))for(c of"0123456789")if(s.search(c)+(s+c)%n<0)s+c]:[""]

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


Самоцвіт! просто збережіть 1 байт за допомогою...of"012...
edc65

@ edc65 Фу, я не можу повірити, що я це не помітив.
Ніл

3

Pyth, 19 байт

jf!s%VsM._TS;.PjkUT

Демонстрація

Жорстоке рішення. Пояснення слід. Натхнення завдяки FryAmTheEggman


22 байти

juf!%sThH{I#sm+LdTGQ]k

Демонстрація

Числа будуються і зберігаються у вигляді рядків і перетворюються лише на ints, щоб перевірити подільність.

Пояснення:

juf!%sThH{I#sm+LdTGQ]k
 u                 Q]k    Apply the following input many times, starting with ['']
             m    G       For each string at the previous step,
              +LdT        Append each digit to it
            s             Concatenate
         {I#              Filter out strings with repeats
  f                       Filter on
     sT                   The integer
    %  hH                 Mod the 1 indexed iteration number
   !                      Is zero.
j                         Join on newlines.

Мені цікаво: наскільки мазохістським ви повинні бути, щоб пізнати Піта? / с
DavisDude

2
@DavisDude Я думаю, що це простіше, ніж те, що думають люди, коли вони це бачать. Найстрашніша частина починається. Як тільки ви
потрапили

1
Досить просто, imho, через те, наскільки вам допомагає режим налагодження. Документи також досить хороші та пояснюють, що вам потрібно знати.
Високоповажний

Для довідки, я закінчився ще одним використанням ._та деякими іншими речами, але це більше повільно для великих вкладів:jjLkf!s.e%ib10hk._T.PUT
FryAmTheEggman

3

MATL , 30 байт

4Y2Z^!"@Sd@!U10G:q^/kPG:\~h?@!

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

Це дуже повільно. На input 3це потрібно кілька секунд в онлайн-компіляторі. Щоб побачити числа, що з’являються одне за одним, додайте в Dкінці коду .

Пояснення

4Y2       % predefined literal: string '0123456789'
Z^        % implicit input. Cartesian power: 2D char array. Each number is a row
!         % transpose
"         % for each column
  @       %   push current column
  Sd      %   sort and compute consecutive differences (*)
  @!U     %   push current column. Convert to number
  10G:q^  %   array [1 10 100 ... 10^(n-1)], where n is the input
  /k      %   divide element-wise. Round down
  P       %   reverse array
  G:      %   array [1 2 ... n]
  \~      %   modulo operation, element-wise. Negate: gives 1 if divisible (**)
  h       %   concatenate (*) and (**). Truthy if all elements are nonzero
  ?       %   if so
    @!    %     current number as a row array of char (string)
          %   implicitly end if
          % implicitly end if
          % implicitly display stack contents

Щось не так з вашим кодом; Він припиняє видавати для мене результат після 5, а з 5 останнє число (єдине, кого я намагався перевірити) невірно. 986 не ділиться на 3
DavisDude

Оновлення: для 2 вона пропускає 10, 12, 32, 34, 54, 56, 76, 78
DavisDude

Я думаю, ви неправильно зрозуміли підказку. Дивлячись, 3я бачу, що у вас є кілька ознак (наприклад, 026). Також пояснюється пояснення
DavisDude

Це все ще не працює - 3 пропускає 021, 024 тощо. Перше правильне число - 063.
DavisDude

@DavisDude Відредаговано, тепер, коли я уважніше прочитав виклик
Луїс Мендо

1

Рубін, 87 байт

Основний рекурсивний розчин.

f=->n,x="",j=1{j>n ?puts(x):([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}}

Якщо вам дозволяється повернути список перестановок замість друку, 85 байт:

f=->n,x="",j=1{j>n ?x:([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}-[p]}

1

Пітон, 132 байти

lambda n:[x for x in map(("{:0%s}"%n).format,(range(10**n)))if all(int(x[:i])%i<1and len(set(x))==len(x)for i in range(1,len(x)+1))]

Випавши 26 байтів, позбувшись itertools, завдяки Sp3000 за те, що я зрозумів, що я не повинен його використовувати.

Випав 2 байти, використовуючи розуміння списку, а не filterзавдяки ще раз спасибі Sp3000 за підказку.

Спробуйте в Інтернеті: Python 2 , Python 3

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