Các số xen kẽ từ 1 đến n, với các số tương tự được đảo ngược


34

Một đơn giản:

Lấy số nguyên dương n nhỏ hơn 1000 và xuất ra các số nguyên từ 1 đến n xen kẽ với các số nguyên từ n đến 1 . Bạn phải nối các số sao cho chúng xuất hiện mà không có bất kỳ dấu phân cách nào giữa chúng.

Các trường hợp thử nghiệm:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Đây là vì vậy bài nộp ngắn nhất theo byte trong mỗi ngôn ngữ sẽ thắng. Giải thích được khuyến khích.

Câu trả lời:


16

JavaScript (ES6), 30 byte

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

Làm sao?

Điều này khá đơn giản nhưng đáng chú ý là chuỗi được xây dựng từ đuôi đến đầu. Một chuỗi trống ở đầu được nối thêm lần cuối và cho phép ép buộc kết quả cuối cùng thành chuỗi.

Dưới đây là chi tiết của đệ quy cho 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

Các trường hợp thử nghiệm


10

Python 2 , 46 byte

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

Cảm ơn ovs cho 4 byte

Hãy thử trực tuyến!

Giải trình:

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)

1
Hai byte nữa trong Python 3:f'{x}{n-~-x}'
L3viathan

2
@ L3viathan Đó là một tính năng mới được thêm vào 3.6.
Mego

1
Python 3.6 không phải là Python 3?
L3viathan

6
lambda n:''.join('x+1'+'n-x'for x in range(n))cho 46 byte. (thay thế phần hiểu 'trong danh sách bằng backticks)
ovs

6
@ovs này, bạn có thể thoát khỏi backtick -> `\`x+1\``ám chỉ`x+1`
Rod


7

Bash , 25 byte

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

Hãy thử trực tuyến!

In chuỗi giảm, số dòng tăng và printf nối các dòng

Giới hạn không gian, 20 byte: seq $ 1 -1 1 | nl | xargs


nếu điều đó không được chấp nhận, tôi có thể thay đổi thêm seq $1 -1 1|nl|tr -d ' \n\t'8 byte nữa
marcosm

1
Việc gửi 20 byte không hợp lệ. Upvote của tôi là để gửi 25 byte.
Chấn thương kỹ thuật số

Như Digital Trauma đã lưu ý, giải pháp 20 byte không hợp lệ.
Erik người vượt trội

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="")

Dùng thử trực tuyến

rbind(1:n,n:1)tạo ma trận 2 hàng với 1 đến n ở hàng đầu tiên và n đến 1 trong hàng thứ hai. Các catchức năng sụp đổ ma trận này, đọc xuống mỗi cột.


1
Lưu ý rằng điều này chỉ hoạt động trong chế độ tương tác và yêu cầu người dùng nhập nvào dòng lệnh (thay vì chuyển qua stdin).
Shadowtalker

@ssdecontrol Vâng, tôi nghĩ điều đó thường được cho phép, nhưng tôi khá mới ở đây, có thể sai.
dùng2390246

Tôi nghĩ nói chung là chấp nhận được, nhưng NB, để chạy nó đúng cách trong TIO, bạn phải đặt (các) đầu vào trong trường Footer (và luôn luôn tốt khi bao gồm một liên kết!) Tio.run/nexus/iêu
Giuseppe

6

05AB1E , 6 5 byte

Đã lưu một byte bằng cách sử dụng xen kẽ mới được tích hợp theo đề xuất của rev

LÂ.ιJ

Hãy thử trực tuyến!

Giải trình

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join

Một người dùng theo tên của rev đề nghị LÂ.ιJ.
Jonathan Frech

@JonathanFrech: Tôi biết rằng sự đồng thuận bây giờ là chúng ta có thể sử dụng các tính năng mới hơn thử thách, nhưng tôi thường do dự trong việc chỉnh sửa các câu trả lời cũ vì tích hợp mới hoàn thành thử thách tốt hơn. Có rất nhiều câu trả lời có thể được cải thiện theo cách đó :)
Emigna

Chà, tôi chỉ là người đưa tin; có thể @rev nên đăng câu trả lời của riêng họ.
Jonathan Frech

@JonathanFrech: Tôi không có ý đó là một lời trách móc. Rev đã làm điều đó một cách chính xác khi anh đề nghị chỉnh sửa vì tốt hơn là chỉnh sửa một câu trả lời hiện có hơn là đăng một câu trả lời mới bất cứ khi nào một tích hợp mới được thực hiện. Tôi thực sự nên làm tốt hơn trong việc sửa các câu trả lời cũ, ít nhất là khi các đề xuất được đưa ra.
Emigna

4

CJam , 10 byte

ri,:)_W%]z

Hãy thử trực tuyến!

Giải trình

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).


4

Khoảng trắng , 71 byte

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Hãy thử trực tuyến!

Giải trình

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'

Cần có một vài hướng dẫn đầu tiên để thiết lập ngăn xếp một cách chính xác, các lệnh đầu vào của Whitespace ghi vào heap để chúng ta cần sao chép b (giá trị đầu vào) trở lại ngăn xếp. Chúng tôi bắt đầu với a = 0 vì nó ngắn hơn để khai báo 0 thay vì 1 (lưu một byte) và chúng tôi chỉ cần sắp xếp lại thứ tự tăng dần để đối phó. Sau đó, chúng ta chỉ lặp và tăng a, đầu ra a, đầu ra b, giảm b, cho đến khi b đạt 0 (được kiểm tra sau khi giảm).


điều này có thể được chơi nhiều hơn nếu bạn loại bỏ tất cả khoảng trắng đó: P
mèo

4

Haskell, 65 48 47 byte

Lưu 1 byte nhờ Laikoni:

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

6 byte được lưu nhờ nimi:

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

Câu trả lời và giải thích trước:

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

Đã có câu trả lời Haskell tốt hơn ở đây, nhưng tôi chưa quen với cả Haskell và chơi golf mã, vì vậy tôi cũng có thể đăng nó :)

Hàm này nén danh sách [1..n] với đảo ngược của nó, dẫn đến một danh sách các bộ dữ liệu.

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

Sau đó, nó sử dụng concatMapđể ánh xạ lambda vào danh sách các bộ dữ liệu này dẫn đến một danh sách các danh sách ...

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

... và nối nó lại.

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

Sau đó, một concatMapbản đồ cuối cùng showvào danh sách và ghép nó thành một chuỗi duy nhất.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"


2
Hàm infix =<<giống nhau (trong danh sách đơn nguyên) là concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi

1
1) Giải pháp hiện tại của bạn chỉ có 48 byte. 2) Bạn có thể thả nvào [1..n]: Hãy thử trực tuyến!
Laikoni

1) Lỗi do lỗi một ... 2) Cuộc gọi tốt!
Dan Ambrogio

3

Bình thường, 7 byte

jksC_BS

Dùng thử trực tuyến: Trình diễn

Giải trình:

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


3

Perl 6 , 20 byte

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

Kiểm tra nó

Với đầu vào là 100000, việc này mất khoảng 10 giây, bao gồm biên dịch và in đầu ra.

Mở rộng:

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

Các Z~ nhu cầu ~vì nếu không nó sẽ tạo ra một danh sách liệt kê mà sẽ stringify với không gian.

Không cần giới hạn Phạm vi bắt đầu từ 1, vì Zdừng khi bất kỳ danh sách đầu vào nào hết.
Điều này tiết kiệm hai byte (sẽ cần một không gian sau $_)


3

Java 61 byte

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}

2
Ngoài ra, chào mừng bạn đến với PPCG! :)
Stewie Griffin

Chúng tôi cho phép các chức năng ẩn danh, vì vậy (int n)->{//for loop}nên làm việc ở đây.
Nathan Merrill

Điều đó có tốt hơn không?
cheemcheem

2
Vâng! Bạn có khả năng có thể đặt System.out.print()câu lệnh cuối cùng của vòng lặp for, nhưng nó trở nên phức tạp vì bạn đang sử dụng ihai lần (và bạn cần tăng nó trong biểu thức).
Nathan Merrill

Tôi đặt bản in bên trong vòng lặp và tăng i ở vị trí cuối cùng có thể sau đó kiểm tra nó với các trường hợp Kiểm tra để đảm bảo nó hoạt động, cảm ơn @NathanMerrill
cheemcheem

3

Thạch , 5 byte

RṚĖVV

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

3

Röda , 21 19 byte

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

Hãy thử trực tuyến!

Đây là một chức năng ẩn danh nhận đầu vào từ luồng.

Giải trình

{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

2

Clojure, 61 byte

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

Nghĩa đen làm những gì được yêu cầu. Tôi tin rằng nó có thể bị vượt qua bởi một giải pháp ít tầm thường hơn.

Xem nó trực tuyến


2

Aceto , 25 22 byte

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

Giải trình:

Chúng tôi đọc một số nguyên và đặt nó trên hai ngăn xếp.

id
r}

Trên một, chúng tôi gọi phạm vi_up ( Z), trên phạm vi khác_down ( z), sau đó chúng tôi đặt dấu bắt để có thể quay lại vị trí này sau:

  @z
  Z)

Sau đó chúng tôi kiểm tra xem ngăn xếp hiện tại có trống không và thoát nếu vậy:

 X`=
  l0

Mặt khác, chúng tôi in từ cả hai ngăn xếp và nhảy trở lại dấu bắt:

)&
p
(p

2

R, 41 byte

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

pryr::f()tạo một hàm lấy một đầu vào. Vòng lặp 1:xvà in từng phần tử 1:xcùng với mỗi phần tử của x:1. In sang STDOUT.


+1, sử dụng tốtpryr
Shadowtalker

@ssdecontrol thay thế chủ yếu của nó khá nhiều function(x):)
JAD


2

TOÁN, 13 11 9 byte

Lưu 2 byte nhờ @Luis

:tPv1eVXz

Dùng thử tại MATL Online

Giải trình

        % 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

@LuisMendo À! Tôi nghĩ rằng có một chức năng loại bỏ khoảng trắng nhưng không thể tìm thấy nó. Cảm ơn!
Suever

2

PHP, 36 35 29 byte

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

Đã lưu một byte nhờ vào Jörg Hülsermann.
Lưu sáu byte nhờ Christoph.


3
Ừm ... for(;$argn;)echo++$i,$argn--;?
Christoph

2

Scala, 43 byte

Nó không phải là tốt nhất nhưng đó là golf mã đầu tiên của tôi.

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

2

V , 20 byte

ywo1@"­ñykPjñkògJ

Hãy thử trực tuyến!

Giải thích:

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

2

Khối , 17 byte

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

Hãy thử trực tuyến!

lập phương

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

Đẩy 1, đọc trong đầu vào ( I), sau đó vào vòng lặp hoán đổi đỉnh của ngăn xếp, xuất nó, tăng, hoán đổi, xuất ra đỉnh của ngăn xếp, giảm và dừng nếu đỉnh của ngăn xếp là 0.



2

MathGolf , 5 byte

{îkï-

Hãy thử trực tuyến!

Giải trình:

{      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

1
Tôi đã có thể tìm thấy 13 chương trình có độ dài 5 mà mang lại kết quả tương tự: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. Tuy nhiên, tôi chưa thể tìm thấy bất kỳ chương trình nào có độ dài từ 4 trở xuống. Tôi chưa thực hiện tìm kiếm đầy đủ, nhưng rất có thể 5 byte là tối ưu cho MathGolf.
maxb


2

Chuột-2002 , 32 30 byte

-2 di chuyển có điều kiện để bắt đầu vòng lặp (z.^ ... )thay vì(... z.0>^)

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

Hãy thử trực tuyến!

Giải trình:

?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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.