แทรกตัวเลขจาก 1 ถึง n โดยมีหมายเลขเดียวกันกลับด้าน


34

ง่าย ๆ :

ใช้เป็นจำนวนเต็มบวกnน้อยกว่า 1,000 และเอาท์พุทจำนวนเต็มจาก1ไปnบรรณนิทัศน์กับจำนวนเต็มจากnไป1 คุณต้องต่อหมายเลขเพื่อให้ปรากฏโดยไม่มีตัวคั่นระหว่างใด ๆ

กรณีทดสอบ:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

นี่คือเพื่อการส่งที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาจะชนะ คำอธิบายได้รับการสนับสนุน

คำตอบ:


16

JavaScript (ES6), 30 ไบต์

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

อย่างไร?

มันค่อนข้างตรงไปตรงมา แต่มันก็คุ้มค่าที่จะสังเกตว่าเชือกนั้นสร้างจากหางจรดหัว สตริงว่างที่จุดเริ่มต้นจะต่อท้ายล่าสุดและอนุญาตให้มีการข่มขู่ผลลัพธ์สุดท้ายให้กับสตริง

ด้านล่างนี้เป็นรายละเอียดของการสอบถามซ้ำสำหรับ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

กรณีทดสอบ


10

Python 2 , 46 ไบต์

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

ขอบคุณ ovs สำหรับ 4 ไบต์

ลองออนไลน์!

คำอธิบาย:

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
เพิ่มเติมสองไบต์ใน Python 3:f'{x}{n-~-x}'
L3viathan

2
@ L3viathan นั่นเป็นคุณสมบัติใหม่ที่เพิ่มเข้ามาใน 3.6
Mego

1
Python 3.6 ไม่ใช่ Python 3 ใช่ไหม
L3viathan

6
lambda n:''.join('x+1'+'n-x'for x in range(n))46 ไบต์ (แทนที่. 'ในความเข้าใจของรายการที่มี backticks)
OVS

6
@ovs เฮ้คุณสามารถหลบหนี backtick -> `\`x+1\``วาทกรรมไป`x+1`
Rod


7

Bashขนาด 25 ไบต์

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

ลองออนไลน์!

พิมพ์ลำดับการลดจำนวนบรรทัดที่เพิ่มขึ้นและ printf รวมบรรทัด

คั่นด้วยช่องว่าง, 20 ไบต์: seq $ 1 -1 1 | nl | xargs


หากไม่เป็นที่ยอมรับฉันสามารถเปลี่ยนได้seq $1 -1 1|nl|tr -d ' \n\t'มากกว่า 8 ไบต์
marcosm

1
การส่งแบบ 20 ไบต์ไม่ถูกต้อง upvote ของฉันคือการส่ง 25 ไบต์
Digital Trauma

ตามที่ระบุไว้ใน Digital Trauma การแก้ปัญหา 20 ไบต์ไม่ถูกต้อง
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 ไบต์

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

ลองออนไลน์

rbind(1:n,n:1)สร้างเมทริกซ์ 2 แถวที่มี 1 ถึง n ในแถวแรกและ n เป็น 1 ในวินาที catฟังก์ชั่นทรุดเมทริกซ์นี้อ่านลงแต่ละคอลัมน์


1
โปรดทราบว่าสิ่งนี้ใช้ได้ในโหมดโต้ตอบเท่านั้นและกำหนดให้ผู้ใช้ป้อนnในบรรทัดคำสั่ง (แทนที่จะส่งผ่าน stdin)
shadowtalker

@ssdecontrol ใช่ฉันคิดว่าปกติแล้วจะได้รับอนุญาต แต่ฉันค่อนข้างใหม่ที่นี่อาจจะผิด
user2390246

ฉันคิดว่ามันเป็นที่ยอมรับโดยทั่วไป แต่ NB เพื่อให้ทำงานได้อย่างถูกต้องใน TIO คุณต้องใส่อินพุตในฟิลด์ Footer (และมันก็ดีเสมอที่จะรวมลิงค์!) tio.run/nexus/…
Giuseppe

6

05AB1E , 6 5 ไบต์

บันทึกเป็นไบต์โดยใช้ interleave ในตัวใหม่ตามที่แนะนำโดยrev

LÂ.ιJ

ลองออนไลน์!

คำอธิบาย

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

ผู้ใช้โดยใช้ชื่อของรอบLÂ.ιJปัญหา
Jonathan Frech

@ JonathanFrech: ฉันรู้ว่าฉันทามติในตอนนี้คือเราสามารถใช้คุณสมบัติใหม่กว่าความท้าทาย แต่โดยปกติฉันลังเลที่จะแก้ไขคำตอบเก่า มีคำตอบมากมายในทุกสิ่งที่สามารถปรับปรุงได้ด้วยวิธีนี้ :)
Emigna

ฉันเป็นแค่ผู้ส่งสารเท่านั้น เป็นไปได้ @rev ควรโพสต์คำตอบของตนเอง
Jonathan Frech

@ JonathanFrech: ฉันไม่ได้หมายความว่ามันเป็นคำติชม Rev ทำอย่างถูกต้องเมื่อเขาแนะนำให้แก้ไขเนื่องจากเป็นการดีกว่าที่จะแก้ไขคำตอบที่มีอยู่กว่าโพสต์ใหม่ทุกครั้งที่มีการสร้างขึ้นใหม่ ฉันควรแก้ไขคำตอบเก่า ๆ ให้ดีกว่าเดิมอย่างน้อยก็ควรทำตามคำแนะนำ
Emigna

4

CJam , 10 ไบต์

ri,:)_W%]z

ลองออนไลน์!

คำอธิบาย

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

ช่องว่าง , 71 ไบต์

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


ลองออนไลน์!

คำอธิบาย

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'

จำเป็นต้องมีคำแนะนำสองสามข้อแรกในการตั้งค่าสแต็กอย่างถูกต้องคำสั่งอินพุตของ Whitespace เขียนไปยังฮีปดังนั้นเราจึงจำเป็นต้องคัดลอก b (ค่าอินพุต) กลับไปที่สแต็ก เราเริ่มต้นด้วย = 0 เนื่องจากมันสั้นกว่าที่จะประกาศ 0 แทน 1 (บันทึกเป็นไบต์) และเราจำเป็นต้องเรียงลำดับคำสั่งเพิ่มเพื่อจัดการ หลังจากนั้นเราก็วนลูปและเพิ่ม a เอาท์พุท a, เอาท์พุท b, การลดค่า b จนกระทั่ง b ถึง 0 (ตรวจสอบหลังจากการลดลง)


นี่อาจเป็นเรื่องที่ยากขึ้นหากคุณลบช่องว่างที่ตามมาทั้งหมดออก: P
cat

4

Haskell, 65 48 47 ไบต์

บันทึก 1 ไบต์ขอบคุณ Laikoni:

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

บันทึก 6 ไบต์ด้วย nimi:

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

คำตอบและคำอธิบายก่อนหน้า:

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

มีคำตอบที่ดีกว่าของ Haskell อยู่แล้ว แต่ฉันใหม่สำหรับ Haskell และ code golfing ดังนั้นฉันอาจโพสต์ได้เช่นกัน :)

ฟังก์ชั่นนี้บีบรายการ [1..n] ด้วยการย้อนกลับทำให้มีรายการของสิ่งอันดับ

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

จากนั้นจะใช้concatMapในการแมปแลมบ์ดากับรายการสิ่งอันดับที่ส่งผลให้รายการ ...

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

... และเชื่อมโยงมันเข้าด้วยกัน

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

จากนั้นจะconcatMapแมปสุดท้ายshowไปยังรายการและเชื่อมต่อเป็นสตริงเดียว

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"


2
ฟังก์ชั่นมัด=<<เป็นเหมือนกัน (ภายใน monad รายการ) เป็น:concatMap f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]
nimi

1
1) โซลูชันปัจจุบันของคุณมีเพียง 48 ไบต์ 2) คุณสามารถดรอปnอิน[1..n]: ลองออนไลน์!
Laikoni

1) ข้อผิดพลาดที่เกิดจากข้อผิดพลาด ... 2) โทรดี!
Dan Ambrogio

3

Pyth, 7 ไบต์

jksC_BS

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

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 ไบต์

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

ทดสอบมัน

ด้วยอินพุต100000ใช้เวลาประมาณ 10 วินาทีรวมถึงการคอมไพล์และการพิมพ์เอาต์พุต

ขยาย:

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

Z~ต้องการ~เพราะมิฉะนั้นมันจะสร้างรายการของรายการซึ่งจะ stringify มีช่องว่าง

ไม่จำเป็นต้อง จำกัด ช่วงที่เริ่มต้นที่ 1 เพราะZจะหยุดเมื่อรายการอินพุตใด ๆ หมด
วิธีนี้ช่วยประหยัดสองไบต์ (ต้องการพื้นที่หลังจากนั้น$_)


3

Java 61 ไบต์

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

2
นอกจากนี้ยินดีต้อนรับสู่ PPCG! :)
Stewie Griffin

เราอนุญาตฟังก์ชันที่ไม่ระบุชื่อดังนั้น(int n)->{//for loop}ควรทำงานที่นี่
Nathan Merrill

มันดีกว่าไหม
cheemcheem

2
อ้อ! คุณสามารถใส่System.out.print()คำสั่งสุดท้ายของลูปของคุณลงไปได้ แต่มันจะซับซ้อนเพราะคุณใช้iสองครั้ง (และคุณต้องเพิ่มมันในนิพจน์)
Nathan Merrill

ฉันใส่การพิมพ์ไว้ในลูปและเพิ่มค่า i ในตำแหน่งสุดท้ายที่เป็นไปได้จากนั้นตรวจสอบกับกรณีทดสอบเพื่อให้แน่ใจว่าทำงานได้ดีขอบคุณ @NathanMerrill
cheemcheem

3

เยลลี่ 5 ไบต์

RṚĖVV

ลองออนไลน์!

มันทำงานอย่างไร

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 ไบต์

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

ลองออนไลน์!

นี่เป็นฟังก์ชั่นนิรนามที่รับอินพุตจากสตรีม

คำอธิบาย

{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 ไบต์

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

แท้จริงสิ่งที่ถาม ฉันเชื่อว่ามันสามารถเอาชนะได้ด้วยวิธีแก้ปัญหาที่ไม่สำคัญ

ดูออนไลน์


2

Aceto , 25 22 ไบต์

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

คำอธิบาย:

เราอ่านจำนวนเต็มและวางมันลงบนสองกอง

id
r}

ที่หนึ่งเราเรียก range_up ( Z) ในอีก range_down ( z) จากนั้นเราตั้งค่า catch catch เพื่อให้สามารถกลับมาที่นี่ได้ในภายหลัง:

  @z
  Z)

จากนั้นเราตรวจสอบว่าสแต็กปัจจุบันว่างเปล่าและออกหากใช่:

 X`=
  l0

มิฉะนั้นเราจะพิมพ์จากทั้งสองสแต็คและข้ามกลับไปที่ catch catch:

)&
p
(p

2

R, 41 ไบต์

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

pryr::f()สร้างฟังก์ชั่นที่รับหนึ่งอินพุต ลูปมากกว่า1:xและพิมพ์องค์ประกอบของแต่ละพร้อมกับองค์ประกอบของแต่ละ1:x x:1พิมพ์ไปยัง STDOUT


+1, ใช้งานได้ดีpryr
shadowtalker

@ssdecontrol เป็นวัตถุดิบหลักในการเปลี่ยนfunction(x):)
JAD


2

MATL, 13 11 9 ไบต์

บันทึก 2 ไบต์ด้วย @Luis

:tPv1eVXz

ลองใช้ที่MATL Online

คำอธิบาย

        % 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 Ah! ฉันคิดว่ามีฟังก์ชั่นที่ลบช่องว่างออก แต่ไม่พบ ขอบคุณ!
Suever

2

PHP, 36 35 29 ไบต์

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

บันทึกหนึ่งไบต์ขอบคุณJörgHülsermann
บันทึกหกไบต์ขอบคุณ Christoph


3
อืม ... for(;$argn;)echo++$i,$argn--;?
Christoph


2

V , 20 ไบต์

ywo1@"­ñykPjñkògJ

ลองออนไลน์!

อธิบาย:

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

Cubix , 17 ไบต์

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

ลองออนไลน์!

cubified:

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

Pushes 1อ่านในการป้อนข้อมูล ( I) จากนั้นจะเข้าสู่วงซึ่ง swaps ด้านบนของสแต็ค, เอาท์พุทมันเพิ่มขึ้น, การแลกเปลี่ยนผลผลิตด้านบนของกองการลดลงและหยุดถ้าด้านบนของสแต็คเป็น 0



2

MathGolf 5 ไบต์

{îkï-

ลองออนไลน์!

คำอธิบาย:

{      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
ฉันได้รับสามารถที่จะหาโปรแกรม 13 ของความยาว 5 ซึ่งเกิดผลเหมือนกัน: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, ,{î┐í, {î┐k,อย่างไรก็ตามฉันไม่สามารถค้นหาโปรแกรมใด ๆ ที่มีความยาว 4 หรือน้อยกว่าได้ ฉันยังไม่ได้ทำการค้นหาแบบเต็ม แต่เป็นไปได้มากว่า 5 ไบต์เหมาะสำหรับ MathGolf
maxb


2

Mouse-2002 , 32 30 ไบต์

-2 ย้ายเงื่อนไขไปยังจุดเริ่มต้นของลูป(z.^ ... )แทน(... z.0>^)

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

ลองออนไลน์!

คำอธิบาย:

?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

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