シュガーフリー構文


55

Haskellでは、リスト表記法:

[a,b,c]

単なる構文上の砂糖です:

a:b:c:[]

そして、文字列表記法:

"abc"

単なる構文上の砂糖です:

['a','b','c']

これは、文字列が次のことを意味します。

"abc"

次と同じです:

'a':'b':'c':[]

仕事

文字列を指定すると、Haskellで構文が除去されたバージョンがどのようになるかを出力する必要があります。

ルール

  • 任意の有効な入力方法で文字列を受け取ります。入力文字列で:[]囲まれ'、で区切られたすべての文字で終わる文字列を出力する必要があります:。空の文字列が出力されます[]

  • エスケープが必要な文字('改行、タブなど)を受け取らず、入力が印刷可能なASCII範囲にあると想定できます。

  • これは、答えのバイト数を最小限に抑えることを目的とするです

テストケース

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

入力に非ASCII値が含まれることはありますか?エスケープが必要な文字に対する制限は、Haskellがどの文字をエスケープするかを知る必要があるか、リストが網羅的であると想定するかのいずれかです。
FryAmTheEggman

@FryAmTheEggman彼らはアスキーの範囲にあると仮定することができます
小麦ウィザード

7
@totallyhumanこれらは有効なHaskellでさえありません。多分そうだったとしても、そうではないのは間違いです。
小麦ウィザード

38
この質問は、代わりに「Diet Haskell」というタイトルにすることができます。
3月ホー

1
ノー@cairdcoinheringaahing、 "および'構文的に異なっています。
小麦ウィザード

回答:


85

Haskell、26バイト

(++"[]").((++":").show=<<)

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

説明:

非ポイントフリー表記で、のconcatMap代わりに使用すると=<<、これは

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

文字列を指定すると、ほとんどのHaskell型の文字列表現を返す関数を使用して、s各文字cを文字列にマッピングします。これらの文字列は連結され、最後に追加されます。"'c':"show[]

挑戦によって要求されてはいないがために、この答えでも、適切なエスケープで動作しますshow:それの世話をするf "'"利回りを"'\\'':[]"


25
ちょっと待って(++'[':']':[]).((++':':[]).show=<<)、いや、いや?
アダム

11
チャレンジにHaskellの回答がある場合、原則からそれを支持します。これは2倍になります。
ライアンライク

43

Haskell、33 28 26バイト

foldr((.(':':)).shows)"[]"

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

fold入力文字列に右から与えられたpointfree機能が始まります[]。関数は、charをHaskellのcharとして表示します。つまり'、a :を前に置いた後、結果で囲まれ、結果と連結されます。

編集:@ØrjanJohansenは2バイトを節約しました。ありがとう!


という意味だと思います(++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[])
アダム

1
:リストを作成するために使用するため、++両方が独自の優雅さを持っていますが、これは他のHaskellの答え(同じバイト数)よりも優れていると思います。
CAD97

4
これはかなり素晴らしいです。同じ言語で同じバイトカウントを持つ2つの別々のアプローチ。
Jアトキン



16

Common Lisp、50 42バイト

(format t"~{'~a':~}[]"(coerce(read)'list))

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

read関数を定義する代わりに使用することにより、@ coredumpのコメントのおかげで減少しました。


1
PPCGへようこそ!
マーティンエンダー

2
舌足らずの発音!本当に歓迎します:)
オリビエデュラック

@Renzoこんにちはレンゾ、匿名ラムダフォームを使って、少しそれを縮小、または単に読んで呼び出すこともできます(format t"~{'~a':~}[]"(coerce(read)'list))(いくつかの他の質問には厳しいWRTの入力と出力ですが、ここではこれで結構です)
コアダンプ

@coredump、ありがとう!、コードを更新しました。
レンゾ・


10

C、55 54 53バイト

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}

1
スペースを削除できますchar *h
チョイス

1
あなたは行うことができますputs("[]");いくつかのバイトを保存するために改行を出力する代わりに。
クリチキシリソス

再帰的s(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2

8

Pythonの341の 38 36バイト

ovsにより-2バイト

print(*map(repr,input()),[],sep=':')

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


おっと...それは忘れ*map存在する...
ミスターXcoder

私は、空で戸惑ったinput()それだけで、ラムダ@ことができたときに、過去20分(文字通り)のために、@。
ロッド


@WheatWizardああ、空の空の(改行なし)入力を使用していた
ロッド

あなたは置き換えることができ"[]"[]
OVS

8

05AB1E15 12 11 10バイト

carusocomputingで-3バイト
、Adnanで
-1バイト、Erik the Outgolferの天才的なアイデアで-1バイト

ʒ"'ÿ':"?},

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

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that

どうやら私はあなたを4秒倒しました;-)
デジタルトラウマ

1
@DigitalTrauma Your Answerは、Post Your Answerを押すと表示されました。
ライリー

1
3バイトの角括弧をプッシュする代わりに、グローバル配列を印刷できます。:あなたはまた、-3の合計、最終結果の12バイトのために別のバイトの節約のための文字列を補間することができますvy"'ÿ':"?}¯?
マジックタコ壺

@carusocomputingテストスイートでは常に文字列補間を使用しますが、実際のコードで使用するのを忘れています。ありがとう!
ライリー

@carusocomputing vy"'ÿ':"}¯Jは11で動作すると思っていましたがJ、その状況ではスタック全体ではなく、グローバル配列に参加します。
ライリー

8

R、51バイト

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

1
いい解決策!いくつかの方法でいくつかのバイトを節約し、これを本当に減らすことができます。 デフォルトのI / Oでは、匿名関数を返すだけでも、標準入力から入力を取得することもできます。標準入力の後者scan(,'')は、関数の代わりに使用するとはるかに短くなります。
ジュゼッペ

ありがたいことに、R(およびコードゴルフ!)を少し使ったばかりなので、まだ匿名関数を把握していません。スキャンは役に立つかもしれません!
tc

ああ、まあ、匿名関数は変数に割り当てないだけの関数なのでf<-、コードの先頭からドロップするだけです
ジュゼッペ

paste0(gsub( '(。)'、 "'\\ 1':"、scan(、 ""))、 '[]')は43です
Zahiro Mor

8

Pyth、14 10 8バイト

j\:a`MQY

これを試して!

@isaacgのおかげで-2バイト

最後に、ピスは何かが得意です。

説明

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacgありがとう!忘れてM、なぜ使わなかったのか分からないa。これで、他のすべてのソリューションよりも少なくとも2バイト短くなりました!
カールカストール



6

パイソン248の 46 44 37バイト

Rodのおかげで-2バイト。Wheat Wizardのおかげで-7バイト。

lambda s:':'.join(map(repr,s)+['[]'])

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



ああ、すっきり。ありがとう!
完全に人間の

1
lambda s:':'.join(map(repr,[*s,[]]))またはのように短い方lambda s:':'.join(map(repr,s))+":[]"
-xnor

@xnor 2番目の例は、空の場合には機能しないようです。(元の答えはそれに非常によく似ていましたが、空の文字列のケースをカバーするために多くを支払った)
小麦ウィザード


6

JavaScript(ES6)、36バイト

s=>s?`'${[...s].join`':'`}':[]`:"[]"

それを試してみてください

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>


5

ゼリー 11 10  8 バイト

Christianのおかげで-1バイト(連結;を削除し、代わりに暗黙的な印刷を利用します)

(空の文字列のエッジケースに対して固定-以前に完全なプログラム:0バイトŒṘ€j”:“:[]

-2 Outgolferエリックのおかげ(使用pの代わりに、;€以降は”:有効長さ1である;使用Ø[、それはの短縮形となっているので⁾[]

ŒṘ€p”:Ø[

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

結果を印刷する完全なプログラム(リンクとして文字のリストのリストを返します)。

...しかし、STDINを使用して保存する方法はありますか?

どうやって?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []

4

PHP、41バイト

<?=preg_filter("#.#","'$0':",$argn)."[]";

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


4バイト短縮:for(;~$c=$argn[$i++];)echo"'$c':"?>[]
user63956

@ user63956は、<?どのオプションを実行する必要があるのか​​を追加する必要はありませんか?私はupvotesとタイタスを取得すると言うでしょう独自のアプローチを作ることは、その間に何か似行っている
イェルクHülsermann

-Rフラグで動作します。タグはeval()、やなどの構造でも閉じることができますcreate_function()
-user63956

4

Perl 5、22バイト

19バイトのコード+ -pフラグ。

s/./'$&':/g;$\="[]"

または、同じバイト数の場合、s/./'$&':/g;s/$/[]/

かなり簡単:s/./'$&':/g各文字を引用符で囲み、:後に追加します。$\各印刷後に暗黙的に印刷されるため[]、final を出力するように設定します[]

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


4

Java(OpenJDK 8)86 83 76バイト

@KevinCruijssenのおかげで-3バイト@FlorianSchaetzのおかげで
-7バイト

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

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


4バイトをドロップできます。;ラムダの回答では末尾をカウントする必要はありません。;}はまったく必要ありません。また、forループの周りで{and }を削除できます。そして、あなたは、両方の変更のJava 10で4バイト以上を救うことができるStringcharしをvar
ケビンCruijssen

4

brainfuck、68バイト

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

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


空の文字列ではまったく機能しません-オンラインテストで2つの無効な文字が返されました。そうでなければ、とてもいいです。
-NoseKnowsAll

@NoseKnowsAllそれを複製することはできません。入力がないと、出力は得られません。その入力で更新されたリンクを提供できますか?
ダニエロ

これを実行したときに得たものです:。空の入力では、引用符なしで「[]」を返す必要があります。
ノーズノーズオール

@NoseKnowsAllリンクは「hello world」入力に移動します(そのリンク/チェーンボタンを押して更新されたリンクを取得します)。私はそれを見ていきます
-daniero

1
@NoseKnowsAllそこに行き、私はそれを修正しました;)
daniero

3

脳フラック135、131のバイト

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

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

+1-cフラグのバイト。

理由もなくXDを持っている非常に明白なNOOPを削除してくれたWheatWizardに感謝します。


@WheatWizard> _>ええ、私はあなたをテストしていました...ハハハ、それを指摘してくれてありがとう。あとでゴルフをしようとしますが、今それを追加しますlol
DJMcMayhem


3

Cubix31 29バイト

uo@[)o'U);!A?ro;o;o;os:'/u:''

Ai; に置き換えることもできます。これからさらに1バイトまたは2バイトを圧縮する良い方法があるかどうかを把握しようとしています。-MickyTのおかげで2バイト!また、MickyTからアウトゴルフ

3x3x3立方体に適合:

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

オンラインで見る!

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


最後の括弧に数個の増分を使用することにより、数バイトを節約できます。これにより、uo@[)o'U);!A?ro;o;o;os:'/u:''
最終




2

PHP、39バイト

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

でパイプとして実行し-Fます。



2

Cubix、27バイト

uosW?U.iv":'"^soso;os@o[]'/

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

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

実行を見る

Guiseppeの回答とは少し異なるバリエーション。これにより、コロンと引用符がスタックに配置されます。次に、入力をループし、スタックをスワップして出力します。入力のみが廃棄され、コロンと引用符は保持されます。

入力の終わりに達すると、IPはキューブを少し驚かせ、ブラケットを追加して出力します。ミックスには冗長なコマンドがいくつかあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.