İksir Dizi Syntactic Şeker


17

Elixir olarak, (bağlantılı) listelerini biçimindeki baş herhangi bir şey olabilir ve kuyruk listesinin kalanı listesidir ve boş liste - - Bunun tek istisnası.[head | tail][]

Listeler aynı şekilde yazılabilir [1, 2, 3].[1 | [2 | [3 | []]]]

Göreviniz bir listeyi açıklandığı gibi dönüştürmektir. Giriş her zaman yalnızca normal ifadeyle eşleşen sayıları içeren geçerli bir liste (İksir'de) olacaktır \[(\d+(, ?\d+)*)?\]. Girdiyi (her virgülden sonra bir boşluk) veya boşluk olmadan alabilirsiniz. Çıktı (her birinden önce ve sonra bir boşluk |) veya boşluksuz olabilir.

Başında sıfır olan girişler için sıfır olmadan veya ile çıkış yapabilirsiniz.

Giriş, çıktı gibi bir dize (bir işlev yazıyorsa) olarak alınmalıdır.

Örnekler

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

ilgili , yinelenen değil çünkü bu kısmen ]sonuna mod eklemeyi içerir . Ek olarak, burada Haskell cevabı oradakinden oldukça farklı.


5
Benden -1. Hantal IO formatları önerilmez. Girdi bir liste ise, kodumuzun% 90'ını girdiyi ayrıştırmak yerine bir liste olarak alalım
Jo King

2
Baştaki 0'ları desteklememiz gerekiyor mu? Normal ifadeye uyuyorlar.
Jo King


5
@JoKing Burada zorluğun kendisinin iki belirli format arasında dönüştürme yapmak olduğunu iddia ediyorum, bu yüzden girdiyi ayrıştırmak zorluğun temel bir parçası ve ekstra bir şey değil. PS Sadece takma adınızın gerçekten xD olduğunu anladım
Leo

2
@MuhammadSalman: meydan okuma "ayrıştırma" olarak etiketlendiğinden, bir dizeden / dizeye dönüştürmek niyetin önemli bir parçasıdır.
nimi

Yanıtlar:


9

Haskell, 50 bayt

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

Çevrimiçi deneyin!

+0Sayılardan oluşan listeleri ile ilgileniyor olduğunu Haskell tipi denetleyicisi bildirir, böylece readbizim için giriş dizesini ayrıştırmak olacaktır.


1
+1, +0 numarayı seviyorum!
B. Mehta



4

Retina , 39 33 32 20 bayt

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

H.PWiz, ovs, yalnızca ASCII ve Neil sayesinde 13 bayt tasarruf etti.
Çevrimiçi deneyin!

açıklama

\b]
,]

Boş bir listemiz yoksa, bir virgül ekleyin.

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

Virgül varken, şeyleri sarın |[ thing ].




@ ASCII sadece sen değiştirerek başka 4 bayt kaydedebilirsiniz \b]ile ,]. (Aksi takdirde aynı çözümü bağımsız olarak keşfettim.)
Neil

Evet bu doğru. Herhangi bir \bnedenden dolayı unuttum > _> 20 bayt @Mnemonic
ASCII-sadece

4

Perl 5 -pl , 31 28 bayt

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

Çevrimiçi deneyin!

Nasıl?

-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

Try it online!

I have never used Elixir before. Defines a function that takes a string and a reference to itself and returns a string.


3

Ceylon, 113 bytes

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

Try it online!

Here is it written out:

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

Try it online!

As noted by ovs in a (now deleted) comment: If one select the "without spaces" options for input and output indicated in the question, one can safe 3 more bytes (the obvious ones with spaces in them).

If we don't need to parse the input, but just could get a sequence as input, it gets much shorter (69 bytes).

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

Try it online!



2

SNOBOL4 (CSNOBOL4), 114 bytes

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

Try it 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

2

Stax, 19 bytes

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

Run and debug it

My first Stax post, so probably not optimal.

Unpacked and commented:

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

Run and debug this one



2

Befunge-98 (PyFunge), 22 21 bytes

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

Try it online!

If there weren't weird restrictions on output, we could do this in 18:

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

Fun fact, this is technically a program that does nothing in Python.



2

R, 84 71 69 bytes

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

Try it online!

  • -15 bytes thanks to @KirillL.

1
71 bytes with a single substitution based on my Ruby answer.
Kirill L.

@KirillL. : thanks, I was sure there was a shorter regex to do that, but I always mess up with lookarounds :D
digEmAll

-2 more, I totally forgot about a shorter \K lookbehind
Kirill L.




1

Jelly, 18 bytes

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

A full program printing the result (as a monadic link it accepts a list of characters but returns a list of characters and integers).

Try it online!

How?

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

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

Try it online.

Explanation:

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

Standard ML, 71 bytes

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

Try it online! Uses the format without spaces. E.g. it "[10,333,4]" yields "[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 *)

Try it online!


1

R, 140 136 bytes

Down 4 bytes as per Giuseppe's sound advice.

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

Try it online!


substr is shorter and the first paste0 can be paste to get this to 136 bytes.
Giuseppe

1
Using eval, parse, and sub instead of unlist, strsplit and substr, I also only managed 136 bytes (I thought it might be shorter but it wasn't)
Giuseppe

@Giuseppe Thanks for the -4 bytes! I wish we had something shorter. Recursive solution maybe?
JayCe



0

sed + -E, 46 bytes

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

A fairly straightforward approach. The second line takes [\d+, ...] and changes it to [\d | [...]]. The third line jumps back to the first line, if the substitution was successful. The substitution repeats until it fails and then the program terminates. Run with sed -E -f filename.sed, passing input via stdin.


0

Red, 110 bytes

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

Try it online!

Explanation of the ungolfed version:

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

Red is so easily readable, that I doubt I needed adding the above comments :)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.