Urutan digit menurun

16

pengantar

Sebagai contoh, mari kita ambil nomornya 7. Kami kemudian menduplikasi ini dan menempatkan 7 ruang di antaranya. Kami mendapatkan ini:

7_______7

Setelah itu, kita akan mengurangi jumlahnya, sampai tidak ada ruang tersisa. Kami mendapatkan yang berikut untuk nomor 7:

7_______7    
 6543210

Kemudian, kita hanya menggabungkan keduanya, jadi:

7_______7    
 6543210  becomes

765432107

Ini akan keluar output untuk N = 7 .

Terlihat mudah, bukan? Sekarang mari kita ambil N = 12 . Kami kembali menyisipkan 12 spasi di antara dua angka, yang memberi kami:

12____________12

Lalu kita mulai pengurangan:

12____________12
  111098765432

Dan ini akhirnya memberi kita:

1211109876543212

Seperti yang Anda lihat, bagian menurun berakhir pada 2, bukan pada 0 .

Tugas

Diberikan bilangan bulat, lebih besar dari 1 , menampilkan urutan menurun seperti yang ditunjukkan di atas.

Uji kasus

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

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Adnan
sumber
Ruang dalam harus diisi dengan bilangan bulat atau kita harus memotong bilangan jika diperlukan? Tidak ada uji kasus tentang itu (misalnya 99)
edc65
@ edc65 Anda harus memotong nomor jika perlu. Saya telah menambahkan 99 sebagai test case.
Adnan

Jawaban:

8

CJam, 11 10 byte

q4*~,W%s<\

Cobalah online. Mengasumsikan ada baris baru di input. (Terima kasih kepada @ jimmy23013 karena menyimpan byte.)

Penjelasan

Pada akhir setiap baris adalah seperti apa tumpukan itu pada saat itu (menggunakan 4sebagai contoh).

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]
NinjaBearMonkey
sumber
9

Julia, 30 byte

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

Ini adalah fungsi anonim yang menerima integer dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Kami membangun dan bergabung dengan urutan menurun dari n -1 ke 0, dan mengambil karakter n pertama dari string yang dihasilkan. Kami menambahkan dan menambahkan ini dengan input sebagai string.

Verifikasi semua kasus uji online

Alex A.
sumber
5

Haskell, 44 byte

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

Contoh penggunaan: f 14-> "141312111098765414".

nimi
sumber
5

JavaScript (ES6), 55 52 byte

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

Sunting: Disimpan 3 byte berkat @WashingtonGuedes.

Neil
sumber
@WashingtonGuedes Bah, sepertinya saya tidak pernah bisa digunakan .keys().
Neil
.keys()seperti .reduce. Alat yang tepat untuk pekerjaan itu, tetapi Anda selalu menemukan sesuatu yang dapat melakukan lebih baik dalam kasus khusus itu
edc65
4

Python 2, 82 72 58 53 byte

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

Coba di sini!

Terima kasih kepada @Alex untuk mengajari saya bahwa repr(x)= `x`menyelamatkan saya banyak byte!

Denker
sumber
3

Pyth, 11 byte

++Q<jk_UQQQ

Dua versi alternatif, yang semuanya juga 11 byte ( menghela napas ):

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

Coba di sini.

Gagang pintu
sumber
3

Japt, 13 byte

U+Uo w ¬¯U +U

Uji secara online!

Bagaimana itu bekerja

               // 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.
Produksi ETH
sumber
3

Jelly, 10 byte

Ȯ’r0DFḣ³Ḍ³

Cobalah online!

Bagaimana itu bekerja

Ȯ’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.
Dennis
sumber
2

Vitsy, 35 byte

Karena Vitsy tidak mengetahui cara membuat string dari angka, saya menerapkan menemukan panjang angka di tempat desimal di baris kedua.

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

Penjelasan:

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.

Cobalah secara Online!

Mode Verbose untuk 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;
Addison Crump
sumber
Sepertinya mode verbose salah dalam definisinya L, memperbaikinya sekarang (tidak akan memperbarui pertanyaannya).
Addison Crump
Hanya ingin tahu, bagaimana Anda mencegah metode ini tidak dieksekusi di akhir program? Apakah karakter baris baru sinyal untuk kembali / keluar dari program?
LegionMammal978
@ LegionMammal978 Bayangkan bahwa baris pertama dari setiap program Vitsy adalah metode "utama", dan semua baris lainnya adalah public static voidmetode. Utama mengakhiri program ketika selesai. Adapun cara melakukannya, instruksi disimpan dalam tipe ArrayList<ArrayList<String[]>>, di mana setiap baris adalah a String[]. Setiap metode dibagi di baris baru dengan cara file dimuat, menyebabkan metode utama dipisahkan dari semua metode lainnya.
Addison Crump
Itu menjelaskan mengapa tiga level diperlukan. Jadi Strings adalah instruksi, String[]s adalah metode (yang pertama adalah metode utama), dan ArrayList<String[]>s adalah kelas (yang pertama adalah kelas utama), benar?
LegionMammal978
@ LegionMammal978 Itu semua benar. :)
Addison Crump
2

Pure Bash, 49

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

Atau:

Bash + coreutils, 48

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1
digital Trauma
sumber
Saya tidak yakin ini mengevaluasi kisaran dengan benar. Setelah menguji keduanya cetak hanya setengah dari kisaran. yaitu untuk $ 1 = 90, kisarannya hanya turun ke 45. Upaya saya adalah "untuk saya dalam $ (eval echo {$ 1..0}); lakukan echo -n $ i; selesai; echo $ 1"
rcjohnson
@ Arcson John Saya pikir itu adalah perilaku yang diperlukan. Apa yang Anda harapkan untuk N = 90?
Trauma Digital
@rcjohnson misalnya untuk N = 12, output seharusnya 12, maka 12 karakter pertama 11..0(atau 111098765432), dan akhirnya12
Digital Trauma
Nah setelah membaca ulang deskripsi saya melihat bahwa Anda benar. Masalahnya menyatakan "spasi" bukan bilangan bulat.
rcjohnson
@ rcjohnson Ya, saya pikir bagian "spasi" hanya berlaku untuk langkah perantara. Hasil akhir harus berupa serangkaian angka.
Trauma Digital
2

Retina, 63 byte

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

Masih ada beberapa ruang untuk bermain golf ...

Cobalah online!

randomra
sumber
Hm, saya sedang mempertimbangkan untuk membuat $0 in $0$*juga, ketika token sebelumnya adalah literal yang bukan angka (seperti Anda y) ... melihat ini saya mungkin benar-benar mengimplementasikannya.
Martin Ender
@ MartinBüttner Saya pikir itu adalah fitur baru tetapi ternyata tidak terlalu. :)
randomra
Tidak, saat ini yang hanya berfungsi di awal penggantian. Yang mengatakan, mungkin Anda dapat mengganti peran nomor pertama dan terakhir untuk memanfaatkannya?
Martin Ender
2

MATL , 15 byte

VG:qPVXvG:)GVhh

EDIT (20 Mei 2016) Kode dalam tautan menggunakan Xzalih-alih Xv, karena perubahan terbaru dalam bahasa.

Cobalah online!

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    
Luis Mendo
sumber
1

Java, 93 byte

String x(int v){String o=""+v;for(int i=v-1,c=o.length();o.length()-c<v;i--)o+=i;return o+v;}
Addison Crump
sumber
1

Ruby, 41 byte

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

Bima Sakti 1.6.5 , 27 25 byte

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

Penjelasan

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

Pemakaian

$ ./mw <path-to-code> -i <input-integer>
Zach Gates
sumber
Pengkodean apa yang digunakan Bima Sakti?
Adnan
Uhhh .. UTF-8, saya pikir haha. @AndN
Zach Gates
Saya mendapatkan kesalahan ini (ya, saya Windows scumbag: p) ketika mencoba menjalankan ini. Saya menempelkan ini: I'::%{K£BCH=}<OHG<+<;+!ke dalam file yang disandikan UTF-8, tetapi tidak berhasil.
Adnan
Berikut tautan ke file yang saya gunakan. @AndN
Zach Gates
1

Perl 6 , 31 byte

{$_~([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
  ~
  $_
}

Pemakaian:

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

Perl, 43 + 2 = 45 byte

Saya senang saya tidak menggunakan reversedan juga tidak substr:

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

Membutuhkan -plbendera.

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

Bagaimana itu bekerja:

                                            # '-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
andlrc
sumber
1

C, 130 125 byte

#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)}

Versi tidak dikoleksi (dengan penjelasan):

#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

Secara implisit dilemparkan dari ganda ke int h=floor(...)memungkinkan penggunaan #define p(x)penghematan 5 byte.

Uji ideone.

dihapus
sumber
1

R, 67 byte (sebagai fungsi)

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

R, 63 byte (input dari STDIN)

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

Brainfuck, 265 Bytes

Ini hanya akan bekerja dengan angka <10

Coba versi golf di sini :

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

Tidak disatukan. Coba di sini :

>
,
---------- 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
++++++++++
++++++++++
++++++++++
++++++++
.
Keatinge
sumber
,>>++++++[<++++++++>-]<[-<->]< Ini dapat mengurangi 48 dengan panjang kode lebih pendek
Leaky Nun
Ini jauh lebih pendek .
Leaky Nun