Nomor interleave dari 1 ke n, dengan angka yang sama terbalik

34

Yang sederhana:

Ambil bilangan bulat positif n kurang dari 1000, dan hasilkan bilangan bulat dari 1 ke n yang disatukan dengan bilangan bulat dari n ke 1 . Anda harus menyatukan angka-angka sehingga mereka muncul tanpa pembatas di antara mereka.

Kasus uji:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Ini adalah sehingga pengajuan terpendek dalam byte di setiap bahasa menang. Penjelasan didorong.

Stewie Griffin
sumber

Jawaban:

16

JavaScript (ES6), 30 byte

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

Bagaimana?

Ini cukup mudah tetapi perlu dicatat bahwa tali dibuat dari ekor ke kepala. String kosong di awal ditambahkan terakhir dan memungkinkan paksaan hasil akhir untuk string terjadi.

Di bawah ini adalah detail rekursi untuk f(4):

f(4) =                                            // initial call
f(4, 1) =                                         // applying the default value to k
f(3, 2) + 4 + 1 =                                 // recursive call #1
(f(2, 3) + 3 + 2) + 4 + 1 =                       // recursive call #2
((f(1, 4) + 2 + 3) + 3 + 2) + 4 + 1 =             // recursive call #3
(((f(0, 5) + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =   // recursive call #4
((('' + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =        // n = 0 --> end of recursion
'' + 1 + 4 + 2 + 3 + 3 + 2 + 4 + 1 =              // final sum
'14233241'                                        // final result

Uji kasus

Arnauld
sumber
10

Python 2 , 46 byte

lambda n:''.join(`x+1`+`n-x`for x in range(n))

Berkat ovs untuk 4 byte

Cobalah online!

Penjelasan:

lambda n:''.join(`x+1`+`n-x`for x in range(n))
lambda n:                                      # anonymous lambda taking one parameter n
                 `x+1`+`n-x`                   # `x` is repr(x) which is equivalent to str(x) for integers less than INT_MAX
                            for x in range(n)  # integers x in [0, n)
Mego
sumber
1
Dua byte lebih banyak di Python 3:f'{x}{n-~-x}'
L3viathan
2
@ L3viathan Itu fitur baru yang ditambahkan di 3.6.
Mego
1
Python 3.6 bukan Python 3?
L3viathan
6
lambda n:''.join('x+1'+'n-x'for x in range(n))untuk 46 byte (ganti 'dalam daftar pemahaman dengan backticks)
Ovs
6
@ovs hei, Anda dapat menghindari backtick -> `\`x+1\``renders to`x+1`
Rod
8

-5 Terima kasih kepada Ørjan Johansen

Haskell , 33 byte

f n=do a<-[1..n];[a,n-a+1]>>=show

Cobalah online!

bartavelle
sumber
3
(1) doEkspresi lebih pendek dari >>=plus lambda. (2) Namun, shows dapat dikombinasikan dengan menggunakan >>=show.
Ørjan Johansen
7

Bash , 25 byte

printf %s`seq $1 -1 1|nl`

Cobalah online!

Mencetak urutan yang menurun, jumlah baris meningkat dan printf bergabung dengan baris

Batas ruang, 20 byte: seq $ 1 -1 1 | nl | xargs

marcosm
sumber
jika itu tidak dapat diterima saya dapat mengubahnya selama seq $1 -1 1|nl|tr -d ' \n\t'8 byte lebih
marcosm
1
Pengiriman 20 byte tidak valid. Upvote saya adalah untuk pengiriman 25 byte.
Digital Trauma
Sebagaimana dicatat Digital Trauma, solusi 20-byte tidak valid.
Erik the Outgolfer
time printf %s'seq 1000000 -1 1|nl'; grep name /proc/cpuinfo real 0m7.985s user 0m6.092s sys 0m0.392s model name : Intel(R) Pentium(R) D CPU 3.00GHz model name : Intel(R) Pentium(R) D CPU 3.00GHz
marcosm
7

R, 35 byte

n=scan();cat(rbind(1:n,n:1),sep="")

Cobalah online

rbind(1:n,n:1)menciptakan matriks 2 baris dengan 1 ke n di baris pertama dan n ke 1 di baris kedua. The catfungsi runtuh matriks ini, membaca bawah setiap kolom.

pengguna2390246
sumber
1
Perhatikan bahwa ini hanya bekerja dalam mode interaktif, dan mengharuskan pengguna untuk masuk npada baris perintah (alih-alih lewat stdin).
shadowtalker
@ssdecontrol Ya, saya pikir itu biasanya diperbolehkan, tapi saya cukup baru di sini, bisa saja salah.
user2390246
Saya pikir secara umum dapat diterima, tetapi NB, untuk menjalankannya dengan benar di TIO Anda harus memasukkan input di bidang Footer (dan selalu baik untuk menyertakan tautan!) Tio.run/nexus/…
Giuseppe
6

05AB1E , 6 5 byte

Menyimpan byte menggunakan interleave built-in baru seperti yang disarankan oleh rev

LÂ.ιJ

Cobalah online!

Penjelasan

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join
Emigna
sumber
Seorang pengguna dengan nama rev disarankan LÂ.ιJ.
Jonathan Frech
@ JonathanFrech: Saya tahu konsensus sekarang adalah bahwa kita dapat menggunakan fitur yang lebih baru daripada tantangan, tapi saya biasanya ragu untuk mengedit jawaban lama karena built-in baru menyelesaikan tantangan dengan lebih baik. Ada begitu banyak jawaban dalam semua hal yang dapat diperbaiki seperti itu :)
Emigna
Yah, saya hanya utusan; mungkin @rev harus memposting jawaban mereka sendiri.
Jonathan Frech
@ JonathanFrech: Saya tidak bermaksud itu sebagai celaan. Rev melakukannya dengan benar ketika ia menyarankan edit karena lebih baik untuk mengedit jawaban yang ada daripada memposting jawaban baru setiap kali built-in baru dibuat. Saya benar-benar harus menjadi lebih baik dalam memperbaiki jawaban lama, paling tidak ketika ada saran.
Emigna
4

CJam , 10 byte

ri,:)_W%]z

Cobalah online!

Penjelasan

ri   e# Read input and convert to integer N.
,    e# Turn into range [0 1 ... N-1].
:)   e# Increment to get [1 2 ... N].
_W%  e# Duplicate and reverse the copy.
]    e# Wrap both in an array to get [[1 2 ... N] [N ... 2 1]]
z    e# Transpose to get [[1 N] [2 N-1] ... [N-1 2] [N 1]]
     e# This list is printed implicitly at the end of the program,
     e# but without any of the array structure (so it's essentially flattened,
     e# each number is converted to a string and then all the strings
     e# are joined together and printed).
Martin Ender
sumber
4

Ruby , 29 byte

->n{n.times{|x|$><<x+1<<n-x}}

Penjelasan:

->n{n.times{|x|                # x in range [0..n-1]
               $><<            # output on console
                   x+1<<n-x}}  # x+1, then n-x

Cobalah online!

GB
sumber
4

Spasi , 71 byte

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Cobalah online!

Penjelasan

sssn  ; push 0 - seed the stack with 0 (this will be our 1->n counter, a)
sns   ; dup
tntt  ; getnum - read n (stored on the heap)
sns   ; dup
ttt   ; retr - pull n onto the stack (this will be our n->1 counter, b)
nssn  ; label 'loop'
snt   ; swap - bring a to the top
ssstn ; push 1
tsss  ; add - increment a
sns   ; dup
tnst  ; putnum - output a as a number
snt   ; swap - bring b to the top
sns   ; dup
tnst  ; putnum - output b as a number
ssstn ; push 1
tsst  ; sub - decrement b
sns   ; dup
ntstn ; jez 'exit' if b is 0
nsnn  ; jmp 'loop'

Beberapa instruksi pertama diperlukan untuk mengatur stack dengan benar, perintah input Whitespace menulis ke heap sehingga kita perlu menyalin b (nilai input) kembali ke stack. Kita mulai dengan a = 0 karena lebih pendek untuk mendeklarasikan 0 daripada 1 (menyimpan satu byte) dan kita hanya perlu menyusun ulang instruksi kenaikan untuk mengatasinya. Setelah itu kita hanya mengulang dan menambah a, output a, output b, penurunan b, hingga b mencapai 0 (diperiksa setelah penurunan).

Ephphatha
sumber
ini bisa menjadi jauh lebih golf jika Anda menghapus semua spasi putih: P
cat
4

Haskell, 65 48 47 byte

1 byte disimpan berkat Laikoni:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..][n,n-1..1]

6 byte disimpan berkat nimi:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]

Jawaban dan penjelasan sebelumnya:

f n=concatMap show$concatMap(\(l,r)->[l,r])(zip[1..n][n,n-1..1])

Sudah ada jawaban Haskell yang lebih baik di sini, tapi saya baru mengenal Haskell dan kode golf, jadi saya sebaiknya mempostingnya :)

Fungsi ini membuat zip daftar [1..n] dengan kebalikannya, menghasilkan daftar tupel.

[(1,n),(2,n-1),(3,n-2)..(n,1)]

Kemudian digunakan concatMapuntuk memetakan lambda ke daftar tupel yang menghasilkan daftar daftar ...

[[1,n],[2,n-1],[3,n-2]..[n,1]]

... dan menyatukannya.

[1,n,2,n-1,3,n-2..n,1]

Kemudian concatMappeta terakhir showke daftar dan menyatukannya menjadi satu string.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"

Dan Ambrogio
sumber
2
Fungsi infiks =<<adalah sama (dalam daftar monad) sebagai concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi
1
1) Solusi Anda saat ini hanya 48 byte. 2) Anda bisa drop ndi [1..n]: Cobalah secara online!
Laikoni
1) Kesalahan lepas satu per satu ... 2) Panggilan bagus!
Dan Ambrogio
3

Pyth, 7 byte

jksC_BS

Cobalah online: Demonstrasi

Penjelasan:

jksC_BSQ   implicit Q (=input number) at the end
      SQ   create the range [1, ..., Q]
    _B     bifurcate by inversion, this gives [[1, ..., Q], [Q, ..., 1]]
  sC       zip and flatten result
jk         join to a string
Jakube
sumber
3

Oktaf, 29 byte

@(n)printf("%d",[1:n;n:-1:1])

Cobalah online!

rahnema1
sumber
1
Implementasi saya sangat, sangat lama! Bagus! =)
Stewie Griffin
3

Perl 6 , 20 byte

{[~] 1..*Z~($_...1)}

Menguji

Dengan input 100000 ini membutuhkan waktu sekitar 10 detik, termasuk kompilasi dan pencetakan output.

Diperluas:

{                # bare block lambda with implicit parameter 「$_」

  [~]            # reduce using concatenation operator 「&infix:«~»」
                 # (shorter than 「join '',」)

    1 .. *       # Range from 1 to infinity

    Z~           # zip using concatenation operator

    ( $_ ... 1 ) # deduced sequence starting at the input
                 # going down to 1
}

The Z~membutuhkan ~karena jika itu menghasilkan daftar daftar yang akan stringify dengan spasi.

Tidak perlu membatasi Rentang mulai dari 1, karena Zberhenti ketika salah satu daftar input habis.
Ini menghemat dua byte (ruang akan dibutuhkan setelah $_)

Brad Gilbert b2gills
sumber
3

Java 61 byte

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}
cheemcheem
sumber
2
Juga, selamat datang di PPCG! :)
Stewie Griffin
Kami mengizinkan fungsi anonim, jadi (int n)->{//for loop}sebaiknya bekerja di sini.
Nathan Merrill
Apakah itu lebih baik?
cheemcheem
2
Ya! Anda dapat berpotensi menempatkan Anda System.out.print()dalam pernyataan terakhir dari for loop, tetapi itu menjadi rumit karena Anda menggunakan idua kali (dan Anda perlu menambahkannya dalam ekspresi).
Nathan Merrill
Saya meletakkan cetakan di dalam lingkaran dan menambah saya di tempat terakhir yang memungkinkan kemudian memeriksanya dengan Kasing uji untuk memastikannya berhasil, terima kasih @NathanMerrill
cheemcheem
3

Jelly , 5 byte

RṚĖVV

Cobalah online!

Bagaimana itu bekerja

RṚĖVV  Main link. Argument: n

R      Range; yield [1, ..., n].
 Ṛ     Reverse; yield [n, ..., 1].
  Ė    Enumerate; yield [[1, n], ..., [n, 1]].
   V   Eval; convert each flat array to a string, interpret it as a Jelly program,
       and yield the output. This concatenates the integers in each pair, yielding
       a flat array of integers
    V  Repeat the previous step, concatenating the intgegers from before.
Dennis
sumber
3

Röda , 21 19 byte

{seq 1,_<>seq _1,1}

Cobalah online!

Ini adalah fungsi anonim yang mengambil input dari aliran.

Penjelasan

{seq 1,_<>seq _1,1}               Anonymous function, takes integer n from the stream
        <>                        Interleave
 seq 1,_                            the range 1 .. n with
          seq _1,1                  the range n .. 1
Kritixi Lithos
sumber
2

Clojure, 61 byte

#(let[a(range 1(+ 1 %))](apply str(interleave a(reverse a))))

Secara harfiah melakukan apa yang diminta. Saya percaya itu bisa dikalahkan oleh solusi yang kurang sepele.

Lihat online

cliffroot
sumber
2

Aceto , 25 22 byte

)&
pX`=
(pl0
id@z
r}Z)

Penjelasan:

Kami membaca bilangan bulat dan meletakkannya di dua tumpukan.

id
r}

Di satu, kami memanggil range_up ( Z), di lain range_down ( z), kemudian kami menetapkan tanda tangkap untuk dapat kembali ke tempat ini nanti:

  @z
  Z)

Kami kemudian memeriksa apakah tumpukan saat ini kosong dan keluar jika demikian:

 X`=
  l0

Jika tidak, kami mencetak dari kedua tumpukan dan melompat kembali ke tanda tangkapan:

)&
p
(p
L3viathan
sumber
2

R, 41 byte

pryr::f(for(i in 1:x){cat(i);cat(x-i+1)})

pryr::f()menciptakan fungsi yang mengambil satu input. Loop 1:xdan cetak setiap elemen 1:xbersama dengan setiap elemen x:1. Mencetak ke STDOUT.

JAD
sumber
+1, penggunaan baguspryr
shadowtalker
@ssdecontrol penggantian pokoknya yang cukup banyak function(x):)
JAD
2

Brachylog , 10 9 byte

⟦₁g↔ᶻczcc

Cobalah online!

Penjelasan

⟦₁           [1, …, Input]
  g↔ᶻc       [[1, …, Input],[Input, …, 1]]
      z      Zip
       cc    Concatenate twice
Fatalisasi
sumber
2

MATL, 13 11 9 byte

2 byte disimpan berkat @Luis

:tPv1eVXz

Cobalah di MATL Online

Penjelasan

        % Implicitly grab input as a number, N
:       % Create an array from 1..N
tP      % Create a reversed copy
v       % Vertically concatenate the two
1e      % Reshape it into a row vector
V       % Convert to a string
Xz      % Remove whitespace and implicitly display
Suever
sumber
@LuisMendo Ah! Saya pikir ada fungsi yang menghapus spasi tetapi tidak bisa menemukannya. Terima kasih!
Suever
2

PHP, 36 35 29 byte

for(;$argn;)echo++$i,$argn--;

Disimpan satu byte berkat Jörg Hülsermann.
Disimpan enam byte berkat Christoph.

pengguna63956
sumber
3
Uhm ... for(;$argn;)echo++$i,$argn--;?
Christoph
2

Scala, 43 byte

Ini bukan yang terbaik tapi ini golf kode pertamaku.

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))
Phoenix
sumber
2

V , 20 byte

ywo1@"­ñykPjñkògJ

Cobalah online!

Menjelaskan:

yw                    ' Copy the input number (for looping later)
  o1                 ' Insert a 1 under the input (on a newline)
     @"               ' [Copy register] number of times
       ­ñ      ñ       ' Do the thing inside of this loop
        ykP           ' Copy the current line and line above it, and paste above both
           j        ' decrement the current (top) number, and increment the one below
               k      ' Go to the top line
                ògJ   ' recursively join all of the lines
nmjcman101
sumber
2

Cubix , 17 byte

....1I>sO)su.@?(O

Cobalah online!

kubus:

    . .
    . .
1 I > s O ) s u
. @ ? ( O . . .
    . .
    . .

Mendesak 1 , membaca di input ( I), kemudian memasuki loop yang menukar bagian atas tumpukan, mengeluarkannya, menambah, menukar, mengeluarkan bagian atas tumpukan, mengurangi, dan berhenti jika bagian atas tumpukan adalah 0.

Giuseppe
sumber
2

MathGolf , 5 byte

{îkï-

Cobalah online!

Penjelasan:

{      Run a for loop over implicit input
 î     Push 1 based index of loop
  k    Push inputted number
   ï-  Subtract 0 based index of loop
       Implicitly output all this joined together
Jo King
sumber
1
Saya sudah bisa menemukan 13 program panjang 5 yang menghasilkan hasil yang sama: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. Namun, saya belum dapat menemukan program dengan panjang 4 atau kurang. Saya belum melakukan pencarian lengkap, tetapi sangat mungkin bahwa 5 byte optimal untuk MathGolf.
Maks
2

Common Lisp, 63 54 byte

(lambda(n)(dotimes(i n)(format t"~a~a"(1+ i)(- n i))))

Cobalah online!

Renzo
sumber
2

Mouse-2002 , 32 30 byte

-2 pindah bersyarat untuk memulai loop (z.^ ... ) bukan(... z.0>^)

?n:n.z:(z.^a.1+a:a.!z.!z.1-z:)

Cobalah online!

Penjelasan:

?n:                                 ~ get input and store in n
   n.z:                             ~ copy n into z
       (z.^                         ~ stop if z equals 0
           a.1+a:                   ~ add 1 to a
                 a.!                ~ print a
                    z.!             ~ print z
                       z.1-z:)      ~ substract 1 from z
MooseOnTheRocks
sumber