尺寸倒计时


17

编写一个函数f(n,k),显示从n开始的k维倒数。

从5开始的一维倒数看起来像

 54321

从5开始的二维倒数如下

 54321
 4321
 321
 21
 1

最后,从5开始的3维倒数如下

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

正式定义

从任何n开始的一维倒数是一行,数字n,n-1,...,1连接在一起(后跟换行符)。

对于任何k,从1开始的k维倒数是单行

 1

对于n> 1和k> 1,从n开始的k维倒数是从n开始的(k-1)维倒数,然后是从n-1开始的k维倒数。

输入项

您选择的任何格式的两个正整数k和n <= 9。

输出量

从n开始的k维倒数,每个1维倒数后都有换行符。输出中允许额外的换行符。

计分

标准高尔夫得分。

奖金示例

这是一个示例,其中k> n,是从3开始的4维倒数(带有多余的注释,这些注释不包含在实际解决方案中):

 -- 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是否相同?
丹尼斯

1
@Dennis我认为我的意图是从2开始的4D倒计时=从2的4D倒计时+从1的4D倒计时
Sp3000

它不应该说3D倒计时吗?
破坏的柠檬

输出中允许额外的换行符。是指尾随换行符还是它们可以出现在任何地方?
丹尼斯

@Dennis多余的换行符可以在任何地方出现。好吧,543 \ n21不好,但是只要加1,就可以了。
埃里克·特雷斯勒

Answers:


15

Python,60个字节

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

Ideone上进行测试

怎么运行的

n开始k维倒数可以用一个基本情况定义:

如果n = 1k = 1,则输出为n ||。n-1 || ... || 1 || ¶,其中|| 表示串联。

从这个问题利用递归定义,f(n,k)返回f(n,k-1)+f(n-1,k)如果N> 1K> 1 ; 否则,返回的最后n + 1个字符'987654321\n'


丹尼斯太好了。你是怎么做到的?
clismique '16

我唯一的见解是可以将两种基本情况结合起来。其余的只是递归定义的直接转换。
丹尼斯

8

果冻,8 字节

R¡UḌFṚp⁷

这是一个完整的程序,期望nk作为命令行参数。

在线尝试!

怎么运行的

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⁷吗?
2016年

有点。对于5, 1,它显示[54321]
丹尼斯

5

Javascript,40 38 37字节

@ edc65,节省了1个字节:

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

先前的答案

@Neil获得38个字节:

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:。通过在`s 内使用文字换行符(而不是)来保存另一个字节'\n'
尼尔

没有多余的换行符,我能做的最好的就是43:f=(n,k)=>n?(k?f(n,k-1):n)+f(n-1,k):k?``:`\n`
Neil

@Neil我正在使用notepad ++来计数字节,而文字换行符则为2个字符。
Hedi 2016年

也许您可以在浏览器暂存器中尝试呢?
尼尔

1
聪明,+ 1。但是使用*代替&&
edc65'9

3

Python,76 75字节

-1字节感谢@ Sp3000

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

按OP中的说明进行操作:在is 时,将换行符的递减n结果k-1'n...1'字符串的递归基数结合起来(不大于,因为我们保证可以保证正输入)。k1k1k

测试用例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:将其更改为lambda。

编辑#2:感谢@DestructibleWatermelon,节省了1个字节。


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

嗯...在3D模式下,为什么会54321出现两次?
暴民埃里克

我正在尝试解决问题。
rnso

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ问题已得到纠正。
rnso

太酷了,我还看到您删除了很多空格!
暴民埃里克

在Racket中,使用lambda(λ)总是少于使用define。另外,输入的n指定为要为其构建的数字(range 1 n)。另请参阅有关更换您的cond的信息if,因为您在上保存了字节else
史蒂文H.

2

J,38 37 32字节

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

该函数在LHS上取k,在RHS上取n

使用@Adám保存了5个字节的想法。

用法

   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

您应该能够使用我的方法
2013年

@Adám谢谢,我会尝试一下
英里

2

Dyalog APL,18 字节

提示输入n,然后输入k

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

~∘'0'⍤1从行中删除(~)()零('0')(⍤1)填充)(根据需要填充空格)

的字符表示

(⌽⍳)⍤0⍣⎕反转()计数直到()每个标量(⍤0),重复()输入()次

数字输入

在线尝试APL!


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

递归实施

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

您必须在不使用char *的情况下声明字符串,因此您的递归实现无法编译。但是该解决方案非常简单,并且节省了4个字节:只需mputs()调用内部替换即可"987654321"
G. Sliepen '16

我使用gcc(GCC)3.4.4(特殊cygming,gdc 0.12,使用dmd 0.125)进行了编译。我认为可以,因为我只是从char *转换为int,但是,由于您的解决方案小4个字节,所以我更喜欢它。谢谢
cleblanc 16/09/09

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

Dennis♦的Python答案端口。


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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.