จำนวนเวทมนตร์ของความยาวที่กำหนด


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 สำหรับพวกเขาเชื่อมโยง


ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/63183/42854
Daniel

6
@DavisDude "ที่เกี่ยวข้อง" ไม่ได้แปลว่า "ซ้ำ" จุดประสงค์ของการโพสต์ลิงค์ที่เกี่ยวข้องนั้นมีไว้เพื่อความท้าทายในการแสดงเป็น "เชื่อมโยง" ในแถบด้านข้าง
Martin Ender

1
การอ่านที่เกี่ยวข้อง: ตัวเลข
polydivisible

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

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 ฮึฉันไม่อยากจะเชื่อเลยว่าฉันมองข้ามสิ่งนั้นไป
Neil

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.

ฉันอยากรู้อยากเห็น: คุณต้องเรียนรู้วิธีการร้ายแบบร้าย ๆ / 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) คำอธิบายจะได้รับการชื่นชมด้วย
DavisDude

ยังไม่สามารถใช้งานได้ - 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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.