ลำดับตัวเลขจากมากไปน้อย


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

@ edc65 คุณควรสับตัวเลขหากจำเป็น ฉันได้เพิ่ม 99 เป็นกรณีทดสอบ
Adnan

คำตอบ:


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

Julia 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

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @WashingtonGuedes


@WashingtonGuedes Bah .keys()ฉันไม่เคยดูเหมือนจะได้รับกับการใช้งาน
Neil

.keys().reduceเป็นเหมือน เครื่องมือที่เหมาะสมสำหรับงาน แต่คุณมักจะพบสิ่งที่สามารถทำได้ดีกว่าในกรณีนั้น
edc65


3

Pyth, 11 ไบต์

++Q<jk_UQQQ

สองรุ่นทางเลือกซึ่งทั้งหมดมี 11 ไบต์ ( ถอนหายใจ ):

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

เยลลี่ 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.

ลองออนไลน์!

โหมด verbose สำหรับ lols:

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;

ดูเหมือนว่าโหมด verbose ผิดในคำจำกัดความของการLแก้ไขที่ตอนนี้ (จะไม่ปรับปรุงคำถาม)
Addison Crump

แค่อยากรู้อยากเห็นคุณจะป้องกันวิธีการดำเนินการในตอนท้ายของโปรแกรมได้อย่างไร อักขระขึ้นบรรทัดใหม่เป็นสัญญาณที่ส่งคืน / ออกจากโปรแกรมหรือไม่
LegionMammal978

@ LegionMammal978 ลองจินตนาการว่าบรรทัดแรกของทุกโปรแกรม Vitsy เป็นวิธี "หลัก" และอีกบรรทัดหนึ่งเป็นpublic static voidวิธีการ หลักสิ้นสุดโปรแกรมเมื่อเสร็จสิ้น ในฐานะที่เป็นวิธีการที่จะทำอย่างนี้เป็นคำแนะนำที่จะมีขึ้นในชนิดที่แต่ละบรรทัดเป็นArrayList<ArrayList<String[]>> String[]ทุกวิธีถูกแบ่งที่บรรทัดใหม่โดยวิธีโหลดไฟล์ทำให้วิธีหลักถูกแยกออกจากวิธีอื่นทั้งหมด
Addison Crump

นั่นอธิบายว่าทำไมต้องมีสามระดับ ดังนั้นStrings คือคำสั่งString[]s คือวิธี (อันแรกคือเมธอดหลัก) และArrayList<String[]>s คือคลาส (อันแรกคือคลาสหลัก) ถูกต้องหรือไม่
LegionMammal978

@ 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 ความพยายามของฉันคือ "สำหรับ i ใน $ (eval echo {$ 1..0}); ทำ echo -n $ i; เสร็จแล้ว; echo $ 1"
rcjohnson

@rcjohnson ฉันคิดว่านั่นเป็นพฤติกรรมที่จำเป็น คุณคาดหวังสิ่งที่เอาท์พุทสำหรับ N = 90?
Digital Trauma

@rcjohnson เช่นสำหรับ N = 12 เอาต์พุตควรเป็น1212 ตัวแรกของ11..0(หรือ111098765432) แล้วในที่สุดก็12
Digital Trauma

ดีเมื่ออ่านคำอธิบายอีกครั้งฉันเห็นว่าคุณถูกต้อง ปัญหาระบุว่า "ช่องว่าง" ไม่ใช่จำนวนเต็ม
rcjohnson

@rcjohnson ใช่ฉันคิดว่าส่วน "ช่องว่าง" ใช้กับขั้นตอนกลางเท่านั้น ผลลัพธ์สุดท้ายควรเป็นเพียงตัวเลขหลัก
Digital Trauma

2

เรติน่า 63 ไบต์

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

ยังมีบางห้องสำหรับเล่นกอล์ฟอยู่ ...

ลองออนไลน์!


หืมมมฉันกำลังพิจารณาที่จะทำให้$0ใน$0$*ตัวเลือกเช่นกันเมื่อก่อนหน้านี้โทเค็นเป็นตัวอักษรซึ่งเป็นตัวเลขที่ไม่ (ตามที่คุณys มี) ... ที่เห็นนี้ผมอาจจะจริงใช้ว่า
Martin Ender

@ MartinBüttnerฉันคิดว่ามันเป็นคุณสมบัติใหม่ แต่กลับกลายเป็นว่าไม่ได้จริงๆ :)
randomra

ไม่ปัจจุบันนี้ใช้ได้เฉพาะตอนเริ่มต้นของการเปลี่ยนตัวเท่านั้น ที่กล่าวว่าบางทีคุณสามารถสลับบทบาทของหมายเลขแรกและหมายเลขสุดท้ายเพื่อใช้ประโยชน์จากสิ่งนั้นได้
Martin Ender

2

MATL , 15 ไบต์

VG:qPVXvG:)GVhh

แก้ไข (20 พฤษภาคม 2016) รหัสในลิงก์ใช้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

ทางช้างเผือก 1.6.5 , 27 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>

ทางช้างเผือกใช้การเข้ารหัสแบบใด
Adnan

Uhhh .. UTF-8 ฉันคิดว่าฮ่าฮ่า @AandN
Zach Gates

ฉันได้รับข้อผิดพลาดนี้ (ใช่ฉันเป็น Windows scumbag: p) ในขณะที่พยายามเรียกใช้ ฉันวางสิ่งนี้I'::%{K£BCH=}<OHG<+<;+!ลงในไฟล์ที่เข้ารหัส UTF-8 แต่มันไม่ทำงาน
Adnan

นี่คือลิงค์ไปยังไฟล์ที่ฉันใช้ @AandN
Zach Gates

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 เท่านั้น

ลองรุ่น golfed ที่นี่ :

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

Ungolfed ลองที่นี่ :

>
,
---------- 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 ด้วยความยาวโค้ดที่สั้นลง
Leaky Nun

วิธีนี้เป็นวิธีที่สั้นกว่า
Leun Nun

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