伸縮性のヘビにキスをする


57

伸縮性のあるヘビは次のようになります。

<||=|||:)~

伸縮部分|として知られる伸縮性蛇の垂直バー()の各個別のシーケンスは、その幅の2倍まで個別に拡張可能で、一度拡張されると交互にスラッシュ(、)で描画されます。/\

上記の特定のヘビには、このような伸縮性のある部分が2つあり、4つの可能なポーズが与えられています。

<||=|||:)~

</\/\=|||:)~

<||=/\/\/\:)~

</\/\=/\/\/\:)~

最小のストレッチポーズで伸びるヘビの一般的な形は、この正規表現で定義されます

<(\|+=)*\|+:\)~

次のように言葉で表現できます:

<配列のいずれかの数字が続く|接合=、続いて標識:)~

だから<|:)~and <||:)~<|=|:)~and <|=|=||=|||||=||:)~は伸縮性のあるヘビですが<=:)~<=|:)~and <||=:)~とand <|==||:)~はそうではありません。

伸縮性のあるヘビは、右ではなく左を向く場合もあり~(:|||=||>ます。フォームは同じで、ミラー化されています。

チャレンジ

いくつかのスペースを挟んで、向かい合う2つの伸縮性のある蛇の1行の文字列を取り込むプログラムを作成します。両方のヘビは、最も伸びのないポーズになります(すべての垂直バー、スラッシュなし)。文字列は、右向きのヘビの尾で始まり、左向きのヘビの尾で終わります(オプションとして、末尾に改行もあると想定できます)。

たとえば、ヘビの間に5つのスペースがある入力の例を次に示します。

<|=||:)~.....~(:||||>

.わかりやすくするために、実際のスペース文字の代わりにピリオド()を使用しています。

ヘビ間のゼロスペースも有効な入力です。

<|=||:)~~(:||||>

ヘビは舌がこのように触れているときにキスをしていると言います。

あなたのプログラムは、(重複なし)ヘビはそれらの間の可能なスペースの最小数を有するように蛇の両方の伸縮性の部分のいくつかの組み合わせを拡張する必要がヘビが可能とキスに近いであるように、すなわち

蛇の尾は両方とも固定されていますが、伸びている部分に応じて、頭と体は動くことができます-右向きのヘビは右、左向きのヘビは左です。

プログラムの出力は、蛇を可能な限りキスに近い形で示す単一行の文字列(オプションの末尾の改行)であり、伸びた部分の垂直バーの代わりにスラッシュを交互に描画します。


たとえば、<|=||:)~.....~(:||||>(上記から)の出力は次のようになります。

</\=||:)~~(:/\/\/\/\>

これが唯一の解決策です。伸縮性のある部分の他の組み合わせを拡張すると、ヘビが重なり合うか、キスから遠ざかるからです。


可能なソリューションが複数ある場合、出力はいずれか1つになります。

たとえば、入力が

<|=||:)~.....~(:|||=|>

出力は

<|=/\/\:)~~(:/\/\/\=|>

または

</\=||:)~~(:/\/\/\=/\>

ヘビにキスをすることは常に可能であるとは限らないことを忘れないでください、しかしあなたはまだそれらをできるだけ近くに近づける必要があります。

たとえば、入力が

<||=||||:)~...~(:||>

出力は

</\/\=||||:)~.~(:||>

または

<||=||||:)~.~(:/\/\>

ヘビがすでにキスしている場合、出力は入力と同じになります。例えば

<|=||:)~~(:||||>

一般に、伸縮性のある部分を延長すると蛇が重なる場合、出力は入力と同じになります。例えば

<|||=|||:)~..~(:||||=|||||=||||||>

ノート

  • 通常どおりstdinまたはコマンドラインから入力を取得するか、文字列を取得する関数を記述します。出力を印刷または返す。
  • 必要に応じて.、スペース()の代わりに入力および出力でピリオド()を使用できます。
  • 重要なのは、置き換えられた一連の垂直バー内でスラッシュが交互に並んでいることです。一般に、ヘビでの順序や、フォワードスラッシュとバックスラッシュのどちらが先かは関係ありません。
  • 伸縮性のある部分は途中まで伸びることができません-ちょうど2倍であるか、まったく伸びません。

得点

これはcode-golfです。バイト単位の最短提出が勝ちです。Tiebreakerは以前の回答です。


17
Snex Education 101-適切にキスする方法
オプティマイザー

45
「蛇は舌がこのように触れているときにキスをしていると言います。」私は何を読んでいます
...-

8
それでヘビはフランス語しかしないのですか?
オプティマイザー

3
@PeterTaylorまあ、「ミラーリング」ではなく、「反転」で>はありません(そうでなければ<、for (とで同じになりません))が、彼はまた、「置き換えた垂直バーのシーケンス内でスラッシュが交互になることが重要です」と言います。スネーク全般、またはフォワードスラッシュとバックスラッシュのどちらが先かは関係ありません。
マーティンエンダー

7
@qwrイマジネーション。
カルビンの趣味

回答:


9

CJam、87 71 70 68バイト

l:L"|"f&Qa%_,Y\m*\f{.{_,"/\\"*?}L'|%.\s" /"1$fe=:-\a+}${0a>}=~S%\S**

CJamインタープリターでオンラインで試してください。

使い方

l:L        e# Read a line from STDIN and save it in L.
"|"f&      e# Intersect each character with the string "|".
           e# This pushes either "|" or "".
Qa%        e# Split the resulting array at runs of "".
_,         e# Compute the length of the resulting array (A).
           e# This yield K, the number of stretchy parts.
Y\m*       e# Push the array of all vectores in {0,1}^K.
\f{        e# For each vector V in {0,1}^K, push V and A; then:
  .{       e#   For each C in V and the corresponding P in A:
    _,     e#     Compute the length of the stretchy part P.
    "/\\"* e#     Repeat "/\" that many times.
    ?      e#     If C, select P; else, select "/\"*length(P).
  }        e#   This modifies A.
  L'|%     e#   Split L at runs of vertical lines.
  .\s      e#   Interleave the chunks of L and the modified A. Sringify.
           e#   In each iteration, this constructs a different modification of L,
           e#   with some stretched out stretchy parts.
  " /"1$   e#   Push " /" and a copy of the modified L.
  fe=      e#   Calculate the number of spaces and slashes in the modifed L.
  :-       e#   Subtract the number of occurrences.
  \a+      e#   Construct the array [difference modified-L].
}          e#
$          e# Sort the array (by final number of spaces).
{0a>}=     e# Find the first element greater than [0].
           e# This skips over too far stretched snakes, where the number of
           e# slashes is less than the number of spaces.
~          e# Dump the difference (D) and modified L on the stack.
S%         e# Split L at runs of spaces.
\S*        e# Construct a string of D spaces.
*          e# Join the split L, delimiting by D spaces.

19

網膜209 107 99 97 92バイト

.(?=(.+)(?<=(?=<((\|+|(?<-5>\|(?=\1())?)+)[^|]+)+$(?(5)!)).+( )+\S+))\4
/ \
+` (.*~|~.*) 
$1

カウントのために、各行は個別のファイルに入れられますが、-sフラグを使用して単一のファイルからコードを実行できます。

.NET正規表現とRetinaの最高の機能を組み合わせます:バランスグループ、任意の長さの後読み、繰り返し正規表現の置換。

基本的に、長い正規表現は有効なソリューションをエンコードし、正規表現エンジンのバックトラッカーは私にとって最適なものの1つを見つけます。

説明

最初に、正規表現を使用して有効なソリューション(必ずしも正しい出力を生成する必要はありません)を見つける方法を検討しましょう。.NETのバランスグループを使用して、伸縮性のある部分をカウントできます。次の単純な正規表現を検討してください。

\S+( )+.+(?<=(?(1)!)^([^|]+(\|+|(?<-1>\|)*))+>)

それを分析できます。

\S+( )+.+

これは文字列全体に一致1し、入力内の各スペースのグループスタックに1つのキャプチャをプッシュします。そのスタックを使用して、伸縮性のある部分がそれらのグループにキャプチャされたスペースを正確に埋めるようにします。

次は後読みです。問題は、後読みが.NETで右から左に一致することです(したがって、読み方はそうする必要があります)。これにより、2回目に文字列を走査する機会が与えられ、一致するスペースの数に達する伸縮部分のサブセットがあるかどうかがわかります。後読みを右から左に見ていく:

>

これは、文字列の最後(ヘビの尻尾)から実際に開始していることを確認するためのものです。

(
  [^|]+
  (
    \|+
  |
    (?<-1>\|)+
  )
)+

伸縮性のある各パーツについて、これは何もせずにパーツ全体\|+と一致するか()、またはキャプチャーをポップしてスタックからポップするときにパーツ全体と一致します1(?<-1>\|)*)。このように交互に配置することで、伸縮性のある部分を完全に延長するか、そのままにしておくことができ、のようなものは取得できません|/\|。次に、で次の伸縮部分に進み[^|]+ます。

(?(1)!)^

最後に、文字列全体(両方の蛇)をトラバースし、そのスタック1が完全に空であることを確認します。つまり、以前にキャプチャしたスペースの数と正確に合計する伸縮性のある部分のサブセットが見つかりました。

バックトラッカーは、サブセット合計の問題が解決されるまで、変更されていない部分と拡張された部分のすべての組み合わせを試行して、文字列を行き来します。そのようなサブセットが存在しない場合、後読みは失敗します。これにより、バックトラッカーが\S+( )+.+パーツに戻り、1つ少ないスペースをキャプチャしようとします( )+.+代わりにカバーされます)。+したがって、私たちは貪欲であるため、できるだけ多くのスペースを埋めようとします。

このわずかに変更された置換を使用して、このアプローチの有効性を確認できます。

\S+(( )+).+(?<=(?(2)!)^([^|]+(\|+|(?<-2>\|)*))+>)
=$1=

これ=spaces=により、指定された蛇で埋めることができる正確な数の文字列が得られます。

正しい|s を実際に拡張するには、さらにトリックを追加する必要がありました。基本的に、ブランチ|を使用して一致したすべてのを置き換えたいと思い(?<-1>\|)+ます。アイデアは、個々のキャラクターを照合し、ソルバーをルックアラウンドに入れ、一致がそのブランチ内にある場合にフラグを設定することです。そのフラグが設定されていなかった場合、他の文字が置き換えられないように、最後の一致を無効にします。

これを行うには、ネストされたルックアラウンドの束を使用します。繰り返しますが、.NETの可変長後読みは右から左に一致するため、先読みと後読みを入れ子にすると、正規表現エンジンに文字列を数回走査させることができます。ゴルフの理由から、実際のソリューションではソルバーが逆になっています(最後から始めて、右から左にスペースを拾い上げてから、左から右にサブセットの合計を解きます)、それ以外はソルバーの構造はまったく同じです。完全な正規表現を分析してみましょう。

.(?=(.+)...)

単一の文字に一致した後、文字列の残りをキャプチャし、カーソルを文字列の最後に移動します。1後でこのグループを使用して、一致の位置にいるかどうかをソルバーで確認します。

(?<=....+( )+\S+)

これは、上記の単純なソルバーの最初の部分に似ていますが、右から左にスペースを取得する点が異なります。スペースの数のバックトラックは、グループを使用していることを除いて、以前とまったく同じように機能します5

(?=<((\|+|(?<-5>\|(?=\1())?)+)[^|]+)+$(?(5)!))

これは前と同じですが、左から右に移動することを除き|、展開ブランチでa に一致するたびに、右に一致するものかどうかをチェックします

(?=\1())?

これはオプションの先読みです。groupの1再照合を試みます(ここでは、一致する文字の直後にいる場合にのみ可能です)。一致する場合は、空の文字列をgroupにキャプチャし4、現在の文字が1つで見つかったことを示します拡張ビットの。\1一致しない場合、4何もキャプチャせず?、失敗した先読みがソルバーにまったく影響しないようにします。

最後に、すべての解決が完了し\4たら、この先読みが使用されたかどうかを確認します。その場合、現在の文字をに置き換え/\ます。

1つの難点が残っています:適切な量のスペースを削除します。私がこれまでに見つけたこれを行う最短の方法は、一緒にスペースを挿入/\し、別々のステップでそれらのマーカースペースのそれぞれの舌の間の1つのスペースを取り除くことです:

+` (.*~|~.*) 
$1

6

ルビー191 187 186 170 162

->t{s=r=t.size
i=m=t[o=/ +/].size
(0...2**t.scan(y=/\|+/).size).map{|n|q=-1
x=t.gsub(y){|r|n[q+=1]<1?r:'\/'*r.size}
d=i+s-x.size
d<0||d<m&&r=x.gsub(o,' '*m=d)}
r}

これは、パラメータとして文字列を取り、文字列を返す関数です。

オンラインテスト:http : //ideone.com/uhdfXt

読みやすいバージョンは次のとおりです。

# enumerates the possible states for any string containing snakes
COMBINATIONS =-> snake {
  expandable_fragments = snake.scan /(\|+)/

  (0...2**(expandable_fragments.size)).map{ |i|
    x=-1
    snake.gsub(/\|+/){|r| i[x+=1]>0 ? '\/'*r.size : r}
  }
}

# finds the configuration in which snakes are closest to each other
KISS=
-> input {
  result = input
  s = input.size
  initial_distance = min_distance = input[/ +/].size

  COMBINATIONS[input].map{|c|
    distance = initial_distance + s - c.size
    if distance > -1 && distance < min_distance
      min_distance = distance
      result = c.gsub(/ +/,' '*distance)
    end
  }

  result
}

ゴルフバージョンでは、メイン関数はKISS上記の関数に相当し、COMBINATIONS関数はインライン化されています。


入力<|=||:)~~(:||||>で失敗します。これは、仕様では有効な入力であると述べています。
バリューインク

6

Python、205バイト

from itertools import*
f=lambda s:min([c.replace(".","",c.count("X"))for c in map("".join,product(*map({"|":"|X"}.get,s,s)))if{c.count("X")>c.count("."),"|X"in c,"X|"in c}=={0}],key=len).replace("X","/\\")

単一のラムダを持つことはすっきりとすべてに見えますが、これが最善の方法ではないことはほぼ確実です。しかし、私がこれを投稿しているのは、私がこれまでに手に入れた半分の見た目だからです。

これは、|withのすべての可能な置換に対する単純なブルートフォースであり/\、無効な構成を除外します。私が推測するだけできちんとしたビットは、私たちが実際に交換しないということである|との/\直接-私たちは、最初に置き換える|Xし、ドロップし.た後置き換え、すべての有効な文字列の上に最小の長さの文字列を取り、すべての交換のために途中からXsの/\

私は再帰的なアプローチを含む他のいくつかのアプローチを試みましたが、それらはかなり厄介になりました。また、私はre.split現在、空の文字列で分割しないことを学びました。これは残念なことです。なぜなら、私のアイデアの1つは\b単語の境界での分割に関するものだからです。


5

Mathematica、381バイト

StringReplace[MapAt[StringReplace[#,"|"->"/\\"]&,StringSplit[#<>"="<>#2,"="],#3]~StringRiffle~"=",")="->")~"<>If[#4>0,"."~StringRepeat~#4,""]<>"~"]&[#1,#3,Sequence@@Function[{l,s},{#,#2-Total@Extract[l,#]}&[Flatten[l~Position~#~Take~#2&@@@Tally@#&@@Select[Subsets@l,Total@#<=s&]~MaximalBy~Total,1],s]][StringLength/@StringCases[#1<>#3,"|"..],StringLength@#2]]&@@#~StringSplit~"~"&

引数として文字列を取る純粋な関数。ヘビの間では.なく期待

こんなに悪いとは思いませんでした...一緒に壊してすべてを固定する前に私が持っていたものがあります。

f[lhs_, rhs_, 
  spaces_] := {StringLength /@ StringCases[lhs <> rhs, "|" ..], 
  StringLength@spaces}

g[barLens_, 
   spaceLen_] := {#, #2 - Total@Extract[barLens, #]} & @@ {Flatten[
     Take[Position[barLens, #], #2] & @@@ 
      Tally[First[
        MaximalBy[Select[Subsets[barLens], Total@# <= spaceLen &], 
         Total]]], 1], spaceLen};

h[lhs_, rhs_, partspec_, newSpaceLen_] := 
 StringReplace[
  StringRiffle[
   MapAt[StringReplace[#, "|" -> "/\\"] &, 
    StringSplit[lhs <> "=" <> rhs, "="], partspec], "="], 
  ")=" -> ")~" <> 
    If[newSpaceLen > 0, StringRepeat[".", newSpaceLen], ""] <> "~"]

 h[#1, #3, Sequence @@ g @@ f[#1, #3, #2]] & @@ 
     StringSplit[#, "~"] &

次に、説明付きのランスルーの例を示します。

Input: "<|=||:)~.....~(:||||>"
@Call StringSplit[#, "~"] &, yielding  {"<|=||:)", ".....", "(:||||>"}
@@Apply h[#1, #3, Sequence @@ g @@ f[#1, #3, #2]] &, but first
Set arguments: h["<|=||:)", "(:||||>", Sequence @@ g @@ f["<|=||:)", "(:||||>", "....."]]
@Call f, yielding {{1, 2, 4}, 5} = {# of bars in each segment, # of spaces}
@@Apply g, let's trace from the interior:
Subsets[barLens] = all subsets of {1, 2, 4}
Select those subsets whose sum is less than # of spaces {{},{1},{2},{4},{1,2},{1,4}}
MaximalBy Total, yielding a list of all subsets whose sum is maximal {{1, 4}}
First of these subsets, can be any of them {1, 4}
Tally the subset, yielding frequencies of each {{1, 1}, {4, 1}}
@@@Apply Take[Position[barLens, #], #2] & at the first level, yielding
    {Take[Position[{1, 2, 4}, 1], 1], Take[Position[{1, 2, 4}, 4, 1]]}
    which takes the first 1 positions of 1 and the first 1 positions of 4, yielding
    {{{1}},{{3}}}
Flatten at the first level, yielding {{1}, {3}}
Create a list {{{1}, {3}}, 5}
@@Apply {#, #2 - Total@Extract[barLens, #]} &, inserting arguments:
    {{{1}, {3}}, 5 - Total@Extract[{1, 2, 4}, {{1}, {3}}]} = {{{1}, {3}}, 0}
    where the second element becomes the # of spaces left over.
Done with g, it returned {{{1}, {3}}, 0}
@@Apply Sequence, splicing the return of g into h, yielding the
@Call, h["<|=||:)", "(:||||>", {{1}, {3}}, 0]; let's start from the interior
StringSplit the concatenated "<|=||:)=(:||||>" with delimiter "=", {"<|","||:)","(:||||>"}
MapAt the part specification {{1}, {3}} and StringReplace at those indices any | with /\
    yielding {"</\","||:)","(:/\/\/\/\>"}
StringRiffle together, inserting back the delimiter "=", yielding "</\=||:)=(:/\/\/\/\>"
StringReplace ")=" with ")~", concat the new number of spaces, concat "~"
Yields "</\=||:)~~(:/\/\/\/\>", done.

簡単に開始することにより、355に減少a=StringReplace;b=StringSplit;c=StringLength;d=Total;し、その後、別の場所で内部の必要に応じてそれらを置き換える:a=StringReplace;b=StringSplit;c=StringLength;d=Total;a[MapAt[a[#,"|"->"/\\"]&,b[#<>"="<>#2,"="],#3]~StringRiffle~"=",")="->")~"<>If[#4>0,"."~StringRepeat~#4,""]<>"~"]&[#1,#3,Sequence@@Function[{l,s},{#,#2-d@Extract[l,#]}&[Flatten[l~Position~#~Take~#2&@@@Tally@#&@@Select[Subsets@l,d@#<=s&]~MaximalBy~d,1],s]][c/@StringCases[#1<>#3,"|"..],c@#2]]&@@#~b~"~"&
アレックスMeiburg

3

プロローグ(ECLiPSe)、438バイト

私の他の答えは、間違った問題を解決することでした(ノイズで申し訳ありません)。以下は、実際にすべてのルールを尊重するPrologの別の試みです。

:-lib(fd).
a([],[]).
a([H|T],L):-append(H,X,L),a(T,X).
s(E,Z,X,Y,L):-length(E,L),a([[60],M,[58,41,126],T,[126,40,58],W,[62]],E),checklist(=(32),T),length(T,Z),b(M,X-[]),b(W,Y-[]).
b(I,[K:M|R]-E):-(I:K=[47,92|L]:s;I:K=[124|L]:n),M#=N+1,N#>=0,b(L,[K:N|R]-E).
b([61|L],[_:0|R]-E):-b(L,R-E).
b([],[_:0|E]-E).
d(_:N,Y:N):-Y=s;Y=n.
s(W,P):-string_list(W,E),s(E,_,X,Y,L),minimize((maplist(d,X,U),maplist(d,Y,V),s(K,Q,U,V,L)),Q),string_list(P,K).

テスト

(形式:入力、出力、改行)

<===:)~         ~(:>
<===:)~         ~(:>

<|||:)~         ~(:||||=|>
</\/\/\:)~ ~(:/\/\/\/\=/\>

<=|=:)~         ~(:||||=|>
<=/\=:)~   ~(:/\/\/\/\=/\>

<===|:)~         ~(:||=|>
<===/\:)~     ~(:/\/\=/\>

<|=|=|||=|:)~         ~(:=|>
</\=/\=/\/\/\=/\:)~  ~(:=/\>

<||||||:)~         ~(:=|>
</\/\/\/\/\/\:)~  ~(:=/\>

<||||||:)~         ~(:||>
</\/\/\/\/\/\:)~ ~(:/\/\>

<||=||||:)~ ~(:||>
<||=||||:)~ ~(:||>

<||=||||:)~   ~(:||>
</\/\=||||:)~ ~(:||>

<||=||||:)~    ~(:||>
</\/\=||||:)~~(:/\/\>

<||=||||:)~~(:||>
<||=||||:)~~(:||>

説明

  • 主な述語はs/2、入力を最初の引数として受け取り、2番目の引数(両方の文字列)で結果を無視します。入力は、文字コードのリストに変換されますE

  • 次に、s(E,Z,X,Y,L)リストを次の要素に分解します。

    • Z ヘビ間のスペースの数
    • XそしてY、左右の身体の抽象的な表現

      本体のフォーマットはリストであるn:Nか、s:N式、N正の長さです。n手段normals手段stretched

    • L リストの全長

興味深いのs/5は、両方の方向に進むことです。つまり、他の引数がインスタンス化された場合にヘビを構築できます

    s(E,5,[n:3],[s:2,n:7,s:1],_),string_list(S,E).

... unifies `S` with `"<|||:)~     ~(:/\\/\\=|||||||=/\\>"` (backslashes are quoted). This is due to how `b/2` is written, which can parse the character list or generate it.
  • Q新しいヘビを分離するスペースを最小限に抑えながら、各パーツが通常またはストレッチされた修正された左右のボディを構築します。計算された文字列の全長は、検索が終了するように制限されています。

1

Python 2.7.3 427 421 400 371バイト

import re,itertools as K
g,o,k='\|+',len,raw_input()
d=k.count(' ')
if d==0:exit(k)
p,x,y,s=re.sub,0,0,map(o,re.findall(g,k))
for e in [A for w in range(o(s)+1)for A in K.combinations(s,w)]:
 v=sum(e)
 if v==d or x<v<d:x,y=v,list(e)
print p(" +",' '*(d-x),p(g,lambda m:('/\\'*o(m.group(0))if y.remove(o(m.group(0)))or True else 1)if o(m.group(0))in y else m.group(0),k))

ここにゴルフ以外のコード-

#!/usr/bin/env python
import sys
import re

def find_dist_combo(li, d):
    #Listing all combinations
    from itertools import combinations as c
    max_dist = -1
    max_dist_combo = []
    for p_len in xrange(1,len(li)+1):
        for e in c(li, p_len):
            e_sum = sum(e)
            cond1 = e_sum == d
            cond2 = max_dist < e_sum < d
            if cond1 or cond2:
                max_dist = e_sum
                max_dist_combo = list(e)
                if cond1:
                    return (max_dist, max_dist_combo)
    return (max_dist, max_dist_combo)

def snakes_foreplay(snakes):
    #find distance
    distance = snakes.count(" ")

    #already kissing
    if distance == 0:
        return snakes

    #find num_stretches
    stretch = map(len, re.findall("\|+", snakes))

    #find lowest combination of numbers
    (e_dist, res_stretch) = find_dist_combo(stretch, distance)

    def sub_callback(m):
        s = m.group(0)
        l = len(s) 
        if l in res_stretch:
            res_stretch.remove(l)
            return '/\\'*l
        return s

    #Resultant substitution
    res_snakes = re.sub("\s+", " "*(distance - e_dist), re.sub("\|+", sub_callback, snakes))

    return res_snakes

if __name__ == "__main__":
    for s in [ip.strip() for ip in sys.stdin]:
        print snakes_foreplay(s)

ゴルフソリューションのテスト-

$ python stretchy_snakes.py
[In]  <=  <|=||:)~     ~(:||||>
[Out] =>  </\=||:)~~(:/\/\/\/\>

$ python stretchy_snakes.py
[In]  <=  <|=||:)~             ~(:||||>
[Out] =>  </\=/\/\:)~      ~(:/\/\/\/\>

$ python stretchy_snakes.py
[In]  <=  <|=||:)~     ~(:|||=|>
[Out] =>  </\=||:)~~(:/\/\/\=/\>

$ python stretchy_snakes.py
[In]  <=  <||=||||:)~   ~(:||>
[Out] =>  </\/\=||||:)~ ~(:||>

$ python stretchy_snakes.py
[In]  <=  <|=||:)~~(:||||>
[Out] =>  <|=||:)~~(:||||>

確かにこれはもっと良くできます(どうすればいいかわかりません:))。
ゴルフ中に明らかな何かを見逃したかどうか教えてください(それは私の最初のコードゴルフです、私は何か愚かなことをしているかもしれません:P)


@ Sp3000それは良いものです。置き換えexitのためにsys.exit()(忘れexit存在していました)。そして、あなたは正しい、__import__削除することができ、20文字のように除去されます:)
カメハメハ

ちなみに、エイリアシングで> 6は、2回使用する場合はエイリアシングの価値があり、> 33回使用する場合はcharsである必要があります。f=' 'エイリアスの価値があるかどうかは
わかり

@ Sp3000うん、あなたは正しい。以前のバージョンでは、その変数を3回使用していました。あと数バイト節約しました:) :)
カメハメハ

1

05AB1E、93 バイト

#õKDεγʒ'|å]©ε€gxøDgU`XG‘]`âDε˜ODI„| Ãg>‹*}ZQÏε˜ε®˜NèDgyÊi„/\y∍]н©J'/¢Ið¢αð×ý'|¡õK®.ιJIðå≠iI

長すぎる..>。>

オンラインそれを試してみたり、すべてのテストケースを確認するか、すべてのテストケースのためのすべての可能な結果を検証

説明:

#õK                   # Split the (implicit) input by one or multiple adjacent spaces
                      # (we now have both snakes as separated items
                      #  - if any spaces were in the input-string)
   D                  # Duplicate this list
    ε                 # Map both snakes to:
     γ                #  Split the snake into chunks of the same character-type
      ʒ'|å]          '#  And only leave the chunks of "|" characters
    ©                 #  Store this list in variable `r` (without popping)
     ε                #  Map the "|" chunks of both snakes again:
      g              #  Get the length of each chunk of "|"
        xø            #  Pair each length with double itself
          DgU`XG‘   #  Create all possible combinations for the current snake
     ]`â              # After the map: create all possible combinations for both snakes
        ε             # Map over each possible combination
         ˜O           #  Get the flattened sum
            I„| Ãg    #  Count the amount of "|" and spaces in the input
                  >‹  #  Check if it's smaller than or equal to this sum
                      #  (1 if truthy; 0 if falsey)
           D        * #  And multiply it by the sum
        }ZQ           # After the map, get the positions of the largest flattened sum,
                      # still below (or equal to) the amount of "|" and spaces combined
       D   Ï          # And only keep those combinations
ε                     # Then map over the remaining combinations
 ˜ε                   #  Flatten it, and map over each value `y`
   ®˜Nè               #   Get the `N`'th part of the snakes
                      #   (where `N` is the index of the map for the current combination)
       D              #   Duplicate this "|"-part
        gyÊi          #   If the length of this "|"-part is not equal to the map-value:
            „/\       #    Push the string "/\"
               y     #    Extended to a size equal to the map-value
                      #   (implicit else:
                      #    use the duplicated value)
                    # After the map: only leave the first (since we don't have
                      # to output all possibilities)
 ©                    # Store it in variable `r` (without popping)
  J'/¢               '# Count the amount of "/" in it
      Ið¢             # Count the amount of spaces in the input
         α            # Get the difference between those
          ð×ý         # And join the list of snakes by that many spaces
'|¡õK                '# Then split by one or multiple adjacent "|"
     ®.ι              # Interleave it with the modified parts of variable` r`
        J             # And join everything together to a single string
Iðå≠i                 # If the input didn't contain any spaces:
     I                #  Output the input instead
                      # (implicit else:
                      #  output the top of the stack before this if)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.