นับถอยหลังมิติ


17

เขียนฟังก์ชัน f (n, k) ที่แสดงการนับถอยหลัง k-dimension จาก n

การนับถอยหลัง 1 มิติจาก 5 ดูเหมือนว่า

 54321

การนับถอยหลัง 2 มิติจาก 5 ดูเหมือนว่า

 54321
 4321
 321
 21
 1

ในที่สุดการนับถอยหลัง 3 มิติจาก 5 ดูเหมือนว่า

 54321
 4321
 321
 21
 1
 4321
 321
 21
 1
 321
 21
 1
 21
 1
 1

นิยามอย่างเป็นทางการ

การนับถอยหลัง 1 มิติจาก n ใด ๆ เป็นบรรทัดเดียวที่มีตัวเลข n, n-1, ... , 1 ต่อกัน (ตามด้วยบรรทัดใหม่)

สำหรับ k ใด ๆ การนับถอยหลัง k-dimension จาก 1 เป็นบรรทัดเดียว

 1

สำหรับ n> 1 และ k> 1 การนับถอยหลัง k-dimension จาก n คือการนับถอยหลังแบบมิติ (k-1) - มิติจาก n ตามด้วยการนับถอยหลัง k-dimension จาก n-1

อินพุต

จำนวนเต็มบวกสองค่า k และ n <= 9 ในรูปแบบที่คุณเลือก

เอาท์พุต

การนับถอยหลัง k-dimension จาก n พร้อมการขึ้นบรรทัดใหม่หลังจากการนับถอยหลัง 1 มิติแต่ละครั้ง มีการขึ้นบรรทัดใหม่พิเศษในเอาต์พุต

เกณฑ์การให้คะแนน

เกณฑ์มาตรฐานกอล์ฟ

ตัวอย่างโบนัส

นี่คือตัวอย่างของ k> n, การนับถอยหลัง 4 มิติจาก 3 (พร้อมความคิดเห็นเพิ่มเติมที่ไม่รวมอยู่ในการแก้ไขปัญหาจริง):

 -- 3-dimensional countdown from 3
 321
 21
 1
 21
 1
 1
 -- 4-dimensional countdown from 2:
 ---- 3-dimensional countdown from 2:
 21
 1
 1
 ---- 4-dimensional countdown from 1:
 1  

ชี้แจง:

ตัวเลขในบรรทัดไม่จำเป็นต้องอยู่ติดกัน แต่จะต้องเว้นระยะเท่ากัน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบแทนฟังก์ชั่นหากคุณต้องการ


ฉันไม่แน่ใจว่าฉันเข้าใจกรณีทดสอบอย่างถูกต้อง 3D และ 4D นับถอยหลังจาก 2 เหมือนกันหรือไม่?
Dennis

1
@ เดนนิสฉันคิดว่าเจตนาคือการนับถอยหลัง 4D จาก 2 = นับถอยหลัง 3D จากการนับถอยหลัง 2 + 4D ตั้งแต่วันที่ 1
Sp3000

ไม่ควรพูด 3d countdown จากอันเดียวใช่ไหม
เลมอนที่ทำลายได้

บรรทัดใหม่พิเศษที่ได้รับอนุญาตในการส่งออก ไม่ว่าจะอ้างถึงท้ายบรรทัดใหม่หรือพวกเขาสามารถเกิดขึ้นได้ทุก?
เดนนิส

@Dennis newlines สามารถเกิดขึ้นได้ทุกที่ 543 \ n21 ไม่เป็นไร แต่หลังจาก '1' ไปก็ไม่เป็นไร
Eric Tressler

คำตอบ:


15

Python ขนาด 60 ไบต์

f=lambda n,k:n>1<k and f(n,k-1)+f(n-1,k)or'987654321\n'[~n:]

ทดสอบบนIdeone

มันทำงานอย่างไร

kนับถอยหลังจากมิติnสามารถกำหนดกับกรณีฐานเดียว:

ถ้าn = 1หรือk = 1เอาต์พุตจะเป็นn || n-1 || ... || 1 || ¶ , ที่ไหน|| หมายถึงการต่อข้อมูล

ใช้นิยามแบบเรียกซ้ำจากคำถามf(n,k)ส่งคืนf(n,k-1)+f(n-1,k)ถ้าn> 1และk> 1 ; มิฉะนั้นจะส่งคืนn + 1สุดท้ายอักขระตัว'987654321\n'สุดท้าย


เดนนิสดีเกินไป คุณเป็นอย่างไรบ้าง
clismique

ข้อมูลเชิงลึกอย่างเดียวของฉันที่นี่คือคุณสามารถรวมทั้งสองกรณีพื้นฐาน ส่วนที่เหลือเป็นเพียงการแปลโดยตรงของคำจำกัดความซ้ำ
Dennis

8

เยลลี่ขนาด 8 ไบต์

R¡UḌFṚp⁷

นี่เป็นโปรแกรมเต็มรูปแบบที่คาดว่าnและkเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ลองออนไลน์!

มันทำงานอย่างไร

R¡UḌFṚp⁷  Main link. Left argument: n. Right argument: k

 ¡        Repeat the link to the left k times.
R           Range; map each integer j in the previous return value to [1, ..., j].
  U       Upend; reverse each 1-dimensional array in the result.
   Ḍ      Undecimal; convert each 1-dimensional array from base 10 to integer.
    F     Flatten the resulting array.
     Ṛ    Reverse the result.
      p⁷  Cartesian product with '\n'. (Join is weird for singleton arrays.)

ไม่ได้Yทำงานในสถานที่ของp⁷?
ไมล์

เรียงจาก สำหรับมันแสดง5, 1 [54321]
เดนนิส

5

Javascript, 40 38 37 ไบต์

บันทึก 1 ไบต์ขอบคุณ @ edc65:

f=(n,k)=>k*n?f(n,k-1)+f(n-1,k):n||`
`

คำตอบก่อนหน้า

38 ไบต์ขอบคุณ @Neil:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n||`
`

40 ไบต์:

f=(n,k)=>k&&n?f(n,k-1)+f(n-1,k):n?n:'\n'

1
บันทึกหนึ่งไบต์โดยใช้แทน|| ?n:บันทึกไบต์อื่นโดยใช้การขึ้นบรรทัดใหม่ภายในตัวอักษรอัตโนมัติแทน` '\n'
Neil

ดีที่สุดที่ฉันสามารถทำได้โดยไม่ต้องขึ้นบรรทัดใหม่คือ 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Neil

@ ไม่มีฉันใช้ notepad ++ นับไบต์และตัวอักษรขึ้นบรรทัดใหม่นับเป็น 2 อักขระ
Hedi

บางทีคุณอาจลองใช้มันใน scratchpad ของเบราว์เซอร์แทน
Neil

1
ฉลาด +1 แต่ใช้แทน* &&
edc65

3

Python 76 76ไบต์

-1 ไบต์ขอบคุณ @ Sp3000

c=lambda n,k:k>1and'\n'.join(c(n-i,k-1)for i in range(n))or'987654321'[-n:]

ดำเนินการตามขั้นตอนที่อธิบายไว้ใน OP: รวมnผลลัพธ์ที่ลดลงสำหรับการk-1ขึ้นบรรทัดใหม่ด้วยฐานของการสอบถามซ้ำของ'n...1'สตริงเมื่อkมีค่า1( kไม่มากกว่า1เนื่องจากเรารับประกันการkป้อนข้อมูลเชิงบวก)

กรณีทดสอบบนideone


3

Python, 86 81 80 ไบต์

o=lambda d,n:"987654321"[-n:]if d<2else"\n".join([o(d-1,n-x) for x in range(n)])

d คือจำนวนมิติ nคือจำนวนนับถอยหลัง

จะโพสต์คำอธิบายในไม่ช้า

แก้ไข # 1: เปลี่ยนเป็นแลมบ์ดา

แก้ไข # 2: บันทึก 1 ไบต์ด้วย @DestructibleWatermelon


3

Haskell, 57 ไบต์

n#1='\n':(show=<<[n,n-1..1])
1#_=1#1
n#k=n#(k-1)++(n-1)#k

ตัวอย่างการใช้: 5 # 3->"\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1" ->

การนำไปใช้โดยตรงของคำจำกัดความ


2

แร็กเก็ต 215 ไบต์

(define(g n k(s(number->string n)))(cond [(< k 2) n]
[else(define o(for/list((i(string-length s)))
(string->number(substring s i))))(for/list((x o))(g x(- k 1)))])) 
(define(f n k)(for-each println(flatten(g n k))))

การทดสอบ:

(f 54321 3)

54321
4321
321
21
1
4321
321
21
1
321
21
1
21
1
1

อืมม ... ในโหมด 3 มิติทำไมจึง54321ปรากฏสองครั้ง
Erik the Outgolfer

ฉันพยายามเรียงลำดับปัญหา
rnso

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀปัญหาได้รับการแก้ไขแล้ว
rnso

เจ๋งและฉันก็เห็นคุณลบช่องว่างมากมาย!
Erik the Outgolfer

ในไม้โดยใช้แลมบ์ดา ( λ) defineอยู่เสมอน้อยกว่าการใช้ไบต์ นอกจากนี้การป้อนข้อมูลสำหรับการถูกระบุให้เป็นหมายเลขที่คุณสร้างได้n (range 1 n)ดูเพิ่มเติมเกี่ยวกับการเปลี่ยนของคุณcondที่มีตั้งแต่คุณประหยัดไบต์บนif else
Steven H.

2

J, 38 37 32 ไบต์

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)

นี่คือฟังก์ชั่นที่รับkบน LHS และnบน RHS

บันทึก 5 ไบต์ด้วยแนวคิดจาก @ Adám

การใช้

   f =: a:":@>@-.~&,0<@-."1~0&(](-i.)"0)
   3 f 5
5 4 3 2 1
4 3 2 1  
3 2 1    
2 1      
1        
4 3 2 1  
3 2 1    
2 1      
1        
3 2 1    
2 1      
1        
2 1      
1        
1

คำอธิบาย

a:":@>@-.~&,0<@-."1~0&(](-i.)"0)  Input: k on LHS, n on RHS
                    0&(        )  Repeat k times on initial value n
                        (   )"0   For each value x
                          i.        Make the range [0, x)
                         -          Subtract x from each to make the range [x, 1]
                       ]            Return the array of ranges
            0  -."1~              Remove the zeros from each row
             <@                   Box each row
          &,                      Flatten the array of boxes
a:     -.~                        Remove the empty boxes
     >@                           Unbox each
  ":@                             Convert it into a string and return

คุณควรจะสามารถที่จะใช้วิธีการของฉัน
อดัม

@ Adámขอบคุณฉันจะลอง
ไมล์

2

Dyalog APL ขนาด 18 ไบต์

แจ้งสำหรับnแล้วสำหรับk

~∘'0'1⍕(⌽⍳)⍤0⍣⎕⊢⎕

~∘'0'⍤1ลบ ( ~) ศูนย์ ( '0') ศูนย์ ( ) จากแถว (⍤1 ) (ขยายด้วยช่องว่างตามที่จำเป็น) ของ

ตัวแทนของตัวละคร

(⌽⍳)⍤0⍣⎕ย้อนกลับ ( ) นับจนถึง ( ) แต่ละสเกลาร์ ( ⍤0), ทำซ้ำ ( ) อินพุต () ) ครั้ง

บน

ใส่ตัวเลข

ลองใช้ออนไลน์!


2

C 93 ไบต์

การนำไปใช้ซ้ำแล้วซ้ำอีก

m,i,j;f(n,k){for(;m<k+2;m++)for(j=0;j<n;j++){for(i=m;i<n-j;i++)printf("%d",n-j-i);puts("");}}

C 67 65 61 56 52 52 ไบต์

การใช้งานแบบเรียกซ้ำ

f(n,k){n*k?f(n,k-1)+f(n-1,k):puts("987654321"+9-n);}

คุณไม่สามารถประกาศสตริงโดยไม่ใช้ถ่าน * ดังนั้นการใช้งานแบบเรียกซ้ำของคุณจึงไม่ได้รวบรวม แต่การแก้ปัญหาเป็นเรื่องง่ายมากและประหยัด 4 ไบต์: เพียงแค่เปลี่ยนmภายในโทรกับputs() "987654321"
G. Sliepen

ฉันรวบรวมโดยใช้ gcc (GCC) 3.4.4 (พิเศษทางโทรศัพท์, gdc 0.12 โดยใช้ dmd 0.125) ฉันคิดว่ามันใช้ได้เนื่องจากฉันเพิ่งแปลงจาก char * เป็น int อย่างไรก็ตามเนื่องจากโซลูชันของคุณมีขนาดเล็กลง 4 ไบต์ฉันชอบมันมากกว่า ขอบคุณ
cleblanc

1

แบตช์ 117 ไบต์

@setlocal
@set/an=%1-1,k=%2-1,p=n*k,s=987654321
@if %p%==0 (call echo %%s:~-%1%%)else call %0 %1 %k%&call %0 %n% %2

คำตอบ Python ของ Port of Dennis ♦


1

Ruby, 56 ไบต์

f=->n,k{n>1&&k>1?[f[n,k-1],f[n-1,k]]:[*1..n].reverse*""}

การใช้

เมื่อคุณแสดงวิธีแก้ปัญหาใด ๆ คุณควรใช้ "Kernel # puts"

ตัวอย่าง:

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