Eliksir Array Syntactic Sugar

17

W Elixir listy (połączone) mają format, w [head | tail]którym nagłówek może być dowolny, a tail jest listą reszty listy, a []- pusta lista - jest jedynym wyjątkiem.

Listy można również pisać tak, jak [1, 2, 3]to jest równoważne[1 | [2 | [3 | []]]]

Twoim zadaniem jest konwersja listy zgodnie z opisem. Dane wejściowe zawsze będą prawidłową listą (w eliksirach) zawierającą tylko liczby pasujące do wyrażenia regularnego \[(\d+(, ?\d+)*)?\]. Możesz wprowadzić dane za pomocą (po jednym spacji po każdym przecinku) lub bez spacji. Wyjście może być ze (jedna spacja przed i po każdej |) lub bez spacji.

W przypadku danych wejściowych z zerami wiodącymi można wyprowadzać dane bez zer lub z.

Dane wejściowe należy traktować jako ciąg znaków (w przypadku pisania funkcji), podobnie jak dane wyjściowe.

Przykłady

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

powiązane , a nie duplikat, ponieważ częściowo wiąże się to z dodaniem trybu ]do końca. Dodatkowo, odpowiedź Haskella tutaj jest zupełnie inna niż tam.

Okx
źródło
5
-1 ode mnie. Uciążliweuciążliwe formaty IO . Jeśli dane wejściowe są listami, weźmy je jako listę zamiast 90% naszego kodu po prostu analizuje dane wejściowe
Jo King
2
Czy musimy wspierać wiodące zera? Pasują do wyrażenia regularnego.
Jo King
2
Możliwy duplikat składni bez cukru
NoOneIsHere
5
@JoKing Twierdzę, że tutaj samo wyzwanie polega na konwersji między dwoma konkretnymi formatami, więc analiza danych wejściowych jest podstawową częścią wyzwania, a nie czymś dodatkowym. PS Dopiero teraz zrozumiałem, jak naprawdę nazywasz się xD
Leo
2
@MuhammadSalman: wyzwanie jest oznaczone jako „parsowanie”, więc konwersja z / do łańcucha stanowi znaczną jego część z zamiarem.
nimi

Odpowiedzi:

9

Haskell, 50 bajtów

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

Wypróbuj online!

+0Pozwala na typ sprawdzania Haskell wiedzieć, że mamy do czynienia z listy numerów, więc readbędzie analizować ciąg wejściowy dla nas.

nimi
źródło
1
+1, uwielbiam sztuczkę +0!
B. Mehta
5

Python 2 , 50 bajtów

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

Wypróbuj online!

ovs
źródło
1
Taki piękny; -;
Neil
4

JavaScript (ES6), 50 bajtów

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

Wypróbuj online!


Wersja rekurencyjna, 51 bajtów

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

Wypróbuj online!

Arnauld
źródło
4

Retina , 39 33 32 20 bajtów

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

Oszczędność 13 bajtów dzięki H.PWiz, ovs, tylko ASCII i Neil.
Wypróbuj online!

Wyjaśnienie

\b]
,]

Jeśli nie mamy pustej listy, dodaj przecinek końcowy.

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

Podczas gdy są przecinki, owiń je |[ thing ].


źródło
@ovs 24?
Tylko ASCII,
również 24?
Tylko ASCII,
@ Tylko ASCII Możesz zapisać kolejne 4 bajty, zastępując \b]je ,]. (W przeciwnym razie samodzielnie odkryłem to samo rozwiązanie).
Neil
Och, właśnie tak. Z \bjakiegoś powodu zapomniałem coś> _> 20 bajtów @Mememonic
tylko ASCII
4

Perl 5 -pl , 31 28 bajtów

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

Wypróbuj online!

W jaki sposób?

-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
źródło
3

Eliksir , 111 85 bajtów

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

Wypróbuj online!

Nigdy wcześniej nie korzystałem z Elixiru. Definiuje funkcję, która pobiera ciąg i odwołanie do siebie i zwraca ciąg.

Jo King
źródło
3

Cejlon , 113 bajtów

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

Wypróbuj online!

Oto napisane:

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

Wypróbuj online!

Jak zauważyli ovs w (teraz usuniętym) komentarzu: Jeśli wybierzesz opcje „bez spacji” dla danych wejściowych i wyjściowych wskazanych w pytaniu, możesz zabezpieczyć jeszcze 3 bajty (te oczywiste ze spacjami w nich).

Jeśli nie musimy analizować danych wejściowych, ale możemy po prostu pobrać sekwencję jako dane wejściowe, jest ona znacznie krótsza (69 bajtów).

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

Wypróbuj online!

Paŭlo Ebermann
źródło
2

Python 3 , 65 bajtów

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

Wypróbuj online!

Jeśli wejściem może być zamiast tego lista, to:

Python 3 , 53 bajty

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

Wypróbuj online!

Pan Xcoder
źródło
2

SNOBOL4 (CSNOBOL4) , 114 bajtów

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

Wypróbuj 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
źródło
2

Stax , 19 bajtów

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

Uruchom i debuguj

Mój pierwszy post na Stax, więc prawdopodobnie nie jest optymalny.

Rozpakowano i skomentowano:

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

Uruchom i debuguj ten

pustkowie
źródło
2

Befunge-98 (PyFunge) , 22 21 bajtów

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

Wypróbuj online!

Gdyby nie było dziwnych ograniczeń produkcji, moglibyśmy to zrobić w 18:

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

Zabawne jest to, że technicznie jest to program, który nic nie robi w Pythonie.

Jo King
źródło
2

R , 84 71 69 bajtów

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

Wypróbuj online!

  • -15 bajtów dzięki @KirillL.
digEmAll
źródło
1
71 bajtów z pojedynczym podstawieniem w oparciu o moją odpowiedź Ruby.
Kirill L.
@KirillL. : dzięki, byłem pewien, że było to krótsze wyrażenie regularne, ale zawsze popsułem sobie spojrzenia: D
digEmAll
-2 więcej , zupełnie zapomniałem o krótszym \Kspojrzeniu z tyłu
Kirill L.
1

Galaretka , 19 bajtów

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

Wypróbuj online!

Nierekurencyjna alternatywa dla rozwiązania Erika .

Pan Xcoder
źródło
1

Galaretka , 18 bajtów

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

Pełny program wypisujący wynik (jako monadyczny link przyjmuje listę znaków, ale zwraca listę znaków i liczb całkowitych).

Wypróbuj online!

W jaki sposób?

Œ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
źródło
1

Java 10, 107 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
1

Standardowy ML , 71 bajtów

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

Wypróbuj online! Używa formatu bez spacji. Np . it "[10,333,4]"Plony "[10|[333|[4]|[]]]]".

bez golfa

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

Wypróbuj online!

Laikoni
źródło
1

R , 140 136 bajtów

Zmniejsz o 4 bajty zgodnie z dobrą radą Giuseppe.

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

Wypróbuj online!

JayCe
źródło
substrjest krótszy i pierwszym paste0może być pasteuzyskanie go do 136 bajtów.
Giuseppe,
1
Korzystanie eval, parsei subzamiast unlist, strsplita substr, ja też tylko udało 136 bajtów (myślałem, że może on być krótszy, ale to nie było)
Giuseppe
@Giuseppe Dzięki za -4 bajty! Chciałbym mieć coś krótszego. Być może rozwiązanie rekurencyjne?
JayCe
1

R , 108 bajtów

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

Wypróbuj online!

Prawie rok zajęło znalezienie lepszego rozwiązania R niż poprzednie ... powinien wiedzieć, Reduceże to będzie odpowiedź! Wyjścia bez spacji, dane wejściowe mogą być ze spacjami lub bez.

Giuseppe
źródło
0

sed + -E, 46 bajtów

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

Dość proste podejście. Druga linia przyjmuje [\d+, ...]i zmienia na [\d | [...]]. Trzecia linia przeskakuje z powrotem do pierwszej linii, jeśli zmiana zakończyła się powodzeniem. Podstawienie powtarza się aż do niepowodzenia, a następnie program kończy się. Uruchom z sed -E -f filename.sed, przekazując dane wejściowe przez stdin.

Silvio Mayolo
źródło
0

Czerwony , 110 bajtów

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

Wypróbuj online!

Objaśnienie wersji bez golfa:

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

Czerwony jest tak łatwo czytelny, że wątpię, czy potrzebowałem dodać powyższe komentarze :)

Galen Iwanow
źródło