주어진 길이의 마법 번호


13

프로그램은 ( n설명 목적으로) 입력을 받아서 n반복 숫자없이 긴 숫자 인 숫자 의 모든 순열을 출력 해야합니다. .

여기서 매직 넘버에 대해 읽을 수 있습니다 .

규칙 :

  • 1 <= n <= 10
  • 숫자를 반복 할 수 없습니다
  • 선행 0이 있어야합니다 (해당되는 경우).
  • 내지 1 x(1로서 첫 번째 문자로 시작하는) 수를 제 자리로 나눌 수 있어야 x, 예에서 30685, 31로 나누어 302의 배수이며, 3063의 배수이고, 30684의 배수이며, 30685(5)에 의해 divislbe 인 .
  • 프로그램은 명령 행을 통해, 함수 인수 등을 통해 입력으로 정수를 가져 와서 규칙을 만족하는 모든 순열을 인쇄해야합니다.
  • 출력은 하나 이상의 공백 문자로 분리되어야합니다.
  • 순열 시작하여 0으로 시작할 수 있습니다 ( 기술적으로 마법의 숫자 는 아닙니다 ).
  • 출력 순서는 중요하지 않습니다
  • 예기치 않은 입력을 처리 할 필요 가 없습니다.
  • 바이트 단위의 최소 문자가 이깁니다.

주어진 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 "관련"이 "중복"을 의미하지는 않습니다. 관련 링크를 게시하는 목적은 해당 도전 과제가 사이드 바에 "링크 됨"으로 표시되는 것입니다.
Martin Ender

1
관련 독서 : polydivisible numbers
Sp3000

3
선행 0에는 출력 번호가 포함되어야합니까?
xnor

4
출력 과 관련하여 인쇄공백을 언급 하지만 함수의 경우 가장 자연스러운 출력 형식은 아마도 목록을 반환 할 것입니다. 허용 되나요?
Dennis

답변:


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
이것이 느리다면 ... 내 대답은 졸린 슬러그입니다
Luis Mendo

6

자바 스크립트 (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]:[""]

편집 : @ edc65 덕분에 1 바이트가 절약되었습니다.


보석! 1 바이트 만 저장...of"012...
edc65

@ edc65 어, 나는 그것을 간과 믿을 수 없습니다.
Neil

3

Pyth, 19 바이트

jf!s%VsM._TS;.PjkUT

데모

무차별 대입 솔루션. 따라야 할 설명. FryAmTheEggman 덕분에 영감


22 바이트

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

데모

숫자는 문자열로 작성 및 저장되며, 분할 성을 확인하기 위해 int로만 변환됩니다.

설명:

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.

궁금합니다 : Pyth를 배우려면 얼마나 마조히즘 적이어야합니까? / s
DavisDude

2
@DavisDude 사람들이 그것을 볼 때 생각하는 것보다 쉽다고 생각합니다. 가장 무서운 부분이 시작됩니다. 일단 당신이에, 당신은에 있습니다.
FliiFe

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). 또한 설명을
부탁

이것은 여전히 ​​작동하지 않습니다.-3은 021, 024 등을 건너 뜁니다. 첫 번째 올바른 숫자는 063입니다.
DavisDude

@DavisDude 편집을 마쳤습니다. 이제 도전을 더 자세히 읽었습니다.
Luis Mendo

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

itertoolsSp3000 덕분에 26 바이트를 제거 하여 사용하지 않아야한다는 사실을 알게되었습니다.

filter팁에 대한 Sp3000 덕분에을 (를) 사용하지 않고 목록 이해를 사용하여 2 바이트를 삭제했습니다 .

온라인으로 사용해보십시오 : Python 2 , Python 3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.