เห็นภาพอาร์เรย์ที่ซ้อนกัน


15

คุณจะได้รับอาร์เรย์ที่ซ้อนกัน โปรแกรมของคุณจะต้องเห็นภาพอาร์เรย์


แต่ .. ได้อย่างไร

ตัวอย่างเช่นสมมติว่าเรามีอาร์เรย์ที่ซ้อนกันเช่น [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]ตัวอย่างเช่นสมมติว่าเรามีอาร์เรย์ที่ซ้อนกันเช่น

อาร์เรย์ที่ซ้อนกันนี้สามารถมองเห็นได้เป็น:

->1
->2
-->1
-->2
->3
>4
---->5
>6

ตัวอย่าง

Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron

Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4

กฎระเบียบ

  • คุณสามารถใช้สตริง (หรือประเภทอื่นซึ่งทำงานเหมือนอาร์เรย์ที่ซ้อนกัน) เป็นอินพุต
  • ระดับสูงสุดของ "เลเยอร์" คือ 2 ^ 32-1

มันจะต้องมีการสร้างภาพที่แน่นอนนี้หรือไม่?
punya

@mnbvc ใช่เว้นแต่ฉันบังคับให้ทำคนเริ่มบิด I / O มาก เชื่อฉันสิฉันลองแล้ว
Matthew Roh

ฉันรู้สึกเหมือนเรตินาจะชนะสิ่งนี้
Magic Octopus Urn

1
มีข้อ จำกัด ใด ๆ เกี่ยวกับอักขระที่สามารถปรากฏในสตริงได้หรือไม่
Martin Ender

คำถามที่เกี่ยวข้องเพิ่มเติม1 , 2
AdmBorkBork

คำตอบ:


12

APL, 32 ไบต์

{1=≡⍺:⎕←⍺,⍨⍵↑1↓⍵/'->'⋄⍺∇¨⍵+1}∘0

ทดสอบ:

      r
┌────┬─────────────────────────────────────────────────────────────────────────────────────────┐
│Atom│┌──────┬──────────────────────────────┬───────┬────────────────────────────────┬────────┐│
│    ││Proton│┌────────┬────────┬──────────┐│Neutron│┌────────┬──────────┬──────────┐│Electron││
│    ││      ││Up Quark│Up Quark│Down Quark││       ││Up Quark│Down Quark│Down Quark││        ││
│    ││      │└────────┴────────┴──────────┘│       │└────────┴──────────┴──────────┘│        ││
│    │└──────┴──────────────────────────────┴───────┴────────────────────────────────┴────────┘│
└────┴─────────────────────────────────────────────────────────────────────────────────────────┘
      {1=≡⍺:⎕←⍺,⍨⍵↑1↓⍵/'->'⋄⍺∇¨⍵+1}∘0 ⊢ r 
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron

คำอธิบาย:

  • {... }∘0: เรียกใช้ฟังก์ชันต่อไปนี้โดย0ผูกกับ:
    • 1=≡⍺:: ถ้าอินพุตมีความลึก 1 (เช่นอาร์เรย์ที่ไม่มีอาร์เรย์อื่น):
      • ⍵/'->': สร้างสตริงที่มี -s และ >s
      • 1↓: วางองค์ประกอบแรก
      • ⍵↑: และใช้องค์ประกอบแรก สิ่งนี้ส่งผลให้เป็นสตริงที่มี⍵-1เครื่องหมายขีดกลางและอีก>อัน
      • ⍺,⍨: เพิ่มอินพุตต่อท้าย
      • ⎕←: และส่งออกไปยังหน้าจอ
    • : มิฉะนั้น,
      • ⍺∇¨⍵+1: เพิ่ม 1 ถึงและใช้ฟังก์ชันกับแต่ละอาร์เรย์ที่ซ้อนกัน

5
เดี๋ยวก่อนใช้การป้อนข้อมูลในรูปแบบ ASCII หรือไม่?
Rɪᴋᴇʀ

4
@Riker: ไม่ต้องใช้อาร์เรย์แบบซ้อนปกติอย่างไรก็ตามนี่เป็นวิธีที่ Dyalog APL แสดงอาร์เรย์แบบซ้อนและ (ฉันคิดว่า) ทำให้เห็นได้ชัดว่าเกิดอะไรขึ้น ('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))คุณสามารถสร้างได้โดยการเขียนเช่น
marinus

9
อ่าโอเค. ที่ล้างมันขึ้นมา ค่อนข้างผิดหวังตอนนี้ ....
Rɪᴋᴇʀ


7

Mathematica, 58 57 56 ไบต์

ขอบคุณ Greg Martin ที่ช่วยประหยัด 1 ไบต์

ขอบคุณ ngenisis สำหรับการบันทึก 1 ไบต์

MapIndexed[Print[Table["-",Tr[1^#2]-1]<>">",#]&,#,{-1}]&

47
ยินดีต้อนรับสู่ PPCG! คุณควรรู้ว่าคำตอบที่ให้คำอธิบายเพียงเล็กน้อยหรือไม่ได้รับการตั้งค่าสถานะโดยอัตโนมัติและสิ้นสุดลงคิวตรวจสอบคุณภาพต่ำ นั่นอาจทำให้คำตอบของคุณถูกลบ โปรดทราบว่าหากคุณมีคำตอบที่ถูกลบหลายคำคุณอาจถูกระงับชั่วคราว หัวนิดหน่อย!
Stewie Griffin

20
@ StewieGriffin ขอบคุณสำหรับการต้อนรับที่อบอุ่นฉันจะจำไว้เสมอ!
Martin Ender

6
@StewieGriffin คุณได้รับ sitemod หรือไม่? เกิดขึ้นที่นี่คืออะไร? นี่เป็นเรื่องตลกภายในหรือไม่ #confusedและฤดูใบไม้ผลิที่ดีสำหรับพวกคุณถ้าคุณอยู่ทางเหนือ
Mindwin

4
@Mindwin: Stack Exchange มีตัวกรองที่ออกแบบมาเพื่อจับคำตอบที่ไม่น่าจะมีประโยชน์ โพสต์ประเภทนี้ (ชื่อ + ตัวอย่างรหัสย่อไม่มีคำอธิบาย) มีแนวโน้มที่จะก่อให้เกิดผลบวกปลอมเนื่องจากดูเหมือนว่าโพสต์ความพยายามต่ำไปยังคอมพิวเตอร์ (และความคิดเห็นของ Stewie Griffin มีลิงค์ไปยังหน้าจอที่ระบุว่า ความจริงแล้วสิ่งที่ผิดพลาดเกิดขึ้นจริงมันทำให้สถานการณ์สนุกขึ้น) นี่คือตัวอย่างของโพสต์อื่นที่ติดอยู่ในตัวกรอง

8
@Titus ฉันชอบที่จะเพิ่ม แต่ฉันไม่ต้องการที่จะทำให้ความคิดเห็นของ Stewie เป็นโมฆะ :(
Martin Ender

6

Java 7, 153 141 114 ไบต์

String r="";<T,S>S c(S s,T o){for(T x:(T[])o)if(x instanceof Object[])c("-"+s,x);else r+=s+">"+x+"\n";return(S)r;}

-39 ไบต์ขอบคุณ@ Barteks2x

คำอธิบาย:

String r="";                         // Result String outside the method / on class-level
<T,S> S c(S s, T o){                 // Recursive Method with generic String and Object parameters and String return-type
  for(T x : (T[])o)                  //  Loop over the input-array
    if(x instanceof Object[])        //   If the current item is an array itself:
      c("-"+s, x);                   //    Recursive method-call with this array
    else                             //   Else:
      r += s+">"+x+"\n";             //    Append return-String with stripes String-input, ">", current item, and a new-line
                                     //  End of loop (implicit / single-line body)
  return (S)r;                       //  Return the result-String
}                                    // End of method

รหัสทดสอบ:

ลองที่นี่

class M{
  String r="";<T,S>S c(S s,T o){for(T x:(T[])o)if(x instanceof Object[])c("-"+s,x);else r+=s+">"+x+"\n";return(S)r;}

  public static void main(String[] a){
    M m = new M();
    System.out.println(m.c("", new Object[]{new Object[]{1,2},new Object[]{new Object[]{1,2},3},4,new Object[]{new Object[]{new Object[]{new Object[]{5}}}},6}));
    m.r = "";
    System.out.println(m.c("", new Object[]{"Atom",new Object[]{"Proton",new Object[]{"Up Quark","Up Quark","Down Quark"}},new Object[]{"Neutron",new Object[]{"Up Quark","Up Quark","Down Quark"}},"Electron"}));
  }
}

เอาท์พุท:

->1
->2
-->1
-->2
->3
>4
---->5
>6

>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Up Quark
-->Down Quark
>Electron

1
คุณสามารถทำให้มันสั้นลงเล็กน้อย (143 หรือแม้แต่ 142) โดยใช้โอเปอร์เรเตอร์ ternary for(int j=i;j-->0;r+="-");เพื่อทำสิ่งที่บรรทัดถัดไปทำและใช้อาร์กิวเมนต์ทั่วไปแทน Object []: String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;} และแม้แต่ 1 ตัวอักษรน้อยลงหากผ่าน 1 แทน 0 เป็นครั้งแรก การโต้แย้งก็โอเค
barteks2x

ฉันพบวิธีทำให้สั้นลงโดยการลบ [] ออกจากอาร์กิวเมนต์ทั่วไปมันช่วยเพิ่มอักขระได้อีก 2 ตัว (แต่ไม่สามารถแก้ไขความคิดเห็นหลังจาก> 5 นาที)
barteks2x

@ Barteks2x ขอบคุณ! -12 ไบต์ขอบคุณสำหรับคุณ :) Btw ลบออก[]จากพารามิเตอร์เพื่อบันทึก 1 ไบต์เพิ่มเติมให้ข้อผิดพลาด ดูข้อผิดพลาดที่นี่ที่> Debugหลังจากทำงาน
Kevin Cruijssen

String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}งานนี้ นอกจากนี้คุณสามารถทำเคล็ดลับทั่วไปที่คล้ายกันกับสตริงเพื่อบันทึกการเพิ่มไบต์ แต่ต้องเก็บผลลัพธ์ในตัวแปรก่อนที่จะพิมพ์หรือนักแสดงที่ชัดเจน (เรียกเมธอดคลุมเครือ):String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
barteks2x

1
ฉันไม่แน่ใจว่าจะได้รับการพิจารณาหรือไม่ แต่ 114 ไบต์ที่นี่โดยมีสตริงว่างเป็นอาร์กิวเมนต์แทนที่จะเป็นศูนย์ (อาจมี 1 ตัวอักษรน้อยกว่าหากได้รับอนุญาตเป็น ">" เป็นอาร์กิวเมนต์) String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}และข้อกำหนดสำหรับการส่งสตริงกลับประเภทเมื่อโทร มันจากไปแล้ว.
barteks2x

6

PHP, 77 74 73 ไบต์

บันทึกได้ 4 ไบต์ขอบคุณ @manatwork

function f($a,$p=">"){foreach($a as$e)"$e"!=$e?f($e,"-$p"):print"$p$e
";}

ฟังก์ชันเรียกซ้ำต้องการ PHP 7.1 หรือใหม่กว่าสำหรับดัชนีสตริงลบ
"$e"คือArrayสำหรับอาร์เรย์; เช่น"$e"!=$eเดียวกับis_array($e)เป็นเช่นเดียวกับ

  • เริ่มต้นด้วยคำนำหน้า >
  • เสริม a -คำนำหน้าให้กับแต่ละระดับ
  • พิมพ์คำนำหน้า + องค์ประกอบ + บรรทัดใหม่สำหรับอะตอม

1
75 ไบต์:function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
Ismael Miguel

1
ถ้าไม่ได้สำหรับการจัดรูปแบบที่ต้องการ print_r ($ array) จะเล็กลง :)
ivanivan

1
ไม่เพียงแค่การทดสอบอย่างรวดเร็ว แต่ดูเหมือนว่าจะถูกแทนที่ด้วยis_array($e) $e[-1]!==""
จัดการ

1
@manatwork นั่นคือ PHP <7.1 ... ใน PHP 7.1 ก็สามารถทำได้ด้วย$e[-]==""... $e[-1]>""และมีสภาพกลับ ยินดีที่ได้พบ!
ติตัส

1
บางทีฉันอาจจะพลาดกรณีมุมบางอย่าง แต่ตอนนี้ดูเหมือนว่าจะถูกแทนที่ด้วย$e[-1]>"" "$e"==$eอย่างน้อยในสมัยโบราณ PHP 5.6 ที่ฉันใช้
จัดการ

5

C99 (GCC), 201 187 140 112 109

f(char*a){for(long d=1,j;j=d+=*++a>90?92-*a:0;)if(*a<35){for(;j||*++a^34;)putchar(j?"->"[!--j]:*a);puts("");}}

รูปแบบการขยายตัว:

f(char*a){
    for(long d=1,j;j=d+=*++a>90?92-*a:0;)
        if(*a<35){
            for(;j||*++a^34;)putchar(j?--j?45:62:*a);
            puts("");
        }
}

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

ไม่ใช้การเรียกซ้ำและใช้ชนิดแบบยาวเพื่อให้ได้ตามกฎข้อที่สอง: 2 ^ 32-1 ระดับระดับ ภาษาสคริปต์ส่วนใหญ่มีความลึกในการเรียกซ้ำ จำกัด หรือเกิดความผิดพลาดจากการโอเวอร์โฟลว์แบบสแต็ก

ฉันไม่คุ้นเคยกับการเล่นกอล์ฟใน C ชื่นชมความช่วยเหลือใด ๆ :)

ขอบคุณที่ bolov สำหรับเคล็ดลับของเขา! ขอขอบคุณเป็นพิเศษสำหรับติตัสผู้ซึ่งพร้อมเสมอสำหรับการเล่นกอล์ฟ (แม้ใน C)!

อีกสองไบต์บันทึกไว้โดยความจริงที่ว่าเราสามารถเสร็จสิ้นเมื่อเราจับคู่สุดท้าย ]และไม่จำเป็นต้องตรงกับตัวละครที่เป็นโมฆะ

สามารถทดสอบได้ที่ Wandbox


ขอให้เรายังคงอภิปรายนี้ในการแชท
ติตัส

คุณไม่สามารถย่อบรรทัดที่สองให้สั้นลงได้for(int d=1 ...หรือไม่ longมี 4 ตัวอักษรในขณะที่intมีเพียง 3 ตัวและไม่มีเหตุผลใดที่คุณจะต้องทำให้มันเกินกว่าที่การ2^32 - 1ส่งของคุณจะถูกต้องประหยัดไบต์เดียว
Restioson

int @Restioson 2^31-1มีการลงนามและดังนั้นจึงทำงานเท่านั้นจนกว่า
Christoph

@Christoph ความท้าทายระบุว่าคุณไม่จำเป็นต้องไปไกลกว่านั้น
Restioson

@Restioson The maximum level of "layers" is 2^32-1.ความท้าทายรัฐเป็นกฎ 2^31-1น้อยกว่า2^32-1มาก 2^32-1ไม่พอดีintในขณะที่เหมาะกับunsignedหรือlong(ที่อยู่ในระบบ / คอมไพเลอร์ส่วนใหญ่แน่นอน) ดังนั้นintจะไม่ทำให้คำตอบที่ถูกต้อง (เช่นคำตอบส่วนใหญ่ที่นี่ไม่เป็น)
Christoph

4

JavaScript (ES6), 58 51 ไบต์

f=(a,s='>')=>a.map(e=>e.map?f(e,'-'+s):s+e).join`
`

แก้ไข: บันทึกแล้ว 7 ไบต์เมื่อ @Arnauld ชี้ให้เห็นว่าฉันสามารถรวมสองวิธีเข้าด้วยกัน


4

PHP, 129 123 112 109 95 93 91 ไบต์

for(;a&$c=$argn[++$i];)$c<A?$c<"-"?a&$s?$s=!print"$p>$s
":0:$s.=$c:$p=substr("---$p",$c^i);

วิธีการแก้ปัญหาซ้ำใช้เวลาสตริงจาก STDIN:
ทำงานด้วยecho '<input>' | php -nR '<code>'หรือทดสอบออนไลน์

ชำรุด

for(;a&$c=$argn[++$i];)     // loop $c through input characters
    $c<A                        // not brackets?
        ?$c<"-"                     // comma or quote?
            ?a&$s?$s=!print"$p>$s\n":0  // if $s not empty, print and clear $s
            :$s.=$c                     // digit: append to $s
        :$p=substr("---$p",$c^i)    // prefix plus or minus one "-"
;

มีความสุขที่ตัวเลขอยู่ในเครื่องหมายคำพูด; ดังนั้นฉันต้องการเพียงหนึ่งการกระทำในเวลาเดียว

เล่นซอ ASCII

char    ascii   binary/comment
 "       34
 ,       44
 [       91     0101 1011
 ]       93     0101 1101

 A       65     $c<A    true for comma, quote and digits
 -       45     $c<"-"  true for comma and quote

                =0011 1010 -> 50 -> "2"
i^"["   105^91  ^0101 1011
 i      105      0110 1001
i^"]"   105^93  ^0101 1101
                =0011 0100 -> 52 -> "4"

การเพิ่มขีดกลาง 3 ไป$pและลบ 2 [, 4 สำหรับ]เพิ่มหนึ่งและลบหนึ่งสำหรับ[]


ทำได้ดีอีกครั้ง!
Christoph

4

Python 2, 65 64 ไบต์

f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o

ตอนนี้คำตอบของฉันเริ่มต้นอย่างต่อเนื่องโดยไม่มีเครื่องหมายขีดคั่นดังนั้น["foo", "bar"]:

>foo
>bar

import sys, pprint; pprint.pprint(sys.argv)43 ไบต์เป็น แต่ฉันไม่รู้ว่ามันผิดกฎของรหัสกอล์ฟหรือไม่
Carel

สิ่งนี้ช่วยประหยัดหนึ่งไบต์:f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
Ben Frankel

@Carel คุณไม่สามารถ 'นำเข้า pprint เป็น p' หรืออาจ (ไม่แน่ใจว่ามันใช้งานได้หรือไม่) 'import pprint.pprint as p' (ดูดีฉันไม่สามารถหาเครื่องหมายด้านหลังบนแป้นพิมพ์โทรศัพท์ของฉัน)
cole

@Cole Hmm .. import sys, pprint.pprint as p; p(sys.argv)ยังคงเป็น 43 แต่ข้อเสนอแนะที่ดีไม่มีน้อย D ลองimport sys.argv as vใช้ความยาวจริง ๆ แล้วจะค่อนข้าง 48 ไบต์ หากใครสามารถกำจัด sys.argv พวกเขาต้องการบันทึกมาก แต่โปรแกรมจะไร้ประโยชน์แล้ว วิธีการเรียกซ้ำมีความยาวdef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]~ 80 ไบต์
Carel

3

Perl 5 , 55 ไบต์

53 ไบต์ของรหัส + -nlค่าสถานะ

/"/?print"-"x~-$v.">$_":/]/?$v--:$v++for/]|\[|".*?"/g

ลองออนไลน์!

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

sub f{my$v=pop;map{ref?f(@$_,$v+1):"-"x$v.">$_"}@_}sub{f@_,0}

ลองออนไลน์!

แต่วิธีที่ Perl เกี่ยวข้องกับพารามิเตอร์นั้นไม่เหมาะสำหรับฟังก์ชั่นการเล่นกอล์ฟ: ไม่มีพารามิเตอร์ทางเลือกหมายความว่าฉันต้องทำฟังก์ชั่นที่สอง (ไม่ระบุชื่อ) เรียกชื่อแรกและฉันต้องรับพารามิเตอร์สุดท้ายด้วยความยาวmy$v=popนั้น


3

Ruby, 49 45 46 ไบต์

f=->c,p=?>{c.map{|x|x==[*x]?f[x,?-+p]:p+x}*$/}

ตัวอย่าง:

puts f[["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]]

>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron

คำอธิบาย:

ฟังก์ชั่นวนซ้ำ: ถ้าx==[*x]งั้น x จะเป็นอาร์เรย์และเราวนซ้ำ ถ้าไม่เยื้องมัน


3

Haskell, 104 ไบต์

l@(x:y)#(a:m)|[(h,t)]<-reads$a:m=y++h++l#t|a<'#'=l#m|a<'-'='\n':l#m|a>'['=y#m|q<-'-':l=q#m
l#_=""
(">"#)

Haskell ไม่มีรายการซ้อนกันที่มีความลึกแตกต่างกันดังนั้นฉันจึงต้องวิเคราะห์สตริงอินพุตด้วยตัวเอง โชคดีที่ฟังก์ชั่นห้องสมุดreadsสามารถแยกสตริงได้ (เช่น" -enclosed char sequence) ดังนั้นฉันจึงมีความช่วยเหลือเล็กน้อยที่นี่

ตัวอย่างการใช้งาน:

*Main> putStrLn $ (">"#) "[[\"1\",\"2\"],[\"3\",\"4\"]]" 
->1
->2
->3
->4

ลองออนไลน์!.

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

ฟังก์ชั่น#ผ่านไปถ่านสตริงโดยถ่านและช่วยให้ระดับการซ้อน (พารามิเตอร์แรกl) เป็นสตริงของด้วยเป็นครั้งสุดท้าย- >หากส่วนหัวของรายการสามารถแยกวิเคราะห์เป็นสตริงใช้lและสตริงตามด้วยการเรียกซ้ำด้วยการเอาสตริงออก หากตัวแรกคือช่องว่างให้ข้ามมัน หากเป็น a ,ให้ขึ้นบรรทัดใหม่และดำเนินการต่อไปถ้าเป็น]ให้ลดระดับการซ้อนและดำเนินการต่อไปและอื่น ๆ ( [เหลือเพียงทางเดียว) ยกระดับการทำรังและทำต่อไป การเรียกซ้ำจะสิ้นสุดลงด้วยสตริงอินพุตว่าง ฟังก์ชั่นหลัก(">"#)กำหนดระดับการซ้อนไปและบริการโทร">"#


2

SWI-Prolog 115 ไบต์

p(L):-p(L,[>]).
p([],_):-!.
p([H|T],F):-p(H,[-|F]),p(T,F),!.
p(E,[_|F]):-w(F),w([E]),nl.
w([]).
w([H|T]):-write(H),w(T).

เพิ่มตัวแบ่งบรรทัดสำหรับการอ่านเท่านั้นไม่รวมอยู่ในจำนวนไบต์

pเพรดิเคตวนซ้ำ traverses อาร์เรย์เพิ่ม '-' ไปยังคำนำหน้าFเมื่อเลื่อนระดับลึก wใช้ในการเขียนคำนำหน้าอาร์เรย์เช่นเดียวกับองค์ประกอบที่เกิดขึ้นจริงเพื่อการส่งออก

ตัวอย่าง:

?- p(["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]).
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron

2

แบตช์ 249 ไบต์

@echo off
set/ps=
set i=
:t
set t=
:l
set c=%s:~,1%
set s=%s:~1%
if "%c%"=="[" set i=-%i%&goto l
if not "%c%"=="]" if not "%c%"=="," set t=%t%%c%&goto l
if not "%t%"=="" echo %i:~1%^>%t%
if "%c%"=="]" set i=%i:~1%
if not "%s%"=="" goto t

ชุดที่น่ารำคาญมีปัญหาในการเปรียบเทียบเครื่องหมายจุลภาค วิ่งตัวอย่าง:

[Atom,[Proton,[Up Quark,Up Quark,Down Quark],Neutron,[Up Quark,Down Quark,Down Quark],Electron]]
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron

2

Retina , 63 54 52 ไบต์

บันทึก 2 ไบต์ขอบคุณ Martin Ender

.*?".*?"
$`$&¶
T`[] -~`-]_`.(?=.*".*")
-]

-"
>
T`]"

ลองออนไลน์!

คำอธิบาย

.*?".*?"
$`$&¶

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

T`[] -~`-]_`.(?=.*".*")

ทับศัพท์นี้จะแทนที่[ด้วย-ออก]ไม่เปลี่ยนแปลงและลบทุกตัวละครอื่น ๆ (  -~เป็น ASCII พิมพ์) อย่างไรก็ตามมันจะแทนที่ตัวละครที่ปรากฏก่อนที่สตริงสุดท้ายในแต่ละบรรทัด

-]

ถัดไปทุกอินสแตนซ์ของ-]จะถูกลบออก สิ่งเหล่านี้สอดคล้องกับคู่ของวงเล็บจับคู่และเราต้องการเพียงวงเล็บเหลี่ยมที่ไม่ตรงกัน หลังจากลบสิ่งเหล่านี้แล้วแต่ละบรรทัดจะมีจำนวน-s เท่ากับจำนวนวงเล็บเปิดที่ไม่มีใครเทียบมาก่อน

-"
>

ครั้งสุดท้าย-ก่อนที่"จะถูกแทนที่ด้วย>เพื่อสร้างลูกศร

T`]"

ในที่สุด]s และ s ที่เหลือทั้งหมด"จะถูกลบ


ดูเหมือนว่าจะไม่มีคำพูด (ยกเว้น) คำพูดในสตริง ฉันไม่แน่ใจว่าถูกต้องตามกฎหมายหรือไม่ แต่ฉันขอคำชี้แจง
Martin Ender

@MartinEnder จับตาฉันจะจับตามัน
Business Cat

1

Röda , 54 ไบต์

f d=""{{|n|{n|f d=`$d-`}if[n is list]else[`$d>$n
`]}_}

ลองออนไลน์!

เป็นฟังก์ชันที่อ่านอาร์เรย์อินพุตจากสตรีม สำหรับแต่ละรายการมันอาจเรียกตัวเองซ้ำหรือพิมพ์รายการ


1

Python 3, 80 ไบต์

Lambdas ของ Python ให้การสนับสนุนการเวียนของมันซ้ำใครจะรู้?

p=lambda l,d=1:[p(i,d+1)if isinstance(i,list)else print("-"*d+">"+i)for i in l]

นี่คือการตอบโต้ / ชมเชยคำตอบของ orlp


ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่าคุณได้นับเลื่อนบรรทัดต่อท้ายหรือบางสิ่งบางอย่าง (เพราะผมจะนับเฉพาะจำนวน 80 bytes) =และคุณไม่จำเป็นต้องมีช่องว่างรอบ ฉันยังสงสัยว่าคุณสามารถวางช่องว่างทั้งหมดหลังจากสาม)จุด แต่ฉันไม่ค่อยคุ้นเคยกับการเล่นกอล์ฟใน Python
Martin Ender


0

ซ้อนกัน 27 ไบต์

[@.1-'-'*\'>'\,,out]deepmap

ลองออนไลน์!

รับอินพุตจากด้านบนของสแต็กและปล่อยเอาต์พุตบน STDOUT สิ่งนี้ง่ายเหมือนการทำแผนที่ความลึก- dเวลาทำซ้ำเชื่อมต่อกับ '>' และองค์ประกอบเอง


0

Gema, 63 ตัวอักษร

\A=@set{i;-1}
[=@incr{i}
]=@decr{i}
"*"=@repeat{$i;-}>*\n
,<s>=

เช่นเดียวกับโซลูชันการแยกวิเคราะห์อื่น ๆ สมมติว่าจะไม่มีการใส่เครื่องหมายคำพูดคู่ในสตริง

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

bash-4.3$ gema '\A=@set{i;-1};[=@incr{i};]=@decr{i};"*"=@repeat{$i;-}>*\n;,<s>=' <<< '[["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]'
->1
->2
-->1
-->2
->3
>4
---->5
>6

0

jq, 70 67 ตัวอักษร

( ตัวเลือกบรรทัดคำสั่งรหัส67 64 ตัวอักษร + 3 ตัวอักษร)

def f(i):if type=="array"then.[]|f("-"+i)else i+. end;.[]|f(">")

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

bash-4.3$ jq -r 'def f(i):if type=="array"then.[]|f("-"+i)else i+. end;.[]|f(">")' <<< '[["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]'
->1
->2
-->1
-->2
->3
>4
---->5
>6

การทดสอบออนไลน์

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