Đếm ngược chiều


17

Viết hàm f (n, k) hiển thị đếm ngược k chiều từ n.

Đếm ngược 1 chiều từ 5 hình như

 54321

Đếm ngược 2 chiều từ 5 hình như

 54321
 4321
 321
 21
 1

Cuối cùng, đếm ngược 3 chiều từ 5 hình như

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

Định nghĩa chính thức

Đếm ngược 1 chiều từ bất kỳ n là một dòng có các chữ số n, n-1, ..., 1 được nối (theo sau là một dòng mới).

Đối với bất kỳ k, đếm ngược k chiều từ 1 là dòng đơn

 1

Đối với n> 1 và k> 1, đếm ngược k chiều từ n là đếm ngược chiều (k-1) từ n theo sau là đếm ngược k chiều từ n-1.

Đầu vào

Hai số nguyên dương k và n <= 9, ở bất kỳ định dạng nào bạn chọn.

Đầu ra

Đếm ngược k chiều từ n, với một dòng mới sau mỗi lần đếm ngược 1 chiều. Thêm dòng mới được cho phép trong đầu ra.

Chấm điểm

Điểm golf chuẩn.

Ví dụ tiền thưởng

Đây là một ví dụ với k> n, đếm ngược 4 chiều từ 3 (có thêm nhận xét không được đưa vào giải pháp thực tế):

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

Làm rõ:

Các chữ số trên một dòng không cần phải liền kề, nhưng chúng phải cách đều nhau.

Bạn có thể viết một chương trình đầy đủ thay vì chỉ là một chức năng, nếu bạn thích.


Tôi không chắc chắn tôi hiểu chính xác các trường hợp thử nghiệm. Là đếm ngược 3D và 4D từ 2 giống hệt nhau?
Dennis

1
@Dennis Tôi nghĩ ý định là đếm ngược 4D từ 2 = đếm ngược 3D từ đếm ngược 2 + 4D từ 1
Sp3000

Không nên nói đếm ngược 3d từ một?
Lemon phá hủy

Thêm dòng mới được cho phép trong đầu ra. Điều đó có đề cập đến các dòng mới hay chúng có thể xảy ra ở bất cứ đâu?
Dennis

@Dennis Thêm dòng mới có thể xảy ra bất cứ nơi nào. Chà, 543 \ n21 không ổn, nhưng sau bất kỳ '1' nào cũng không sao.
Eric Tressler

Câu trả lời:


15

Python, 60 byte

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

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

Việc đếm ngược chiều k từ n có thể được xác định với một trường hợp cơ sở duy nhất:

Nếu n = 1 hoặc k = 1 , đầu ra là n | | n-1 | | ... || 1 || ¶ , ở đâu | | chỉ ra sự kết hợp.

Sử dụng định nghĩa đệ quy từ câu hỏi, f(n,k)trả về f(n,k-1)+f(n-1,k)nếu n> 1k> 1 ; nếu không, nó trả về n + 1 ký tự cuối cùng từ '987654321\n'.


Dennis là quá tốt. Làm thế nào bạn làm điều đó mặc dù?
clismique

Cái nhìn sâu sắc duy nhất của tôi ở đây là bạn có thể kết hợp cả hai trường hợp cơ bản. Phần còn lại chỉ là bản dịch trực tiếp của định nghĩa đệ quy.
Dennis

8

Thạch , 8 byte

R¡UḌFṚp⁷

Đây là một chương trình đầy đủ mong đợi nk là đối số dòng lệnh.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Không Ylàm việc thay p⁷thế?
dặm

Sắp xếp Đối với 5, 1, nó hiển thị [54321].
Dennis

5

Javascript, 40 38 37 byte

Đã lưu 1 byte nhờ @ edc65:

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

Câu trả lời trước

38 byte nhờ @Neil:

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

40 byte:

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

1
Lưu một byte bằng cách sử dụng ||thay vì ?n:. Lưu một byte khác bằng cách sử dụng một dòng mới bằng chữ bên trong `s thay vì '\n'.
Neil

Điều tốt nhất tôi có thể làm mà không cần thêm các dòng mới là 43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Neil

@Neil Tôi đang sử dụng notepad ++ để đếm byte và dòng chữ mới được tính là 2 char.
Hedi

Có lẽ bạn có thể thử nó trong trình duyệt Scratchpad của bạn?
Neil

1
Khéo léo, +1. Nhưng sử dụng *thay thế &&.
edc65

3

Python, 76 75 byte

-1 byte nhờ @ Sp3000

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

Sâu răng hiện các thủ tục như mô tả trong OP: gia nhập giảm nkết quả cho k-1trên dòng mới với một cơ sở của đệ quy của 'n...1'chuỗi khi k1( kkhông lớn hơn 1kể từ khi chúng được đảm bảo tích cực kđầu vào).

Các trường hợp thử nghiệm trên ideone


3

Con trăn, 86 81 80 byte

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

dlà số lượng kích thước, nlà số đếm ngược.

Sẽ đăng một lời giải thích sớm.

EDIT # 1: Thay đổi nó thành lambda.

EDIT # 2: Đã lưu 1 byte nhờ @DeststallibleWateriwi.


3

Haskell, 57 byte

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

Ví dụ sử dụng: 5 # 3 ->"\n54321\n4321\n321\n21\n1\n4321\n321\n21\n1\n321\n21\n1\n21\n1\n1" .

Một thực hiện trực tiếp của định nghĩa.


2

Vợt 215 byte

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

Kiểm tra:

(f 54321 3)

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

Umm ... Trên chế độ 3D, tại sao 54321xuất hiện hai lần?
Erik the Outgolfer

Tôi đang cố gắng sắp xếp các vấn đề.
rnso

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Vấn đề đã được khắc phục.
rnso

Thật tuyệt, và tôi cũng thấy bạn đã loại bỏ rất nhiều khoảng trắng!
Erik the Outgolfer

Trong vợt, sử dụng lambda ( λ) luôn ít byte hơn so với sử dụng define. Ngoài ra, đầu vào nđược chỉ định là một số mà bạn xây dựng (range 1 n). Xem thêm về việc thay thế của bạn condbằng một if, vì bạn lưu byte trên else.
Steven H.

2

J, 38 37 32 byte

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

Đây là hàm lấy k trên LHS và n trên RHS.

Đã lưu 5 byte với ý tưởng từ @ Adám.

Sử dụng

   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

Giải trình

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

Bạn sẽ có thể sử dụng phương pháp của tôi .
Adám

@ Adam Cảm ơn, tôi sẽ cố gắng nó ra
dặm

2

APL Dyalog , 18 byte

Nhắc cho n , sau đó cho k .

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

~∘'0'⍤1loại bỏ ( ~) số không ()'0' ) khỏi các hàng (⍤1 ) (đệm với khoảng trắng khi cần) của

đại diện cho nhân vật của

(⌽⍳)⍤0⍣⎕đếm ngược ( ) cho đến khi ( ) mỗi đầu vào vô hướng ( ⍤0), lặp lại ( ) ( )

trên

đầu vào số

Dùng thử trực tuyến!


2

C 93 byte

Lặp đi lặp lại thực hiện.

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 byte

Thực hiện đệ quy

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

Bạn không thể khai báo chuỗi mà không sử dụng char *, vì vậy triển khai đệ quy của bạn không biên dịch. Nhưng giải pháp rất dễ dàng và tiết kiệm 4 byte: chỉ cần thay thế mbên trong puts()cuộc gọi bằng "987654321".
G. Sliepen

Tôi đã biên dịch bằng gcc (GCC) 3.4.4 (cygming đặc biệt, gdc 0.12, sử dụng dmd 0.125). Tôi nghĩ rằng nó ổn vì tôi chỉ chuyển đổi từ char * sang int, tuy nhiên, vì giải pháp của bạn nhỏ hơn 4 byte nên tôi thích nó hơn. Cảm ơn
cleblanc

1

Mẻ, 117 byte

@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

Câu trả lời Python của cảng Dennis ♦.


1

Ruby, 56 byte

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

Sử dụng

Khi bạn hiển thị bất kỳ giải pháp nào, bạn nên sử dụng "Kernel # put".

Thí dụ:

puts f[9,3]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.