Магическое число заданной длины


13

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

Вы можете прочитать о магических числах здесь .

Правила:

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

Примеры

Дано 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

демонстрация

Числа строятся и хранятся в виде строк и преобразуются только в целые, чтобы проверить делимость.

Объяснение:

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.

Мне любопытно: насколько мазохистским ты должен быть, чтобы учить Пифа? / s
DavisDude

2
@DavisDude Я думаю, что это легче, чем то, что думают люди, когда видят это. Самая страшная часть начинается. Как только вы
вошли

1
Имхо, это довольно просто из-за того, насколько вам помогает режим отладки. Документы также довольно хороши, и объясняют, что вам нужно знать.
Ven

Просто для справки, я закончил с еще одним использованием ._и некоторыми другими вещами, но для больших входов это работает медленнее: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

Python, 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.