Elixir Array Cú pháp đường


17

Trong Elixir, các danh sách (được liên kết) có định dạng [head | tail]trong đó phần đầu có thể là bất cứ thứ gì và đuôi là danh sách của phần còn lại của danh sách, và []- danh sách trống - là ngoại lệ duy nhất cho điều này.

Danh sách cũng có thể được viết như thế [1, 2, 3]tương đương với[1 | [2 | [3 | []]]]

Nhiệm vụ của bạn là chuyển đổi một danh sách như mô tả. Đầu vào sẽ luôn là một danh sách hợp lệ (trong Elixir) chỉ chứa các số khớp với biểu thức chính quy \[(\d+(, ?\d+)*)?\]. Bạn có thể lấy đầu vào có (một dấu cách sau mỗi dấu phẩy) hoặc không có dấu cách. Đầu ra có thể có (một |khoảng trắng trước và sau mỗi khoảng trống) hoặc không có khoảng trắng.

Đối với các đầu vào có số 0 đứng đầu, bạn có thể xuất ra mà không có số không hoặc có.

Đầu vào phải được lấy dưới dạng một chuỗi (nếu viết hàm), cũng như đầu ra.

Ví dụ

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

liên quan , không phải là một bản sao vì điều này một phần liên quan đến việc thêm chế độ ]vào cuối. Ngoài ra, câu trả lời của Haskell ở đây khá khác với câu trả lời ở đó.


5
-1 từ tôi. Các định dạng IO cồng kềnh không được khuyến khích. Nếu đầu vào là một danh sách, chúng ta hãy lấy nó làm danh sách thay vì có 90% mã của chúng tôi chỉ phân tích cú pháp đầu vào
Jo King

2
Chúng tôi có phải hỗ trợ 0 hàng đầu không? Họ phù hợp với regex.
Jo King

2
Bản sao có thể có của Cú pháp không đường
NoOneIsĐây là

5
@JoKing Tôi cho rằng ở đây thách thức là về việc chuyển đổi giữa hai định dạng cụ thể, vì vậy phân tích cú pháp đầu vào là một phần cơ bản của thử thách và không phải là thứ gì đó thêm vào. PS Tôi mới nhận ra biệt danh của bạn thực sự là xD
Leo

2
@MuhammadSalman: thử thách được gắn thẻ là "phân tích cú pháp", do đó, chuyển đổi từ / thành chuỗi là một phần đáng kể của nó với ý định.
nimi

Câu trả lời:


9

Haskell, 50 byte

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

Hãy thử trực tuyến!

Các +0phép các Haskell loại kiểm tra bí quyết mà chúng ta đang đối phó với danh sách các số, vì vậy readsẽ phân tích chuỗi đầu vào cho chúng tôi.


1
+1, tôi thích thủ thuật +0!
B. Mehta



4

Võng mạc , 39 33 32 20 byte

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

Đã lưu 13 byte nhờ H.PWiz, ovs, chỉ ASCII và Neil.
Hãy thử trực tuyến!

Giải trình

\b]
,]

Nếu chúng ta không có một danh sách trống, hãy thêm dấu phẩy.

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

Trong khi có dấu phẩy, bọc mọi thứ với |[ thing ].




Chỉ có ASCII Bạn có thể lưu thêm 4 byte bằng cách thay thế \b]bằng ,]. (Nếu không, tôi đã độc lập phát hiện ra giải pháp tương tự.)
Neil

Ồ, đúng rồi đấy. Tôi quên \blà một điều vì một số lý do> _> 20 byte @Mnemonic
ASCII chỉ

4

Perl 5 -pl , 31 28 byte

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

Hãy thử trực tuyến!

Làm sao?

-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

Thuốc tiên , 111 85 byte

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

Hãy thử trực tuyến!

Tôi chưa bao giờ sử dụng Elixir trước đây. Xác định một hàm lấy một chuỗi và một tham chiếu đến chính nó và trả về một chuỗi.


3

Ceylon , 113 byte

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

Hãy thử trực tuyến!

Đây là nó được viết ra:

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

Hãy thử trực tuyến!

Như đã lưu ý bởi các ovs trong một bình luận (hiện đã bị xóa): Nếu một người chọn các tùy chọn "không có khoảng trắng" cho đầu vào và đầu ra được chỉ định trong câu hỏi, người ta có thể bảo vệ thêm 3 byte (những byte rõ ràng có khoảng trắng trong đó).

Nếu chúng ta không cần phân tích cú pháp đầu vào, nhưng chỉ có thể lấy một chuỗi làm đầu vào, nó sẽ ngắn hơn nhiều (69 byte).

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

Hãy thử trực tuyến!



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

Hãy thử trực tuyến!

	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 byte

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

Chạy và gỡ lỗi nó

Bài Stax đầu tiên của tôi, vì vậy có lẽ không tối ưu.

Giải nén và bình luận:

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

Chạy và gỡ lỗi cái này



2

Befunge-98 (PyFunge) , 22 21 byte

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

Hãy thử trực tuyến!

Nếu có những hạn chế kỳ lạ về đầu ra, chúng ta có thể làm điều này trong 18:

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

Thực tế thú vị, đây về mặt kỹ thuật là một chương trình không có gì trong Python.



2

R , 84 71 69 byte

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

Hãy thử trực tuyến!

  • -15 byte nhờ @KirillL.

1
71 byte với một sự thay thế duy nhất dựa trên câu trả lời Ruby của tôi.
Kirill L.

@KirillL. : cảm ơn, tôi chắc chắn đã có một regex ngắn hơn để làm điều đó, nhưng tôi luôn rối tung với những cái nhìn: D
digEmAll

-2 hơn , tôi hoàn toàn quên về một ngắn hơn \Klookbehind
Kirill L.




1

Thạch , 18 byte

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

Một chương trình đầy đủ in kết quả (dưới dạng liên kết đơn, nó chấp nhận danh sách các ký tự nhưng trả về danh sách các ký tự và số nguyên).

Hãy thử trực tuyến!

Làm sao?

Œ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 byte

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

Hãy thử trực tuyến.

Giải trình:

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 chuẩn , 71 byte

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

Hãy thử trực tuyến! Sử dụng định dạng không có khoảng trắng. Ví dụ it "[10,333,4]"sản lượng "[10|[333|[4]|[]]]]".

vô dụng

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 *)

Hãy thử trực tuyến!


1

R , 140 136 byte

Giảm 4 byte theo lời khuyên âm thanh của Giuseppe.

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

Hãy thử trực tuyến!


substrlà ngắn hơn và đầu tiên paste0có thể là pasteđể có được điều này đến 136 byte.
Giuseppe

1
Sử dụng eval, parsesubthay vì unlist, strsplitsubstr, tôi cũng chỉ quản lý 136 byte (tôi nghĩ nó có thể ngắn hơn nhưng không phải vậy)
Giuseppe

@Giuseppe Cảm ơn vì -4 byte! Tôi ước chúng tôi có một cái gì đó ngắn hơn. Giải pháp đệ quy có thể?
JayCe



0

sed + -E, 46 byte

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

Một cách tiếp cận khá đơn giản. Dòng thứ hai lấy [\d+, ...]và thay đổi nó thành [\d | [...]]. Dòng thứ ba nhảy trở lại dòng đầu tiên, nếu sự thay thế thành công. Sự thay thế lặp lại cho đến khi nó thất bại và sau đó chương trình kết thúc. Chạy với sed -E -f filename.sed, chuyển đầu vào qua stdin.


0

Đỏ , 110 byte

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

Hãy thử trực tuyến!

Giải thích về phiên bản vô văn hóa:

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

Màu đỏ rất dễ đọc, đến nỗi tôi nghi ngờ tôi cần thêm các ý kiến ​​trên :)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.