น้ำตาลทรายยาอายุวัฒนะ


17

ใน Elixir รายการ (ที่เชื่อมโยง) อยู่ในรูปแบบ[head | tail]ที่ส่วนหัวสามารถเป็นอะไรก็ได้และtailเป็นรายการของส่วนที่เหลือของรายการและ[]- รายการที่ว่างเปล่า - เป็นข้อยกเว้นเพียงอย่างเดียว

รายการสามารถเขียนได้เช่นเดียวกับ[1, 2, 3]ที่เทียบเท่า[1 | [2 | [3 | []]]]

งานของคุณคือการแปลงรายการตามที่อธิบายไว้ ข้อมูลที่ป้อนจะเป็นรายการที่ถูกต้อง (ใน Elixir) ที่มีเฉพาะตัวเลขที่ตรงกับ regex\[(\d+(, ?\d+)*)?\]regex คุณสามารถรับอินพุตด้วย (หนึ่งช่องว่างหลังจากแต่ละเครื่องหมายจุลภาค) หรือไม่มีช่องว่าง เอาต์พุตอาจมี (หนึ่งช่องว่างก่อนและหลังแต่ละ|ช่อง) หรือไม่มีช่องว่าง

สำหรับอินพุตที่มีเลขศูนย์นำหน้าคุณสามารถส่งออกโดยไม่มีเลขศูนย์หรือด้วย

อินพุตต้องถูกใช้เป็นสตริง (หากเขียนฟังก์ชัน) เช่นเดียวกับเอาต์พุต

ตัวอย่าง

[] -> []
[5] -> [5 | []]
[1, 7] -> [1 | [7 | []]]
[4, 4, 4] -> [4 | [4 | [4 | []]]]
[10, 333] -> [10 | [333 | []]]

เกี่ยวข้องไม่ซ้ำกันเนื่องจากส่วนนี้เกี่ยวข้องกับการเพิ่มโหมด]ไปยังจุดสิ้นสุด นอกจากนี้คำตอบของ Haskell ที่นี่นั้นค่อนข้างแตกต่างจากคำตอบในนั้น


5
-1 จากฉัน รูปแบบ IO ที่ยุ่งยากนั้นไม่ได้รับการสนับสนุน หากอินพุตเป็นรายการให้เราพิจารณาเป็นรายการแทนที่จะมี 90% ของรหัสของเราเพียงแยกวิเคราะห์อินพุต
Jo King

2
เราต้องสนับสนุน 0s ชั้นนำหรือไม่? พวกเขาพอดีกับ regex
Jo King

2
ซ้ำซ้อนที่เป็นไปได้ของSugar Free ไวยากรณ์
NoOneIsHere

5
@ โจกิ้งฉันขอยืนยันว่าที่นี่ความท้าทายนั้นเกี่ยวกับการแปลงระหว่างสองรูปแบบเฉพาะดังนั้นการแยกวิเคราะห์อินพุตเป็นส่วนพื้นฐานของความท้าทายไม่ใช่สิ่งที่เพิ่มเข้ามา ป.ล. ฉันเพิ่งรู้ตอนนี้ชื่อเล่นของคุณคือ xD
Leo

2
@MuhammadSalman: ความท้าทายถูกแท็กเป็น "การวิเคราะห์" ดังนั้นการแปลงจาก / เป็นสตริงจึงเป็นส่วนสำคัญของความตั้งใจ
nimi

คำตอบ:


9

Haskell, 50 ไบต์

f.read
f(a:b)='[':show(a+0)++'|':f b++"]"
f _="[]"

ลองออนไลน์!

+0ช่วยให้ Haskell ประเภทการตรวจสอบทราบว่าเราจะจัดการกับรายการของตัวเลขจึงreadจะแยกสายป้อนสำหรับเรา


1
+1, ฉันชอบเคล็ดลับ +0!
B. Mehta



4

Retina , 39 33 32 20 ไบต์

\b]
,]
+`,(.*)
|[$1]

บันทึก 13 ไบต์ขอบคุณ H.PWiz, ovs, ASCII-only และ Neil
ลองออนไลน์!

คำอธิบาย

\b]
,]

หากเราไม่มีรายการว่างให้เพิ่มจุลภาคต่อท้าย

+`,(.*)
|[$1]

|[ thing ]ในขณะที่มีเครื่องหมายจุลภาคสิ่งห่อด้วย




@ ASCII เท่านั้นคุณสามารถบันทึกอีก 4 ไบต์โดยการแทนที่ด้วย\b] ,](ไม่เช่นนั้นฉันได้ค้นพบวิธีแก้ปัญหาด้วยตนเองอย่างอิสระ)
Neil

โอ้ใช่แล้ว ฉันลืมไปแล้ว\bเพราะเหตุผลบางอย่าง> _> 20 bytes @Mnemonic
เท่านั้น

4

Perl 5 -pl , 31 28 ไบต์

s/\d\K]/,]/;$\=']'x s/,/|[/g

ลองออนไลน์!

อย่างไร?

-p                    # (command line) Implicit input/output via $_ and $\
s/\d\K]/,]/;          # insert a comma at the end if the list is not empty
$\=']'x s/,/|[/g      # At the end of the run, output as many ']' as there are
                      # commas in the input.  Replace the commas with "|["

3

Elixir , 111 85 bytes

f=fn[h|t],f->"[#{h}|#{f.(t,f)}]"
[],_->"[]"
h,f->f.(elem(Code.eval_string(h),0),f)end

ลองออนไลน์!

ฉันไม่เคยใช้ Elixir มาก่อน กำหนดฟังก์ชั่นที่ใช้สตริงและการอ้างอิงกับตัวเองและส่งกลับสตริง


3

Ceylon , 113 ไบต์

String p(String s)=>s.split(" ,[]".contains).select((x)=>!x.empty).reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

ลองออนไลน์!

นี่มันเขียนออกมา:

// define a function p mapping Strings to Strings.
String p(String s) =>
    // we split the string at all characters which are brackets, comma or space.
    s.split(" ,[]".contains)    // → {String+}, e.g.  { "", "1", "7", "" }
    // That iterable contains empty strings, so let's remove them.
    // Using `select` instead of `filter` makes the result a sequential instead of
    // an Iterable.
     .select((x)=>!x.empty)    // → [String*], e.g.   [1, 7]
    // now invert the order.
    // (This needs a Sequential (or at least a List) instead of an Iterable.)
     .reversed                 // → [String*], e.g.   [7, 1]
    // Now iterate over the list, starting with "[]", and apply a function
    // to each element with the intermediate result.
     .fold("[]")                       // → String(String(String, String))
    //    This function takes the intermediate result `t` (for tail) and an element
    //    `h` (for head), and puts them together into brackets, with a " | " in the
    //    middle. This uses String interpolation, I could have used `"+` and `+"`
    //    instead for the same length.
          ((t,h)=>"[``h`` | ``t``]");  // → String

ลองออนไลน์!

ดังที่บันทึกไว้โดย ovs ในความคิดเห็น (ลบตอนนี้): หากเลือกตัวเลือก "ไม่มีช่องว่าง" สำหรับอินพุตและเอาต์พุตที่ระบุในคำถามหนึ่งสามารถเซฟได้อีก 3 ไบต์ (อันที่เห็นได้ชัดเจนมีช่องว่าง)

หากเราไม่จำเป็นต้องแยกวิเคราะห์อินพุต แต่สามารถรับลำดับเป็นอินพุตได้ก็จะสั้นลงมาก (69 ไบต์)

String p(Object[]s)=>s.reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

ลองออนไลน์!



2

SNOBOL4 (CSNOBOL4) , 114 ไบต์

	I =INPUT
S	N =N + 1	
	I SPAN(1234567890) . L REM . I	:F(O)
	O =O '[' L ' | '	:(S)
O	OUTPUT =O '[' DUPL(']',N)
END

ลองออนไลน์!

	I =INPUT				;* read input
S	N =N + 1				;* counter for number of elements (including empty list)
	I SPAN(1234567890) . L REM . I	:F(O)	;* get value matching \d until none left
	O =O '[' L ' | '	:(S)		;* build output string
O	OUTPUT =O '[' DUPL(']',N)		;* print O concatenated with a '[' and N copies of ']'
END

2

Stax , 19 ไบต์

É▲²:WlÖ└%ï╪☺╒▓"We↨Φ

เรียกใช้และแก้ไขข้อบกพร่อง

Stax โพสต์แรกของฉันดังนั้นจึงอาจไม่เหมาะสม

แยกออกและแสดงความคิดเห็น:

U,                      Put -1 under input
  {                     Block
   i                      Push loop index, needed later
    '[a$'|++              Wrap the element in "[...|"
            m           Map
             '[+        Add another "["
                s2+     Get the latest loop index + 2
                   ']*+ Add that many "]"

เรียกใช้และแก้ไขข้อบกพร่องนี้





2

R , 84 71 69 ไบต์

function(x){while(x<(x=sub('(,|\\d\\K(?=]))(.+)','|[\\2]',x,,T)))1;x}

ลองออนไลน์!

  • -15 ไบต์ขอบคุณ @KirillL

1
71 ไบต์ด้วยการทดแทนเดียวตามคำตอบ Ruby ของฉัน
Kirill L.

@KirillL : ขอบคุณฉันแน่ใจว่ามี regex ที่สั้นกว่าในการทำเช่นนั้น แต่ฉันมักจะยุ่งกับ lookarounds: D
digEmAll

-2 มากขึ้นผมโดยสิ้นเชิงลืมเกี่ยวกับสั้น\Klookbehind
คิริลล์ลิตร




1

เยลลี่ขนาด 18 ไบต์

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$

โปรแกรมเต็มรูปแบบที่พิมพ์ผลลัพธ์ (เป็นลิงก์แบบ monadic โดยจะรับรายการของตัวอักษร แต่ส่งคืนรายการของตัวอักษรและจำนวนเต็ม)

ลองออนไลน์!

อย่างไร?

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$ - Main link: list of characters  e.g. "[10,333]"
ŒV                 - evaluate as Python code              [10,333]
  µ                - start a new monadic chain, call that X
   ⁾[]             - list of characters                   ['[',']']
      j            - join with X                          ['[',10,333,']']
        ⁾|[        - list of characters                   ['|','[']
       j           - join                                 ['[','|','[',10,'|','[',333,'|','[',']']
           ṫ3      - tail from index three                ['[',10,'|','[',333,'|','[',']']
                 $ - last two links as a monad (f(X)):
              ”]   -   character                          ']'
                ṁ  -   mould like X                       [']',']'] (here 2 because X is 2 long)
             ;     - concatenate                          ['[',10,'|','[',333,'|','[',']',']',']']
                   - implicit (and smashing) print        [10|[333|[]]]

1

Java 10, 107 ไบต์

s->{var r="[]";for(var i:s.replaceAll("[\\[\\]]","").split(","))r="["+i+"|"+r+"]";return s.length()<3?s:r;}

ลองออนไลน์

คำอธิบาย:

s->{                       // Method with String as both parameter and return-type
  var r="[]";              //  Result-String, starting at "[]"
  for(var i:s.replaceAll("[\\[\\]]","") 
                           //  Removing trailing "[" and leading "]"
             .split(","))  //  Loop over the items
    r="["+i+"|"+r+"]";     //   Create the result-String `r`
  return s.length()<3?     //  If the input was "[]"
          s                //   Return the input as result
         :                 //  Else:
          r;}              //   Return `r` as result

1

ML มาตรฐาน 71 ไบต์

fun p[_]="]|[]]"|p(#","::r)="|["^p r^"]"|p(d::r)=str d^p r;p o explode;

ลองออนไลน์! ใช้รูปแบบที่ไม่มีช่องว่าง เช่นอัตราผลตอบแทนit "[10,333,4]""[10|[333|[4]|[]]]]"

ungolfed

fun p [_]       = "]|[]]"          (* if there is only one char left we are at the end *)
  | p (#","::r) = "|[" ^ p r ^ "]" (* a ',' in the input is replaced by "|[" and an closing "]" is added to the end *)
  | p (d::r)    = str d ^ p r      (* all other chars (the digits and the initial '[') are converted to a string and concatenated to recursive result *)

val f = p o explode  (* convert string into list of chars and apply function p *)

ลองออนไลน์!


1

R , 140 136 ไบต์

ลดลง 4 ไบต์ตามคำแนะนำเสียงของ Giuseppe

function(l,x=unlist(strsplit(substr(l,2,nchar(l)-1),", ")))paste(c("[",paste0(c(x,"]"),collapse=" | ["),rep("]",length(x))),collapse="")

ลองออนไลน์!


substrสั้นลงและอันแรกpaste0สามารถpasteรับได้ถึง 136 ไบต์
Giuseppe

1
ใช้eval, parseและ, และsubแทนunlist, strsplitและsubstr, ฉันจัดการได้เพียง 136 ไบต์เท่านั้น (ฉันคิดว่ามันอาจจะสั้นกว่านี้ แต่มันไม่ใช่)
Giuseppe

@Giuseppe ขอบคุณสำหรับ -4 ไบต์! ฉันหวังว่าเราจะมีบางสิ่งที่สั้นกว่านี้ วิธีแก้ปัญหาแบบเรียกซ้ำอาจ?
JayCe

1

R , 108 ไบต์

function(l)Reduce(function(x,y)paste0("[",x,"|",y,"]"),eval(parse(t=sub("]",")",sub("\\[","c(",l)))),"[]",T)

ลองออนไลน์!

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




0

sed + -E, 46 ไบต์

:
s/\[([0-9]+)(, ?([^]]*)|())\]/[\1 | [\3]]/
t

แนวทางที่ค่อนข้างตรงไปตรงมา บรรทัดที่สองจะใช้เวลาและการเปลี่ยนแปลงไป[\d+, ...] [\d | [...]]บรรทัดที่สามกระโดดกลับไปที่บรรทัดแรกหากการทดแทนสำเร็จ การทดแทนจะทำซ้ำจนกว่าจะล้มเหลวจากนั้นโปรแกรมจะสิ้นสุดลง ทำงานด้วยsed -E -f filename.sedผ่านการป้อนข้อมูลผ่าน stdin


0

สีแดง 110 ไบต์

func[s][if s ="[]"[return s]replace append/dup replace/all b: copy s",""|[""]"(length? b)- length? s"]""|[]]"]

ลองออนไลน์!

คำอธิบายของเวอร์ชันที่ไม่ได้ปรับแต่ง:

f: func[s][                      
    if s = "[]" [return s]                    ; if the list is empty, return it    
    b: copy s                                 ; save a copy of the input in b 
    replace/all b "," "|["                    ; replace every "," with "|["  
    append/dup b "]" (length? b) - length? s  ; append as many "]" as there were ","
    replace b "]" "|[]]"                      ; replace the first "]" with "|[]]"     
]                                             ; the last value is returned implicitly

สีแดงอ่านง่ายมากฉันสงสัยว่าฉันต้องการเพิ่มความคิดเห็นข้างต้น :)


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