Gula Sintaksis Array Elixir

17

Dalam Elixir, daftar (ditautkan) berada dalam format di [head | tail]mana head bisa berupa apa saja dan ekor adalah daftar dari sisa daftar, dan []- daftar kosong - adalah satu-satunya pengecualian untuk ini.

Daftar juga dapat ditulis seperti [1, 2, 3]yang setara dengan[1 | [2 | [3 | []]]]

Tugas Anda adalah mengonversi daftar seperti yang dijelaskan. Input akan selalu menjadi daftar yang valid (di Elixir) yang hanya berisi angka yang cocok dengan regex \[(\d+(, ?\d+)*)?\]. Anda dapat mengambil input dengan (satu spasi setelah setiap koma) atau tanpa spasi. Output mungkin dengan (satu spasi sebelum dan sesudah masing-masing |) atau tanpa spasi.

Untuk input dengan angka nol di depan, Anda dapat membuat output tanpa angka nol atau dengan.

Input harus diambil sebagai string (jika menulis fungsi), seperti halnya output.

Contohnya

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

terkait , bukan duplikat karena ini sebagian melibatkan penambahan mode ]ke akhir. Selain itu, jawaban Haskell di sini sangat berbeda dengan yang ada di sana.

Okx
sumber
5
-1 dari saya. Format IO yang rumit tidak disarankan. Jika input adalah daftar, mari kita ambil sebagai daftar alih-alih memiliki 90% dari kode kita hanya menguraikan input
Jo King
2
Apakah kita harus mendukung 0s terkemuka? Mereka cocok dengan regex.
Jo King
2
Kemungkinan duplikat dari Sintaks Bebas Gula
NoOneIsHere
5
@JoKing Saya berpendapat bahwa di sini tantangannya adalah tentang mengkonversi antara dua format tertentu, jadi mengurai input adalah bagian mendasar dari tantangan dan bukan sesuatu yang ditambahkan ke dalamnya. PS Saya baru menyadari sekarang apa nama panggilan Anda sebenarnya xD
Leo
2
@MuhammadSalman: tantangan ditandai sebagai "parsing", jadi mengubah dari / ke string adalah bagian penting dari itu dengan niat.
nimi

Jawaban:

9

Haskell, 50 byte

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

Cobalah online!

The +0memungkinkan Haskell jenis checker tahu bahwa kita berhadapan dengan daftar nomor, sehingga readakan mengurai input string untuk kita.

nimi
sumber
1
+1, saya suka trik +0!
B. Mehta
5

Python 2 , 50 byte

r='%s'
for x in input():r%='[%s|%%s]'%x
print r%[]

Cobalah online!

ovs
sumber
1
Sangat cantik ;-;
Neil
4

JavaScript (ES6), 50 byte

s=>eval(s).map(v=>`[${p+=']',v}|`,p='[]').join``+p

Cobalah online!


Versi rekursif, 51 byte

f=(s,[v,...a]=eval(s))=>1/v?`[${v}|${f(s,a)}]`:'[]'

Cobalah online!

Arnauld
sumber
4

Retina , 39 33 32 20 byte

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

Disimpan 13 byte berkat H.PWiz, ovs, ASCII-only, dan Neil.
Cobalah online!

Penjelasan

\b]
,]

Jika kami tidak memiliki daftar kosong, tambahkan tanda koma.

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

Meskipun ada koma, bungkus dengan |[ thing ].


sumber
@ovs 24?
ASCII
juga 24?
ASCII
@ ASCII-satunya Anda dapat menyimpan lain 4 byte dengan mengganti \b]dengan ,]. (Kalau tidak, saya secara independen telah menemukan solusi yang sama.)
Neil
Oh itu benar. Saya lupa \bsesuatu karena suatu alasan> _> 20 byte @Mnemonic
ASCII-only
4

Perl 5 -pl , 31 28 byte

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

Cobalah online!

Bagaimana?

-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 "|["
Xcali
sumber
3

Elixir , 111 85 byte

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

Cobalah online!

Saya belum pernah menggunakan Elixir sebelumnya. Menentukan fungsi yang mengambil string dan referensi ke dirinya sendiri dan mengembalikan string.

Jo King
sumber
3

Ceylon , 113 byte

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

Cobalah online!

Ini dia:

// 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

Cobalah online!

Seperti dicatat oleh ovs dalam komentar (sekarang dihapus): Jika seseorang memilih opsi "tanpa spasi" untuk input dan output yang ditunjukkan dalam pertanyaan, seseorang dapat menyimpan 3 byte lebih (yang jelas dengan spasi di dalamnya).

Jika kita tidak perlu mem-parsing input, tetapi hanya bisa mendapatkan urutan sebagai input, itu akan menjadi jauh lebih pendek (69 byte).

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

Cobalah online!

Paŭlo Ebermann
sumber
2

Python 3 , 65 byte

lambda k:"["+''.join(f"{u}|["for u in eval(k))+-~len(eval(k))*"]"

Cobalah online!

Jika inputnya bisa berupa daftar, maka:

Python 3 , 53 byte

lambda k:"["+''.join(f"{u}|["for u in k)+-~len(k)*"]"

Cobalah online!

Tuan Xcoder
sumber
2

SNOBOL4 (CSNOBOL4) , 114 byte

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

Cobalah online!

	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
Giuseppe
sumber
2

Stax , 19 byte

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

Jalankan dan debug itu

Posting Stax pertama saya, jadi mungkin tidak optimal.

Dibongkar dan dikomentari:

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 "]"

Jalankan dan debug yang ini

wastl
sumber
2

Befunge-98 (PyFunge) , 22 21 byte

'[,1;@j,]';#$&." |",,

Cobalah online!

Jika tidak ada batasan aneh pada output, kita bisa melakukan ini dalam 18:

'[,1;@j,]';#$&.'|,

Fakta menyenangkan, ini secara teknis adalah program yang tidak melakukan apa pun dengan Python.

Jo King
sumber
2

R , 84 71 69 byte

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

Cobalah online!

  • -15 byte terima kasih kepada @ KirillL.
menggali semua
sumber
1
71 byte dengan substitusi tunggal berdasarkan pada jawaban Ruby saya.
Kirill L.
@ KirillL. : terima kasih, saya yakin ada regex yang lebih pendek untuk melakukan itu, tapi saya selalu mengacaukan lookaround: D
digEmAll
-2 lebih , saya benar-benar lupa tentang lebih pendek \Klookbehind
Kirill L.
1

Jelly , 19 byte

ŒV©;€⁾|[”[;µ®L‘”]ẋṭ

Cobalah online!

Alternatif non-rekursif untuk solusi Erik .

Tuan Xcoder
sumber
1

Jelly , 18 byte

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

Program lengkap mencetak hasilnya (sebagai tautan monadik, ia menerima daftar karakter tetapi mengembalikan daftar karakter dan bilangan bulat).

Cobalah online!

Bagaimana?

Œ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|[]]]
Jonathan Allan
sumber
1

Java 10, 107 byte

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

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
1

Standar ML , 71 byte

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

Cobalah online! Menggunakan format tanpa spasi. Misalnya it "[10,333,4]"hasil "[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 *)

Cobalah online!

Laikoni
sumber
1

R , 140 136 byte

Turun 4 byte sesuai saran suara Giuseppe.

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

Cobalah online!

JayCe
sumber
substrlebih pendek dan yang pertama paste0bisa pastemendapatkan ini hingga 136 byte.
Giuseppe
1
Menggunakan eval,, parsedan subbukannya unlist, strsplitdan substr, saya juga hanya mengelola 136 byte (saya pikir mungkin lebih pendek tapi tidak)
Giuseppe
@Giuseppe Terima kasih atas -4 byte! Saya berharap kami memiliki sesuatu yang lebih pendek. Solusi rekursif mungkin?
JayCe
1

R , 108 byte

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

Cobalah online!

Butuh waktu hampir setahun untuk menemukan solusi R yang lebih baik dari sebelumnya ... seharusnya tahu Reducejawabannya! Output tanpa spasi, input bisa dengan atau tanpa spasi.

Giuseppe
sumber
0

sed + -E, 46 byte

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

Pendekatan yang cukup mudah. Baris kedua mengambil [\d+, ...]dan mengubahnya ke[\d | [...]] . Baris ketiga melompat kembali ke baris pertama, jika penggantian berhasil. Substitusi berulang sampai gagal dan kemudian program berakhir. Jalankan dengan sed -E -f filename.sed, melewati input melalui stdin.

Silvio Mayolo
sumber
0

Merah , 110 byte

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

Cobalah online!

Penjelasan dari versi yang tidak diserami:

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

Merah sangat mudah dibaca, bahwa saya ragu saya perlu menambahkan komentar di atas :)

Galen Ivanov
sumber