จัดเรียงอาร์เรย์อัตโนมัติ


12

ทุกคนรักรายการซ้อนกัน! อย่างไรก็ตามบางครั้งมันก็ยากที่จะสร้างรายการซ้อนกัน คุณต้องตัดสินใจว่าคุณต้องการทำรังให้ลึกกว่านี้หรือถ้าคุณต้องการทำรังให้ตื้นขึ้น ดังนั้นสำหรับความท้าทายของคุณคุณต้อง "Autonest" รายการ หากต้องการรายการอัตโนมัติให้เปรียบเทียบรายการทุกคู่ในรายการ

  • หากรายการที่สองมีขนาดเล็กกว่าให้แยกองค์ประกอบทั้งสองโดยแทรกการปิดและเปิดวงเล็บระหว่างพวกเขาเช่นนี้

      } {
    {2 , 1}
    

    ตัวอย่างเช่น{2, 1}กลายเป็น{2}, {1}และ{3, 2, 1}กลายเป็น{3}, {2}, {1}

  • หากรายการที่สองเหมือนกันก็ไม่มีอะไรเปลี่ยนแปลง ยกตัวอย่างเช่น{1, 1, 1}ยังคงเหมือนเดิมและจะกลายเป็น{2, 1, 1, 1}{2}, {1, 1, 1}

  • หากรายการที่สองมีขนาดใหญ่กว่าให้ซ้อนทุกรายการดังต่อไปนี้หนึ่งระดับ ตัวอย่างเช่น{1, 2}จะกลายเป็น{1, {2}}และ{1, 2, 3}จะกลายเป็น{1, {2, {3}}}

ความท้าทาย

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในรายการตัวเลขและส่งกลับรายการเดียวกันหลังจากที่ถูก autonested ใช้อินพุตนี้ในรูปแบบรายการภาษาดั้งเดิมของคุณ (หรือตัวเลือกที่ใกล้เคียงที่สุด) หรือเป็นสตริง คุณไม่จำเป็นต้องใช้เครื่องมือจัดฟันแบบหยิกอย่างที่เคยทำในตัวอย่าง คุณสามารถใช้วงเล็บประเภทใดก็ได้ที่เป็นธรรมชาติที่สุดในภาษาของคุณตราบใดที่มันสอดคล้องกัน คุณสามารถสรุปได้อย่างปลอดภัยว่ารายการจะมีจำนวนเต็มเท่านั้น คุณสามารถสมมติว่ารายการจะมีตัวเลขอย่างน้อย 2 ตัว นี่คือตัวอย่าง IO:

{1, 3, 2}                         -->   {1, {3}, {2}}
{1, 2, 3, 4, 5, 6}                -->   {1, {2, {3, {4, {5, {6}}}}}}
{6, 5, 4, 3, 2, 1}                -->   {6}, {5}, {4}, {3}, {2}, {1}
{7, 3, 3, 2, 6, 4}                -->   {7}, {3, 3}, {2, {6}, {4}}
{7, 3, 1, -8, 4, 8, 2, -9, 2, 8}  -->   {7}, {3}, {1}, {-8, {4, {8}, {2}, {-9, {2, {8}}}}}

ช่องโหว่มาตรฐานนำไปใช้และคำตอบที่สั้นที่สุดในไบต์ชนะ!


2
เราสามารถรับอินพุตในรูปแบบสตริงของภาษาของเราได้หรือไม่
Downgoat

ขนาดสูงสุดของจำนวนเต็มคือเท่าใด?
thepiercingarrow

@thiertherarrow ฉันไม่สนใจมากเกินไป มันจะไม่เป็นอะไรที่ไร้สาระ คุณควรจะจัดการอย่างน้อย[-100, 100]แต่ฉันไม่ได้วางแผนที่จะให้อินพุตขนาดใหญ่
James

"ถ้ารายการที่สองมีขนาดเล็กลงให้วางองค์ประกอบต่อไปนี้ทั้งหมดให้สูงขึ้นหนึ่งระดับโดยการใส่วงเล็บปิดจากนั้นเพื่อให้แน่ใจว่าวงเล็บทั้งหมดยังคงอยู่ให้ตรงกันให้ใส่วงเล็บเปิดตัวอย่างเช่น{2, 1}กลายเป็น{2}, {1}" วิธีที่หนึ่งระดับ ? {2}, 1หนึ่งในระดับที่สูงขึ้นจะเป็น สิ่งที่คุณมีอยู่ในระดับเดียวกัน
msh210

@ msh210 ใช่นั่นเป็นคำอธิบายที่ไม่ดี ประโยคปัจจุบันดีกว่าไหม?
James

คำตอบ:


1

MATL , 48 43 ไบต์

YY_XKx"@K<?93]44@K-?91]@XKV]v93Gd0>sQY"h4L)

สิ่งนี้ใช้วงเล็บเหลี่ยมในอินพุตและเอาต์พุต เอาต์พุตมีเครื่องหมายจุลภาคโดยไม่มีช่องว่างเป็นตัวคั่น

โปรดทราบว่าผลลัพธ์จะไม่ถูกตีความว่าเป็นรายการซ้อนใน MATL มันจะเป็นภาษาอื่นและมันเป็นไปตามข้อกำหนดผลลัพธ์ในการท้าทาย

ลองออนไลน์!

คำอธิบาย

YY_XKx   % Push -inf. Copy to clipboard K (represents previous input entry). Delete
"        % Take numerical array implicitly. For each entry:
  @K<    %   Is current entry less than the previous one?
  ?93]   %   If so, push 93 (ASCII for ']')
  44     %   Push 44 (ASCII for comma)
  @K-    %   Is current entry different from the previous one?
  ?91]   %   If so, push 91 (ASCII for '[')
  @XKV   %   Push current entry, copy into clipboard K, convert to string
]        % End for each
v        % Concat vertically all stack contents, converting to char
93       % Push 93 (ASCII for ']') (to be repeated the appropriate number of times)
Gd0>sQ   % Determine how many times the input increases, plus 1
Y"       % Repeat 93 that many times
h        % Concat horizontally with previous string. Gives a row array, i.e. string
4L)      % Remove first char, which is an unwanted comma. Display implicitly

3

Haskell, 96 ไบต์

a#b|a<b=",{"|a>b="},{"|1<2=","
f(a:b:c)=show a++a#b++f(b:c)++['}'|a<b]
f[x]=show x++"}"
('{':).f

ตัวอย่างการใช้งาน: ->('{':).f $ [7,3,3,2,6,4]"{7},{3,3},{2,{6},{4}}"

เนื่องจาก Haskell ไม่มีรายการซ้อนกันฉันจึงให้ผลลัพธ์เป็นสตริง อัลกอริธึมการซ้อนทำได้ง่าย: a) หมายเลขการพิมพ์, b) หากหมายเลขถัดไปมากกว่า (น้อยกว่า, เท่ากับ), การพิมพ์,{( },{, ,), c) ทำการเรียกซ้ำโดยใช้ส่วนที่เหลือของรายการ d) พิมพ์}หากหมายเลขนั้นคือ น้อยกว่าหนึ่งต่อไป, E) ทุกอย่างแนบในและ{}


ขออภัยฉันผิด
Akangka

3

Python 3, 98 ไบต์

p,*i=eval(input())
c=[p]
a=b=[c]
for x in i:
 if x>p:b=c
 if x!=p:c=[];b+=[c]
 c+=[x];p=x
print(a)

ตัวอย่าง:

$ python3 autonest.py <<< "[7, 3, 1, -8, 4, 8, 2, -9, 2, 8]"
[[7], [3], [1], [-8, [4, [8], [2], [-9, [2, [8]]]]]]

2

Java 8 197 187 193 192 ไบต์


ขอขอบคุณผู้แสดงความคิดเห็นทั้งหมดที่ทำงานกับฉันในเรื่องประหลาดนี้ มันลงไปที่ 187 ไบต์จนกระทั่งพบข้อผิดพลาดราคาแพง อย่างไรก็ตามเนื่องจากพลังเวทย์มนตร์ดำ "วิ่งลงไปที่" โอเปอเรเตอร์ "->" จำนวนไบต์นั้นอยู่ที่ 192 ไบต์ที่แข็งแรง


String a(int[]b){int l=b.length,d=1,i=0;String c="{";for(;i<l-1;i++)if(b[i]>b[i+1])c+=b[i]+"},{";else if(b[i]<b[i+1]){d++;c+=b[i]+",{";}else c+=b[i]+",";c+=b[l-1];while(d-->0)c+="}";return c;}

ขออภัยกำลังมาถึงแล้ว @Blue
Rohan Jhunjhunwala

นอกจากนี้เคล็ดลับสองข้อ: 1. คุณสามารถรับอินพุตเป็นอาร์เรย์ได้มากกว่าลำดับ: (int [] b) 2. คุณสามารถกำหนด int หลายตัวในเวลาเดียวกันโดยใช้เครื่องหมายจุลภาค (int l = b.length, d = 1 i = 0) 3. คุณควรกำจัดคนผิวขาวให้มากที่สุดเท่าที่จะทำได้ (เช่นระหว่างการมอบหมายตัวแปร) หวังว่านี่จะช่วยได้!
บลู

สวัสดีและยินดีต้อนรับสู่ PPCG! ตัวอย่างมีไว้สำหรับรหัสจาวาสคริปต์ที่มีความหมายว่าจะต้องดำเนินการในเบราว์เซอร์ไม่ท้าทายการส่ง นอกจากนี้คุณลืมช่องว่างหลังจากlength,
Maltysen

โอเคขอโทษฉัน @Maltysen ฉันจะฝังไว้ในโปรแกรมจาวาเต็มรูปแบบ ฉันเพิ่งออกไปจาก op ว่าคำว่า "function หรือ program" ซึ่ง "return" ดังนั้นฉันควร refactor นี้เพื่อพิมพ์ผลลัพธ์ของฉัน
Rohan Jhunjhunwala

1
@RohanJhunjhunwala ขออภัยควรมีความชัดเจนมากขึ้น เมื่อฉันพูดว่า "ตัวอย่าง" ฉันไม่ได้พูดถึงรหัสของคุณ แต่เป็นการจัดรูปแบบของคุณ เมื่อพยายามใส่รหัสในโพสต์อย่าคลิกปุ่ม "ตัวอย่าง" แต่วางไว้ในบล็อกรหัส (4 ช่องว่างหรือ ctrl-k)
Maltysen

2

C, 145 138 ไบต์

ขอบคุณ Giacomo เป็นเวลา 7 ไบต์!

#define P printf(
n;main(c,v,p,t)char**v;{p=-101;for(v++;*v;v++){t=atoi(*v);if(t<p)P"}{");if(t>p)P"{",n++);P"%d ",p=t);}for(;n--;)P"}");}

อินพุตถูกใช้ผ่านอาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตถูกกำหนดแม้ว่า stdout

วิ่งตัวอย่าง:

$ ./autonest 7 3 1 -8 4 8 2 -9 2 8
{7 }{3 }{1 }{-8 {4 {8 }{2 }{-9 {2 {8 }}}}}

1
ลองใช้t=atoi(*v);แทนsscanf(*v,"%d",&t); Source
Giacomo Garabello

ใช้for(;*++v;)สำหรับบันทึก 4 รายการแรกจากนั้นจึงif(t<p)P"}{");if(t>p)P"{",n++);ใช้งานt>p?P"}{"):P"{",n++);อีก 10 รายการ
Giacomo Garabello

1

CJam, 51 49 48 46 bytes

ใช้ประโยชน์จากข้อเท็จจริงที่ว่าจำนวนวงเล็บล่าสุดเป็นหนึ่งคู่มากกว่าจำนวนคู่ที่อยู่ติดกันที่เพิ่มขึ้นในอาร์เรย์

และฉันไม่รู้ว่าewโอเปอเรเตอร์ก่อนหน้านั้นฉันต้องปรับใช้อีกครั้ง

อินพุตคือรายการที่คั่นด้วยช่องว่างคั่นด้วยวงเล็บเหลี่ยม

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']

คำอธิบาย

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']
'[                                             e# Opening bracket
  q~                                           e# Read the input
    _W=\2ew                                    e# Save the last item and turn array into array of pair of next item and the item itself.
            _                                  e# We need two copies of that item                                       
             {~\_@-g)["["S"]["]=}%             e# Build the "body" that consist of the item and the suitable delimiter, space if equal, opening brace if the first item is the smallest, otherwise, closing bracket and opening bracket.
                                  @@           e# Put in the last item. (It was omitted in previous phase)
                                    {~<']""?}% e# Create the closing bracket as many as the number of increasing adjacent pair
                                               '] e# And one more bracket.

ฉันจะหาวิธีการทำเช่นนี้กับอาร์เรย์ที่ซ้อนกันจริงแทนที่จะอาศัยพริตตี้พริ้นติ้ง

ในที่สุดเมื่อเทียบกับคำตอบของ MATL


ในที่สุดเอาชนะคำตอบของ MATLไม่ใช่ตอนนี้ :-P
Luis Mendo

@LuisMendo Ugh
Akangka

1

เรติน่า, 71 70 ไบต์

{1 2 3}รายการพื้นที่มีแยกออกจากกันด้วยวงเล็บปีกกา: ไม่รองรับหมายเลขติดลบดังนั้นหากเป็นปัญหาฉันจะลบคำตอบของฉัน Retina + ตัวเลขติดลบ = ไม่คุ้มค่า

\d+
$*
+`\b(1+) (1+\1\b.*)
$1 {$2}
+`\b(1(1+)1*) (\2)\b
$1} {$2
1+
$.0

ลองออนไลน์


0

JavaScript (ES6), 73 ไบต์

a=>a.map(r=>l-r?(n=l<r?m:n).push(m=[l=r]):m.push(l),l=a[0],o=n=[m=[]])&&o

คำอธิบาย: กรณีของรายการที่เท่ากันติดต่อกันนั้นง่าย รายการจะถูกเพิ่มเข้าไปในอาร์เรย์ด้านในสุด (นี่คือตัวแทนของmตัวแปร; nเป็นอาร์เรย์ที่มีmเป็นองค์ประกอบสุดท้ายของมันในขณะที่oเป็นเอาท์พุท) สำหรับกรณีของไอเท็มต่าง ๆ ไอเท็มจะอยู่ในอาร์เรย์ด้านในสุดใหม่เสมอความแตกต่างเพียงอย่างเดียวคือไม่ว่าอาร์เรย์นั้นจะเป็นพี่น้องหรือลูกของอาร์เรย์ในสุดก่อนหน้า สำหรับความพิเศษของสนามกอล์ฟฉันตั้งค่าอาร์เรย์เพื่อให้รายการเริ่มต้นนับเป็นรายการที่เท่ากันติดต่อกัน

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