Elixir Array構文糖


17

Elixirでは、(リンクされた)リストは、headは何でもよく、tailはリストの残りのリストの形式[head | tail]であり、空のリストはこの唯一の例外です。[]

リストは次のようにも書くことができる[1, 2, 3]と同等です[1 | [2 | [3 | []]]]

あなたの仕事は、説明されているようにリストを変換することです。入力は常に、正規表現に一致する数字のみを含む有効なリスト(Elixir内)になり\[(\d+(, ?\d+)*)?\]ます。(各コンマの後にスペースが1つ)またはスペースなしで入力を行うことができます。出力は、(それぞれの前後にスペースが1つ|)あり、またはスペースなしです。

先行ゼロのある入力の場合、ゼロなしで出力することも、出力することもできます。

入力は、出力と同様、文字列として取得する必要があります(関数を記述する場合)。

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

related、これは部分的にモード]を最後に追加する必要があるため、複製ではありません。さらに、ここでのHaskellの答えはそこの答えとはまったく異なります。


5
私から-1。面倒なIOフォーマットは推奨されません。入力がリストの場合、単に入力を解析し、私たちが代わりに我々のコードの90%を持っていることのリストとしてそれを見てみましょう
ジョー・キング

2
先行0をサポートする必要がありますか?それらは正規表現に適合します。
ジョーキング


5
@JoKingここで、チャレンジ自体は2つの特定の形式間で変換することであると主張します。そのため、入力の解析はチャレンジの基本的な部分であり、追加されるものではありません。PSあなたのあだ名が本当にxDであることに今私は気づきました
レオ

2
@MuhammadSalman:チャレンジは「構文解析」としてタグ付けされているため、文字列から/への変換は意図的に重要な部分です。
nimi

回答:


9

Haskell、50バイト

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

オンラインでお試しください!

+0、Haskell型チェッカーに、数値のリストを処理していることを知らせるためread、入力文字列を解析します。


1
+ 1、+ 0トリックが大好き!
B.



4

網膜39 33 32 20バイト

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

H.PWiz、ovs、ASCIIのみ、Neilのおかげで13バイト節約されました。
オンラインでお試しください!

説明

\b]
,]

空のリストがない場合は、末尾にコンマを追加します。

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

コンマがありますが、で囲みます|[ thing ]




ASCIIのみ@あなたは置き換えることで、別の4つのバイトを保存することができ\b],]。(そうでなければ、私は独立して同じ解決策を発見しました。)
ニール

ああ、そうです。私は忘れてしまった\bいくつかの理由でのものだった> _> 20バイトを @Mnemonicを
ASCIIのみの

4

Perl 5の -pl31の 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

セイロン、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

R84 71 69バイト

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

オンラインでお試しください!

  • @KirillLのおかげで-15バイト。

1
Rubyの回答に基づく単一の置換で71バイト
キリルL.

@KirillL。:おかげで、私は確かにそれを行うための短い正規表現があったが、前後参照して、私はいつも台無し:D
digEmAll

-2さらに、私は短い\K後読みを完全に忘れていました-17
キリルL.




1

ゼリー、18 バイト

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

結果を出力する完全なプログラム(モナドリンクとして、文字のリストを受け入れますが、文字と整数のリストを返します)。

オンラインでお試しください!

どうやって?

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

食べない

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

R140 136バイト

ジュゼッペの適切なアドバイスによると、4バイトダウン。

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

オンラインでお試しください!


substrが短くなり、最初paste0pasteこれを136バイトにすることです。
ジュゼッペ

1
使用してevalparsesubの代わりにunliststrsplitsubstr、私はまた、唯一の136バイト(私はそれは短いかもしれないと思ったが、それはありませんでした)管理
ジュゼッペ

@Giuseppe -4バイトありがとう!もっと短いものがあればいいのに。再帰的な解決策でしょうか?
JayCe

1

R、108バイト

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

オンラインでお試しください!

以前よりも優れたRソリューションを見つけるのにほぼ1年かかりました... Reduce答えがわかっているはずです!スペースのない出力、入力はスペースの有無にかかわらず可能です。




0

sed + -E、46バイト

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

かなり簡単なアプローチ。2行目は[\d+, ...]、それを取得して変更し[\d | [...]]ます。置換が成功した場合、3行目は最初の行に戻ります。置換は失敗するまで繰り返され、プログラムは終了します。で実行し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.