Magiczna liczba o danej długości

13

Twój program musi przyjąć dane wejściowe ( ndo celów opisu) i wypisać wszystkie permutacje liczby, która jest ndługa, bez powtarzających się cyfr, gdzie każda z cyfr poprzedzających indeks wraz z indeksem jest podzielna przez miejsce w liczbie, w której się znajduje .

Możesz przeczytać o magicznych liczbach tutaj .

Zasady:

  • 1 <= n <= 10
  • Żadne cyfry nie mogą się powtarzać
  • Wiodące 0 musi być obecne (jeśli dotyczy)
  • Od 1 do 3 xcyfry liczby (zaczynając od pierwszego znaku jako 1) muszą być podzielne przez x, tj. W 30685, 3jest podzielne przez 1, 30jest podzielne przez 2, 306jest podzielne przez 3, 3068jest podzielne przez 4 i 30685jest podzielne przez 5 .
  • Program musi przyjmować liczbę całkowitą jako dane wejściowe (poprzez wiersz poleceń, jako argument funkcji itp.) I wypisać wszystkie kombinacje spełniające reguły.
  • Dane wyjściowe muszą być oddzielone co najmniej 1 spacją
  • Permutacje mogą zaczynać się od zera (więc nie są to technicznie magiczne liczby).
  • Kolejność produkcji nie ma znaczenia
  • Zdajesz nie trzeba obsłużyć nieoczekiwane wejście
  • Wygrywa najmniej znaków w bajtach

Przykłady

Biorąc pod uwagę 1:

0
1
2
3
4
5
6
7
8
9

Biorąc pod uwagę 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

Biorąc pod uwagę 10:

3816547290

Podziękowania dla Pizza Hut i Johna H. Conwaya za oryginalną układankę (Opcja A). Dzięki @Mego i @ sp3000 za ich linki .

DavisDude
źródło
6
@DavisDude „Pokrewne” nie oznacza „duplikatu”. Celem opublikowania powiązanego linku jest wyświetlenie tego wyzwania jako „Połączone” na pasku bocznym.
Martin Ender,
1
Literatura pokrewna
możliwe do podzielenia
3
Czy wiodące zera muszą zawierać numery wyjściowe, które je mają?
xnor
4
Jeśli chodzi o dane wyjściowe, wspominasz o drukowaniu i białych znakach , ale dla funkcji najbardziej naturalną formą danych wyjściowych byłoby prawdopodobnie zwrócenie listy. Czy to jest dozwolone?
Dennis

Odpowiedzi:

4

Galaretka , 20 17 16 bajtów

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

Jest to bardzo wolne i wymaga dużej ilości pamięci ... Wypróbuj online!

Jak to działa

Ø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.
Dennis
źródło
3
Jeśli to jest powolne ... moja odpowiedź to śpiący ślimak
Luis Mendo
6

JavaScript (Firefox 30-57), 77 bajtów

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

Edycja: Zapisano 1 bajt dzięki @ edc65.

Neil
źródło
Klejnot! po prostu zapisz 1 bajt z...of"012...
edc65
@ edc65 Ugh, nie mogę uwierzyć, że przeoczyłem to.
Neil,
3

Pyth, 19 bajtów

jf!s%VsM._TS;.PjkUT

Demonstracja

Rozwiązanie brutalnej siły. Wyjaśnienie do naśladowania. Inspiracja dzięki FryAmTheEggman


22 bajty

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

Demonstracja

Liczby są budowane i przechowywane jako ciągi znaków i są konwertowane tylko na ints, aby sprawdzić podzielność.

Wyjaśnienie:

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.
isaacg
źródło
Jestem ciekawy: jak masochistyczny musisz być, aby uczyć się Pytha? / s
DavisDude,
2
@ DavisDude Myślę, że jest łatwiej niż to, co ludzie myślą, kiedy to widzą. Najstraszniejsza część się zaczyna. Kiedy już wejdziesz, wejdziesz.
FliiFe,
1
To dość proste, imho, ponieważ bardzo pomaga ci tryb debugowania. Dokumenty są również całkiem dobre i wyjaśniają, co musisz wiedzieć.
Ven
Dla porównania, skończyłem z jeszcze jednym użyciem ._i kilkoma innymi rzeczami, ale dla dużych nakładów jest on o wiele wolniejszy:jjLkf!s.e%ib10hk._T.PUT
FryAmTheEggman
3

MATL , 30 bajtów

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

Wypróbuj online!

Jest bardzo wolny. W input 3kompilatorze internetowym zajmuje to kilka sekund. Aby zobaczyć liczby pojawiające się jeden po drugim, dołącz Dna końcu kodu .

Wyjaśnienie

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
Luis Mendo
źródło
Coś jest nie tak z twoim kodem; Przestaje generować dla mnie wynik po 5, a przy 5 ostatnia liczba (jedyna, o którą starałem się sprawdzić) jest niepoprawna. 986 nie można podzielić przez 3
DavisDude,
Aktualizacja: dla 2 przeskakuje o 10, 12, 32, 34, 54, 56, 76, 78
DavisDude,
Myślę, że źle zrozumiałeś monit. Patrząc na 3widzę, że masz kilka wskazań (np. 026). Docenione zostanie również wyjaśnienie
DavisDude,
To wciąż nie działa - 3 pomija 021, 024 itd. Pierwszym poprawnym numerem jest 063.
DavisDude
@DavisDude Edytowane, teraz, gdy uważniej przeczytałem wyzwanie
Luis Mendo
1

Rubinowy, 87 bajtów

Podstawowe rozwiązanie rekurencyjne.

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

Jeśli zamiast drukowania możesz zwrócić listę permutacji, 85 bajtów:

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]}
Wartość tuszu
źródło
1

Python, 132 bajty

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))]

Usunąłem 26 bajtów, pozbywając się itertools, dzięki Sp3000 za uświadomienie mi, że nie powinienem go używać.

Usunąłem 2 bajty, używając zamiast tego listy filter, dzięki jeszcze raz dzięki Sp3000 za wskazówkę.

Wypróbuj online: Python 2 , Python 3

Mego
źródło