数字顺序降序


16

介绍

例如,让我们以数字为准7。然后,我们将其复制并在它们之间放置7个空格。我们得到这个:

7_______7

之后,我们将减少数量,直到没有剩余空间为止。对于数字7,我们得到以下内容:

7_______7    
 6543210

然后,我们将它们两个合并,所以:

7_______7    
 6543210  becomes

765432107

N = 7时将输出。

看起来很简单,对吧?现在让我们取N = 12。我们再次在两个数字之间插入12个空格,从而得到:

12____________12

然后我们开始递减:

12____________12
  111098765432

最终,这给了我们:

1211109876543212

如您所见,下降部分以2结尾,而不是 0结束

任务

给定一个大于1的整数,输出降序序列,如上所示。

测试用例

Input   Output

2       2102
3       32103
4       432104
5       5432105
6       65432106
7       765432107
8       8765432108
9       98765432109
10      10987654321010
11      111098765432111
12      1211109876543212
13      13121110987654313
14      141312111098765414
15      1514131211109876515
20      201918171615141312111020
99      9998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150499
100     1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

这是,因此字节数最少的提交将获胜!


内部空间必须充满整数,或者如果需要,我们应该将数字切碎吗?没有关于此的测试案例(例如99)
edc65 '16

@ edc65如果需要,应将数字切碎。我添加了99个测试用例。
阿德南

Answers:


8

CJam,11个10字节

q4*~,W%s<\

在线尝试。假设输入中有尾随换行符。(感谢@ jimmy23013保存了一个字节。)

说明

每行的末尾是该堆栈的外观(4以示例为例)。

q4*  e# Push input x 4 times, separated by newlines. ["4\n4\n4\n4\n"]
~    e# Evaluate, separating the 4's and converting them to numbers. [4 4 4 4]
,W%  e# Take the range of x and reverse it. [4 4 4 [3 2 1 0]]
s<   e# Cast to string and take the first x characters. [4 4 "3210"]
\    e# Swap the top two to get the final result. [4 "3210" 4]

9

朱莉娅,30个字节

n->"$n"join(n-1:-1:0)[1:n]"$n"

这是一个接受整数并返回字符串的匿名函数。要调用它,请将其分配给变量。

我们构造并连接从n -1到0 的降序序列,并从结果字符串中获取前n个字符。我们在此之前加上输入作为字符串。

在线验证所有测试用例


5

Haskell,44个字节

s=show
f n=s n++take n(s=<<[n-1,n-2..])++s n

用法示例:f 14-> "141312111098765414"


5

JavaScript(ES6),55 52字节

n=>n+[...Array(m=n)].map(_=>--m).join``.slice(0,n)+n

编辑:感谢@WashingtonGuedes,节省了3个字节。


@WashingtonGuedes Bah,我似乎从未使用过.keys()
尼尔

.keys()就像.reduce。这项工作的正确工具,但是您始终会发现在特定情况下可以做得更好的东西
edc65 '16

4

Python 2,82 72 58 53字节

lambda x:`x`+''.join(map(str,range(x)[::-1]))[:x]+`x`

在这里尝试!

感谢@Alex教给我repr(x)= `x`节省了我很多字节!


3

Pyth,11个字节

++Q<jk_UQQQ

两个替代版本也都是11个字节(sigh):

s[Q<jk_UQQQ
pQp<jk_UQQQ
  Q           the input
       UQ     [0, 1, ..., input-2, input-1]
      _       reverse
    jk        join on empty string
   <     Q    first (input) characters
          Q   the input again
++            concatenate everything so it prints on one line

在这里尝试。


3

Japt,13个字节

U+Uo w ¬¯U +U

在线测试!

怎么运行的

               // Implicit: U = input integer
  Uo           // Create the range [0..U).
     w         // Reverse.
       ¬       // Join.
        ¯U     // Slice to the first U chars.
U+         +U  // Append U on either end.

3

果冻,10个字节

Ȯ’r0DFḣ³Ḍ³

在线尝试!

怎么运行的

Ȯ’r0DFḣ³Ḍ³  Main link. Input: n

Ȯ           Print n.
 ’          Decrement to yield n - 1.
  r0        Create a range from n - 1 to 0.
    D       Convert each integer to base 10 (array of decimal digits).
     F      Flatten the resulting array.
      ḣ³    Keep the first n elements.
        Ḍ   Convert from base 10 to integer.
         ³  Print the integer and set the return value to n.
            (implicit) Print the return value.


2

Vitsy,35个字节

由于Vitsy不知道如何使用数字来制作字符串,因此我实现了在第二行中以小数位查找数字的长度。

V0VVNHVv[XDN1mv$-DvD);]VN
1a/+aL_1+

说明:

V0VVNHVv[XDN1mv$-DvD);]VN
V                          Save the input as a global final variable.
 0V                        Push 0, push input.
   VN                      Output the input.
     H                     Push the range 0...intput.
      Vv                   Push the input, then save it as a temp variable.
        [             ]    Do the stuff in brackets infinitely or until exited.
         X                 Remove the top item of the stack.
          DN               Duplicate, then pop as output.
            1m             Calls the first line index, retrieving length.
              v            Pop the temp var and push it to the stack.
               $           Switch the top two items of the stack. 
                -          Subtract them.
                 Dv        Duplicate, then pop one as a temp var.
                   D);     If it's zero, exit the loop.
                       VN  Output the global var.

1a/+aL_1+
1a/+       Add .1. This makes sure we don't throw errors on input 0.
    a      Push ten.
     L     Pop the top item as n, push the log base n of second to top.
      _    Make it an int.
       1+  Add 1.

在线尝试!

详细说明模式:

save top as permanent variable;
push 0;
save top as permanent variable;
save top as permanent variable;
output top as number;
push all ints between second to top and top;
save top as permanent variable;
save top as temporary variable;
begin recursive area;
remove top;
duplicate top item;
output top as number;
push 1;
goto top method;
save top as temporary variable;
switch the top two items;
subtract top two;
duplicate top item;
save top as temporary variable;
duplicate top item;
if (int) top is not 0;
generic exit;
end recursive area;
save top as permanent variable;
output top as number;
:push 1;
push 10;
divide top two;
add top two;
push 10;
push ln(top);
replace top with int(top);
push 1;
add top two;

似乎详细模式在的定义中是错误的L,现在已解决(尽管不会更新问题)。
Addison Crump

很好奇,如何防止在程序结束时执行该方法?换行符是返回/退出程序的信号吗?
LegionMammal978 '16

@ LegionMammal978想象每个Vitsy程序的第一行是“ main”方法,所有其他行都是public static void方法。当程序完成时,主程序结束程序。至于如何做到这一点,指令以类型保存ArrayList<ArrayList<String[]>>,其中每行是一个String[]。每个方法都会在换行符处按文件的加载方式进行拆分,从而使main方法与所有其他方法分开。
Addison Crump

这就解释了为什么需要三个级别。所以Strings是指令,String[]s是方法(第一个是main方法),ArrayList<String[]>s是类(第一个是main类),对吗?
LegionMammal978 '16

@ LegionMammal978都正确。:)
Addison Crump

2

Pure Bash,49岁

eval printf -va %s {$[$1-1]..0}
echo $1${a::$1}$1

要么:

Bash + coreutils,48岁

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1

我不确定这些是否在正确评估范围。经测试,两者仅打印范围的一半。例如,对于$ 1 = 90,范围仅降低到45。我的努力是“对于$(eval echo {$ 1..0})中的i;执行echo -n $ i; done; echo $ 1”
rcjohnson

@rcjohnson我认为这是必需的行为。您期望N = 90的输出是什么?
Digital Trauma

@rcjohnson例如,对于N = 12,输出应为12,然后是11..0(或111098765432)的前12个字符,最后是12
Digital Trauma

重新阅读说明后,我发现您是正确的。问题指出“空格”而不是整数。
rcjohnson '16

@rcjohnson是的,我认为“空格”部分仅适用于中间步骤。最终输出应该只是一串数字。
Digital Trauma

2

视网膜,63字节

.+
$0,y$0$*y$0$*x
x
$'_
(x)*_
$#1
+`(y+)y(.)
$2$1
,(\d+).*
$1$`

仍然有一些打高尔夫球的空间。

在线尝试!


嗯,当前面的标记不是一个数字(如您的s)时,我$0也在考虑将in $0$*设为可选y
Martin Ender

@MartinBüttner我认为这是新功能,但事实并非如此。:)
randomra '16

否,目前仅在替换开始时有效。也就是说,也许您可​​以切换第一个和最后一个数字的角色来利用它?
Martin Ender

2

MATL,15字节

VG:qPVXvG:)GVhh

编辑(2016年5月20日)由于语言的最新更改,链接中的代码使用Xz代替Xv

在线尝试!

V                 % input n. Convert to string
 G:               % range [1,2,...,n]
   qP             % convert into [n-1,n-2,...,0]
     VXv          % convert to string, no spaces
        G:)       % take first n characters only
           GV     % push input as a string, again
             hh   % concat horizontally twice    


1

Ruby,41个字节

->n{[n]*2*(r=0...n).to_a.reverse.join[r]}

1

银河系1.6.527个 25字节

I'::%{K£BCH=}<ΩHG<+<;+!

说明

I                        ` empty the stack
 '::                     ` push 3 copies of the input
    %{K£BCH=}            ` dump digits of reversed range(n) as strings [n-1...0]
             <ΩHG<+<;+   ` select the first nth digits and pad them with n
                      !  ` output

用法

$ ./mw <path-to-code> -i <input-integer>

银河系使用什么编码?
阿德南

嗯.. UTF-8,我想哈哈。@AandN
扎克·盖茨

尝试运行此错误时出现此错误(是的,我是Windows scumbag:p)。我将其粘贴I'::%{K£BCH=}<OHG<+<;+!到了UTF-8编码的文件中,但是它不起作用。
阿德南

这是我正在使用的文件的链接。@AandN
扎克·盖茨

1

Perl 6,31个字节

{$_~([R~] ^$_).substr(0,$_)~$_}
{
  $_ # input
  ~  # string concatenated with
  ([R~] ^$_)    # all numbers up to and excluding the input concatenated in reverse
  .substr(0,$_) # but use only up to the input number of characters
  ~
  $_
}

用法:

for 2,3,7,12,100 {
  say {$_~([R~] ^$_).substr(0,$_)~$_}( $_ )
}
2102
32103
765432107
1211109876543212
1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

1

Perl,43 + 2 = 45字节

我很高兴自己没有用过reverse,也没有substr

"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_

需要-pl标志。

$ perl -ple'"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_' <<< 12
1211109876543212

怎么运行的:

                                            # '-p' read first line into `$_` and
                                            # auto print at the end
"@{[1-$_..0]}"                              # Create a list from -1-n..0 and
                                            # join it on space. This becomes:
                                            #   "-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0"
              =~s.\D..gr                    # Remove all but digits:
                                            #   "11109876543210"
                        =~/.{$_}/;          # Match the n first characters from
                                            # the generated string
                                  $_.=$&.$_ # Append the match and the input

1

C,130个是125字节

#define p(x) printf("%i",x);
i,y,h;f(x){for(i=y=x;(i-=h)>=0;){p(y--)h=floor(log10(y))+1;}if(i+=h)p(h=floor(y/pow(10,i)))p(x)}

非高尔夫版本(带说明):

#define p(x) printf("%i",x);     // alias to print an integer
i,y,h;                           // helper variables
f(x){                            // function takes an integer x as arg
    for(i=y=x;(i-=h)>=0;){       // i -> the remaining space
                                 // y -> the current descending number
        p(y--)                   // print y (at first y==x)
        h=floor(log10(y))+1;     // h -> the number of digits in y-1
    }                            // do it until there is no more empty space
    if(i+=h)                     // if needs to chop the last number
        p(h=floor(y/pow(10,i)))  // chop and print (implicitly cast of double to int)
    p(x)                         // print x at the end
}                                // end function

从double隐式转换为int h=floor(...)允许#define p(x)节省5个字节。

测试ideone。


1

R,67个字节(作为函数)

# usage example : f(7)
f=function(i)cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

R,63个字节(从STDIN输入)

i=scan();cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

1

Brainfuck,265字节

这仅适用于数字<10

这里尝试高尔夫版本:

>,------------------------------------------------[->+>+<<]>>[-<<+>>]<[[->+>+<<]>>[-<<+>>]<-]<[<]>[>[>]>+<<[<]>-]>[++++++++++++++++++++++++++++++++++++++++++++++++.>]++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.

松了口气。在这里尝试:

>
,
---------- Convert to base 10
----------
----------
----------
-------- 


[->+>+<<]>>[-<<+>>]<

Fill up the grid
[
[->+>+<<]>>[-<<+>>] //duplicate number like [5][0] -> [5][5]
<-
]

<[<]> Go to cell 1
[

>[>] Scan for zero
> Move one more
+ Add one
<< Move two back
[<] Scan for zero
> Move one forward
- Subtract One
]

> Move one forward into actual numbers
[
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
]
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.

,>>++++++[<++++++++>-]<[-<->]<这可以减48具有较短码长度
漏嫩


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.