魚の解釈(いいえ、その魚ではありません)


69

次の5つのASCIIアートの海の生き物を考えてみましょう。

  1. 標準魚:><>または<><
  2. スピーディな魚:>><>または<><<
  3. 丈夫な魚:><>>または<<><
  4. 伸縮性のある魚:><<<>または<>>><
  5. カニ: ,<..>,

任意の文字列を受け入れるプログラムを作成します<>,.。文字列全体を重複しない一連の海の生き物として解釈する方法がある場合、文字列は、生き物間に単一のスペースを挿入して再印刷する必要があります。この解釈が不可能な場合は、何も出力すべきではありません(プログラムは静かに終了します)。

たとえば、文字列<><><>は2つの標準的な魚を連続して解釈できます。対応する出力はになります<>< ><>

別の例として、文字列に><>><>>は「...」の「インスタンス」が含まれます
(括弧はインジケータとしてのみ追加されます)

  • いくつかの標準的な魚: [><>][><>]>
  • スピーディな魚: ><[>><>]>
  • いくつかの方法で頑丈な魚:[><>>]<>>><>[><>>]

ただし、標準の魚と頑丈な魚のペアリングのみ[><>][><>>]が、文字列の長さ全体に広がり、魚を共有する文字はありません(重複はありません)。したがって、に対応する出力><>><>>><> ><>>です。

文字列の解釈方法が複数ある場合は、それらのいずれかを印刷できます。(そして、そのうちの1つだけを印刷します。)たとえば<><<<><、標準の魚と頑丈な魚:[<><][<<><]、または高速の魚と標準の魚:として解釈できます[<><<][<><]。したがって、どちら<>< <<><<><< <><が有効な出力になります。


カニはただの楽しみです。彼らは開始かで終わらないので<または>、彼らは(少なくとも視覚)を識別する方がはるかに簡単です。たとえば、文字列

,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>

明らかに出力を生成します

,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>

出力を生成しない文字列の例(1行に1つ)を次に示します。

<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><

先頭の文字列を削除すると、ここの最後の文字列を解析できます<

<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><

(他の可能な出力があるかもしれません。)

詳細

  • 入力文字列には文字のみが含まれます<>,.
  • 入力文字列は少なくとも1文字の長さになります。
  • 一般的な方法(コマンドライン、標準入力)で入力を取り、標準出力に出力します。
  • バイト単位の最短コードが優先されます。(便利なバイトカウンター。)Tiebreakerは以前の投稿です。

4
私たちは魚の歌詞を解釈しようと思っていた:-(
RemcoGerlich

9
@RemcoGerlichその魚でもない
カルビンの趣味

4
最後に、RFC 3889 General Fish Transfer Format(RFC3500の実装:Standard Fish Transfer Format)のコードゴルフ!
-Sanchises

11
BrainF ***を使用して行うとボーナスポイントが得られます。また、プログラムが独自のコードがフィッシュに準拠していないことを認識するのに時間がかかるほど、より良い結果が得られます。
mbomb007

3
私はこれを見て下にスクロールし、これが@ Calvin'sHobbiesであり、誰も、誰もいないという事実に辞任しました。
ソハムチョードリー

回答:


21

Pyth、64 48 50バイト

#jdhfqzsTsm^+msXtjCk2U2"<>""
\r.1"",<..>,"dlzB

テストケース。


ここでは、52バイトで永久に取得しないバージョン()ですO(9n/3)


これはブルートフォースアプローチで、すべてのシーケンスを生成し、入力に対する合計があるかどうかを確認します。バイナリ表現が>およびである文字として圧縮された魚図<。結果が見つからない場合に出力が発生しないように、全体がtry-catchブロックにラップされます。

これは解決策です。O(9n)

制御文字が使用されるため、一部の文字は上で削除されます。これらは上記のリンクで忠実に再現されています。

xxd出力:

0000000: 236a 6468 6671 7a73 5473 6d5e 2b6d 7358  #jdhfqzsTsm^+msX
0000010: 746a 436b 3255 3222 3c3e 2222 0a5c 7212  tjCk2U2"<>"".\r.
0000020: 141b 1d2e 3122 222c 3c2e 2e3e 2c22 646c  ....1"",<..>,"dl
0000030: 7a42                                     zB

オンラインコンパイラは、質問の入力例で実行するには遅すぎますか?
オプティマイザー

はい、タイムアウトが遅すぎる/短すぎる。><>><>>私のマシンでは15秒かかります。
isaacg

28
O(9 ^ n)、神聖な非効率!
mbomb007

2
@ mbomb007ルールの効率については何も表示されません:P +1!
ジョンオドム

3
@ mbomb007:おそらくC ++コンパイラよりも優れています。
マークKコーワン

27

非決定的チューリングマシン、20の状態、52の遷移(882バイトの可能性があります)

これをどのようにバイトに変換しますか?Alex Vinokurのチューリングマシンシミュレーター1 このマシンを実行するためのファイルを作成しました(絶対にゴルフはしていません)。以下を出力します(説明ファイルと入力ファイルを除く):wc -c

 12 alphabet
 49 meta
740 rules
 81 states
882 total

とにかく、コンピューターサイエンスAレベルの準備をしていたので、これは良い練習になると思いました(私は何を考えていたのかわかりません)。定義は次のとおりです。

定義

州

アルファベット

初期状態

空白文字

受け入れ状態

遷移関数

(遷移関数)

悪いイメージを失礼しますが、私はこのことをコンピューターで再描画することに悩むことができませんでした。実際に移行ルールを解読したい場合は、上記でリンクしたルールファイルを読むことをお勧めします。


Xここではスペースを視覚化するのが難しく、シミュレータはアルファベットのスペースを受け入れないため、スペースの代わりにs を使用しました。

コンセプトはかなりシンプルです-q1からq4は右向きの魚、q11からq14は左向きの魚、q15からq19はカニ、q5からq10 blobはスペースを挿入してすべてを移動するために使用します1文字右に続く文字。

文字列が解釈可能な場合、文字列を受け入れ、テープにはスペースが挿入された文字列が含まれます。それ以外の場合は、文字列を拒否します(これは出力なしと見なされます-テープを空にすることは非常に簡単ですが、多くの移行ルールが必要であり、移行機能が見やすくなるとは思わない)。


1注:コンパイルは困難です。src/tape.cppファイルを編集して置き換えLONG_MAX1<<30からdemoディレクトリに移動し、Makefileを編集して置き換えEXE_BASENAMEturing.exe実行する必要がありましたmake。次に、作成したファイルがあるディレクトリに移動して実行し/path/to/turing/download/src/turing.exe metaます。


3
どうやら私は狂気のために+1。
クズカイ

22

魚(はい、その魚)、437バイト

これは、ちょうど1つの言語が正しいプログラミングタスクの1つであると思います。

#!/usr/bin/fish

set the_fishes "><>" "<><" ">><>" "<><<" "><>>" "<<><" "><<<>" "<>>><" ",<..>,"
set my_fishes

function startswith
        set -l c (echo -n $argv[2]|wc -c)
        echo $argv[1]|cut -c(math $c+1)-
        test $argv[2] = (echo $argv[1]|cut -c-$c)
end

function pickafish
        set -l fix 1
            while true
                if test $fix -gt (count $the_fishes); return 1; end

                if not set rest (startswith $argv[1] $the_fishes[$fix])
                            set fix (math $fix+1)
                        continue
                end    
                set my_fishes $my_fishes $the_fishes[$fix]
                    if test -z $rest
                        echo $my_fishes
                            exit
                    end
                    if not pickafish $rest
                    set my_fishes $my_fishes[(seq (math (count $my_fishes) - 1))]
                    set fix (math $fix+1)
                        continue
                end
        end
end

pickafish $argv[1]

次のバージョンは、この挑戦​​に対する最も長い答えです。

set t "><>" "<><" ">><>" "<><<" "><>>" "<<><" "><<<>" "<>>><" ",<..>,";set m;function p;set -l i 1;while true;test $i -gt 9; and return 1;if not set r (begin;set c (echo $t[$i]|wc -c);echo $argv[1]|cut -c$c-;test $t[$i] = (echo $argv[1]|cut -c-(math $c-1));end);set i (math $i+1);continue;end;set m $m $t[$i];if test -z $r;echo $m;exit;end;if not p $r;set m $m[(seq (math (count $m)-1))];set i (math $i+1);continue;end;end;end;p $argv[1]

しかし、これはおもに駄洒落のために行われたので(言い訳になりますが、願っています)、より良いゴルフは読者の練習として残されています。


9
この仕事には(少なくとも)2つの 正しい 言語があります。誰か(私ではない)が他の誰かをする必要があります:
xebtl

2
BASE64ブロブとBASHの383文字で同じプログラムが含まれる: printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
マーク・K・コーワン

20

> <>、602バイト

0&>i:0)?vr>:5%4-?v}:5%?;}:5%1-?;}:5%1-?;}:5%2-?;}:5%4-?;}&~0& v
  \     /        >:5%2-?v}:5%2-?v}:5%?v}:5%2-?v}              v
 &:?v;>*} ^      v      <       >:5% ?v}:5%?v} :5% ?v}:5%2-?v}v
v&-1< ^48<                                  >: 5%2-?v}:5%2-  ?v&1+&0}}v
>    :?v~^       >:5%?v}:5%?v}:5%2-  ?v}:5%  ?v}              v
^~v?%8:<                    >:5%2-?v}: 5%2-?v} :5%2- ?v}:5%?v}v
^{<        >0>=?;:v                         >: 5%    ?v}:5%  ?v&1+&0}}v
           ^lo~<  <   >            >  >       >     > >     >  02.
          \}*48^?=i:                                          <       <

Fishのソリューションは、おそらく非常にゴルフに適していますが、それは私の最初の<>プログラムです。入力スタックから入力を受け取り、オンラインのインタープリターで実行します。

使い方 :

ループはすべての入力を読み取り、それをスタックし、それを反転し、解析が完了したことを示す下部に-1を置きます(文字列が解析可能と見なされるまで、すべての文字がスタックに残ります)。
解析では、すべての文字が5を法として異なるという事実を使用し、<> <<および> <>>を除くすべてのパターンは決定的です。解析された文字はスタックの一番下に置かれます。
パターンが完了すると、-1が先頭にある場合、すべての文字が印刷されます。そうでない場合、スペースが追加され、プログラムがループします。
<> <<または> <>>が検出されると、レジスタがインクリメントされ(開始時に0)、最後の文字の前に0がスタックに配置されます(したがって、<> <または> <>はロールバック後も残ります) 。解析中にエラーが発生した場合、レジスタが減少し、0の後のすべての文字が先頭に戻されます(%8 = 0テストのおかげでスペースを除く)。
レジスタが0のときにエラーが検出された場合、またはカニの内部でエラーが検出された場合、プログラムはただちに終了します。


13

Python 3、156

*l,s=[],input()
for _ in s:l+=[y+[x]for x in"><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,".split()for y in l]
for y in l:
 if"".join(y)==s:print(*y);break

戦略は、魚のリストを生成し、それらの連結を入力文字列と比較することです。

これには非常に時間がかかります。あなたが実際に出力を確認したい場合は、交換するfor _ in sfor _ in [0]*33は、魚の数の上限であり、。チャーごとに最大1匹の魚が含まれているsため、使用できsます。

バグ修正のためのSp3000と入力時の文字保存に感謝します。

古い165:

f=lambda s:[[x]+y for x in"><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,".split()for y in f(s[len(x):])if s[:len(x)]==x]if s else[[]]
y=f(input())
if y:print(*y[0])

@ Sp3000良いキャッチ、私は問題を知っていると思います。
xnor

@ Sp3000今はうまくいくと思う。これは、Falsyである可能性がある場合にa and b or c誤った値を与える三項の場合でしたb。私はif/else2文字に戻しましたが、3進法を作成する方法があるかもしれません。
xnor

既にPython 3を使用しているため、同様に(ab)useすることもできます*l,s=[],input()
。P– Sp3000

^それをしたときにバイト数を減らすのを忘れた
地下

12

Perl、81 + 1バイト

/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{local@a=(@a,$2)}))*$(?{say"@a"})/

このコードをオンラインで試してください。

このコードでは、$_変数に入力が必要です。Perlの-nスイッチ(+1バイトとしてカウント)でこれを実行して、各入力行に適用します。例:

perl -nE '/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{local@a=(@a,$2)}))*$(?{say"@a"})/'

このコードは、Perlの正規表現エンジン(特に埋め込みコード実行機能)を使用して、効率的なバックトラッキング検索を実行します。検出された個々の魚は@a配列に収集され、一致が成功すると文字列化されて出力されます。

このコードはPerl 5.10+ say機能も使用するため、このような最新の機能を有効にするには、-Eor -M5.010スイッチ(またはuse 5.010;)で実行する必要があります。 伝統的に、言語の特定のバージョンを有効にするためだけに使用されるこのようなスイッチは、バイトカウントに含まれません。

また、特別なコマンドラインスイッチをまったく必要としない87バイトバージョンもあります。stdinから1行を読み取り、結果(ある場合)を後続の改行なしでstdoutに出力します。

<>=~/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{local@a=(@a,$2)}))*$(?{print"@a"})/

追伸 出力の先頭に余分なスペースを印刷することが許可されている場合、次のようにしてさらに2バイト節約できます。

/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{local$a="$a $2"}))*$(?{say$a})/

分解すると、数バイトをノックオフできます。たとえば、><(>|<<)>
Sp3000

@ Sp3000:ありがとう!それは魚の各方向のバイトを節約します。
イルマリカロネン

6

Python 3、196 186バイト

F="><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,".split()
def g(s):
 if s in F:return[s]
 for f in F:
  i=len(f)
  if f==s[:i]and g(s[i:]):return[f]+g(s[i:])
R=g(input())
if R:print(*R)

単純な再帰。g解析された魚のリストを返すNoneか、入力文字列が解析できない場合。


6

Python 2、234バイト

最初にPython正規表現ソリューションを試しましたが、複数のパターンで一致した後にグループを抽出する方法はないようです。以下は、テストケースでうまくいくと思われる再帰検索です。

a='><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,'.split()
def d(t,p=0):
 if p<len(t):
  for e in a:
   z=p+len(e)
   if e==t[p:z]:
    if z==len(t):return[e]
    c=d(t,z)
    if c:return[e]+c
c=d(raw_input())
if c:
 print' '.join(c)

テスト例:

$ echo ",<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>" | python soln.py 
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>

そして、無料版:

fishtypes = '><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,'.split()

def getfish(t, p=0):
    if p < len(t):
        for afish in fishtypes:
            z = p+len(afish)
            if afish == t[p:z]:
                if z == len(t) :
                    return [afish]
                fishlist = getfish(t, z)
                if fishlist :
                    return [afish]+fishlist

fishlist = getfish(raw_input())
if fishlist:
    print ' '.join(fishlist)

3
あなたの最後ifは、他の場所で行ったように、1行で書けると思います。また、数バイトを節約するためにif p<len(t)できると思いますif t[p:]
-mathmandan

4

C#-319バイト

この解決策は恥ずべきほど単純で、ゴルフにとってはほとんど何もありません。これは完全なプログラムであり、入力をSTDINから行として受け取り、結果をSTDOUTに出力します。

using C=System.Console;class P{static void Main(){C.Write(S(C.ReadLine()));}static string S(string c){int i=c.LastIndexOf(' ')+1;foreach(var o in"<>< ><> <<>< ><>> >><> <><< ><<<> <>>>< ,<..>,".Split()){string k=c+"\n",m=c.Substring(i);if(m==o||m.StartsWith(o)&&(k=S(c.Insert(i+o.Length," ")))!="")return k;}return"";}}

各魚をスペースの後(または文字列の先頭)の最初の位置に一致させようと試み、各魚をそれに一致させます。魚が適合する場合、魚の後にスペースを挿入した後、ソルバーを再帰的に呼び出します。または、一致しない文字列が文字通り魚である場合(つまり、解決策が見つかった場合)、単に入力を返します(出力上の理由で\ nを使用) 。

私は魚の糸に通常のコルモゴロフ処理を与える試みをあまりしませんでした、それはそれほど長くないので、C#で文字列を逆にする安価な方法を見つけることができません(私はLINQとは思わない支払います)、したがって、そこにいくらかの機会があるかもしれません、しかし、私はいくらかそれを疑います。

using C=System.Console;

class P
{
    static void Main()
    {    
        C.Write(S(C.ReadLine())); // read, solve, write (no \n)
    }

    static string S(string c)
    {
        int i=c.LastIndexOf(' ')+1; // find start of un-matched string

        // match each fish
        foreach(var o in"<>< ><> <<>< ><>> >><> <><< ><<<> <>>>< ,<..>,".Split())
        {
            string k=c+"\n", // set up k for return if we have finished
            m=c.Substring(i); // cut off stuff before space
            if(m==o|| // perfect match, return straight away
               m.StartsWith(o)&& // fish matches the start
               (k=S(c.Insert(i+o.Length," "))) // insert a space after the fish, solve, assign to k
               !="") // check the solution isn't empty
                return k;
        }

        // no fish match
        return"";
    }
}

ああ、あなたは私を得た。多重定義だとは思わなかった。ノイズを減らすためにコメントを削除しました。
クロルタン

3

ハスケル(パーセク)-262

import Text.Parsec
c=words"><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,"
p c d=choice[eof>>return[],lookAhead(choice$map(try.string)d)>>=(\s->try(string s>>p c c>>=(\ss->return$s:ss))<|>p c(filter(/=s)c))]
main=interact$either show unwords.runParser(p c c)()""

2
これは、入力が分割できない場合、エラーなしで失敗するのではなく、エラーメッセージを出力します。
-Zgarb

2
import sys

def unfish(msg,dict,start):
    if(len(msg[start:])<3):
        return "";
    for i in range(3,6):
        if (msg[start:start+i] in dict):
            if(start+i==len(msg)):
                return msg[start:start+i];
            else:
                ret = unfish(msg,dict,start+i);
                if ret != "":
                    return msg[start:start+i]+" "+ret;
    return ""

dict = {'><>':1,'<><':1,'>><>':1,'<><<':1,'><>>':1,'<<><':1,'><<<>':1,'<>>><':1,',<..>,':1};

print unfish(sys.argv[1],dict,0);

私はちょっとしたPythonのnoobなので、奇妙さを無視してください:P


3
PPCGへようこそ。これはコードとゴルフのチャレンジです。つまり、できるだけ少ない文字でコードを書くようにしてください。スタートのためには、(例えば、単一の文字変数を使用することができm代わりにmsgs代わりにstart、...)と増分あたりわずか1スペースを使用します。また、プログラムの文字カウントを追加して投稿してください(ここでカウントできます)。
ジャクベ

@Jakubeに感謝します。ゴルフの挑戦であることも知りませんでした。ヒントをありがとう。
率直に

2

ルビー、177バイト

最短ではなく、ルビーの最初のもの:

def r(e,p,m)t='';p.each{|n|t=e.join;return r(e<<n,p,m)if m=~/^#{t+n}/};(m==t)?e:[];end
puts r([],%w(><<<> <>>>< ><>> <<>< >><> <><< ><> <>< ,<..>,),gets.strip).join(' ')

ここでの試みは、正規表現を再帰的に拡張し、入力と照合することです。
より長い一致が見つかった場合、r()は再帰します。一致しない場合、最後の一致が入力文字列全体を消費するかどうかを確認し、スペースを追加して出力します。


1

CJam、111 96 91(または62バイト)

すべての魚の組み合わせが繰り返し可能であることを把握し続けるための反復的な貪欲なアプローチ。本当に今ゴルフされていません。

q_aa\,{{" È÷®µãÑø"255b5b" ><,."f=S/\f{)_3$#{;;;}{2$,>:P@a\a++}?PR+!{S:R*W<o}*}~}%}*];

コードには印刷できない文字が含まれているため、参照用に以下のリンクを使用してください。

更新エンコードされた文字列を

ゴルフが終わったら説明を追加します

こちらからオンラインでお試しください


62バイト

超低速バージョン。これは基本的に、入力に等しいすべての組み合わせとチェックを作成します。

L"¬ééãLù:9$"255b6b5," ><,."erS/aq:Q,*{m*}*{sQ=}=`"[]\""-

これには印刷できない文字も含まれていますので、以下のリンクに依存してください。

こちらからオンラインでお試しください


1

Haskell、148 146バイト

main=mapM_ putStr.take 1.filter(all(`elem`words"><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,").words).map concat.mapM(\a->[[a],a:" "])=<<getLine

テスト:

$ echo "><>><>>>" | runhaskell fishes.hs

$ echo "> <>> <>>" | runhaskell fishes.hs

<>> <>>

説明

同様の質問に対する以前の回答に基づいています。アルゴリズムは指数時間で実行されます。

これは右から左に読みます。

=<<getLine              -- Read a line from STDIN.
mapM(\a->[[a],a:" "])   -- Replace each letter 'a' by "a" or "a " in
                        -- all possible ways, collect results to a list.
map concat              -- Concatenate those lists-of-strings into strings.
filter(all(...).words)  -- Keep those whose words are correct fish.
take 1                  -- Discard all but the first one.
mapM_ putStr            -- Print each string in that 1- or 0-element list.
main=                   -- That is the main function.

スペースなしの文字列が最初に生成されるため、このような文字列も生成されますが、スペースで終わる文字列は出力されません。


1

JavaScript(ES6)、164

再帰的な深さ優先スキャン。
ポップアップ経由のI / Oを使用するプログラムとして:

alert((k=(s,r)=>'><>0<><0>><>0<><<0><>>0<<><0><<<>0<>>><0,<..>,'.split(0)
.some(w=>s==w?r=w:s.slice(0,l=w.length)==w&&(t=k(s.slice(l)))?r=w+' '+t:0)?r:'')
(prompt()))

テスト可能な関数として:

k=(s,r)=>'><>0<><0>><>0<><<0><>>0<<><0><<<>0<>>><0,<..>,'.split(0)
.some(w=>s==w?r=w:s.slice(0,l=w.length)==w&&(t=k(s.slice(l)))?r=w+' '+t:0)?r:''

テストスイート(Firefox / FireBugコンソールで実行)

t=['<><><>', '><>><>>', '<><<<><',',<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>',
'<><>',',<..>,<..>,','>>><>','><<<<>',',','><><>',',<><>,',
'<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><','<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><']

t.forEach(t=>console.log(t + ': ' +k(t)))

出力

<><><>: <>< ><>
><>><>>: ><> ><>>
<><<<><: <>< <<><
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>: ,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
<><>: 
,<..>,<..>,: 
>>><>: 
><<<<>: 
,: 
><><>: 
,<><>,: 
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><: 
<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><: <<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><

k関数のみをゴルフ

function k(s)
{
  var f='><>0<><0>><>0<><<0><>>0<<><0><<<>0<>>><0,<..>,'.split(0) 
  var i, w, l, t

  for (w of f)
  {
    if (s == w)
    {
      return w
    } 
    l = w.length
    if (s.slice(0,l) == w && (t = k(s.slice(l))))
    {
      return w + ' ' + t
    }
  }
  return ''
}

0

ハスケル、148 142

p[]=[[]]
p s=[i:j|i<-words"><> >><> ><>> ><<<> <>< <><< <<>< <>>>< ,<..>,",i==map fst(zip s i),j<-p$drop(length i)s]
    g s=unwords$head$p s++p[]

これはリスト内包表記を使用して魚を反復処理し、開始に一致するものを選択して再帰的に続行します。


3
このチャレンジでは、関数ではなく、出力を出力する完全なプログラムを明示的に要求します。
-Zgarb

0

Javascript(122 135バイト)

ここで最もゴルフされているわけではなく、少し削ることができます。

これは正規表現に基づいており、何が起こっているのかを理解するのは少し難しいです。

alert(prompt(R=RegExp,r='(<<?><|><>>?|,<\.\.>,|>><>|><<<>|<><<|<>>><)').match(R('^'+r+'+$'))[0].split(R(r+'(?=[>,]|$)','g')).join(' '))

これはワンライナーです。

基本的に、構文をチェックしてから、文字に基づいて文字列を分割し、結合します。
無効な入力を与えると、例外をスローします。

例外をスローできない場合(126 139バイト):

(i=prompt(R=RegExp,r='(<<?><|><>>?|,<\.\.>,|>><>|><<<>|<><<|<>>><)')).match(R('^'+r+'+$'))&&alert(i.split(R(r+'(?=[>,]|$)','g')).join(' '))

どちらもワンライナーです。
両方とも同じように機能します。


うまく機能していないエッジケースを検出してくださった@ edc65に感謝します。


ここでテストできます(出力はドキュメントに書き込まれます)。

これは、無効なコードを導入したときに例外をスローするバージョンに基づいています。

(現在、スタックスニペットにはバグがありますが、 私がしましメタ上で掲載します昨日すでに尋ねられました。それが機能するためには、私が交換してきた$\x24同じ出力を持っています、。あなたがここにバグについて読むことができます。http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js


例で失敗します><>><>>。これはRegexpではそれほど簡単に解決できないと思います。先読みやバックトラックなどが必要です…
-edc65

@ edc65くそ!今のところ、解決策はありません。後で修正しようとします
イスマエルミゲル

0

Scala、299バイト

type S=String
type L[T]=List[T]
def c(s:S):L[L[S]]={val f=List("><>","<><",">><>","<><<","><>>","<<><","><<<>","<>>><",",<..>,").filter(s.startsWith);if(f.isEmpty)List(List(s)) else f.flatMap(i => c(s.drop(i.size)).map(i::_))}
def p(s:S)=println(c(s).find(_.last.isEmpty).fold("")(_.mkString(" ")))

テストケース

val tests = Seq("><>", "<><", ">><>", "<><<", ">><>", "<><<", "><<<>", "<>>><", ",<..>,", "><>><>", "><><><", ",<..>,<><", "<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><", "<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><")
tests.foreach(p)

出力

><> 
<>< 
>><> 
<><< 
>><> 
<><< 
><<<> 
<>>>< 
,<..>, 
><> ><> 
><> <>< 
,<..>, <>< 

<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<>< 

0

Java、288バイト

public class F{public static void main(String[]q){d("",q[0]);}static System y;static void d(String a,String b){if(b.isEmpty()){y.out.println(a);y.exit(0);}for (String s : "><> <>< >><> <><< ><>> <<>< ><<<> <>>>< ,<..>,".split(" "))if(b.startsWith(s))d(a+" "+s,b.substring(s.length()));}}

フォーマット済み:

public class F {
    public static void main(String[] q) {
        d("", q[0]);
    }

    static System y;

    static void d(String a, String b) {
        if (b.isEmpty()) {
            y.out.println(a);
            y.exit(0);
        }
        for (String s : "><> <>< >><> <><< ><>> <<>< ><<<> <>>>< ,<..>,".split(" "))
            if (b.startsWith(s)) d(a + " " + s, b.substring(s.length()));
    }
}

0

私はサイズを選ぶつもりはありませんでしたが、これはDartでこれを行う簡単な方法です。

const List<String> fish = const [
  "><>",
  "<><",
  ">><>",
  "<><<",
  "><>>",
  "<<><",
  "><<<>",
  "<>>><",
  ",<..>,"
];

String fishy(String input) {
  var chars = input.split("");
  if (chars.isEmpty || !chars.every((it) => [">", "<", ",", "."].contains(it))) {
    throw new Exception("Invalid Input");
  }

  var result = [];
  var i = 0;
  var buff = "";
  while (i < chars.length) {
    buff += chars[i];

    if (fish.contains(buff)) {
      result.add(buff);
      buff = "";
    } else if (chars.length == 6) {
      return "";
    }

    i++;
  }

  return result.join(" ");
}

void main() {
  print(fishy(",<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>"));
}

0

Python 3、 166 164バイト

def z(s,p=''):[z(s[len(f):],p+' '+s[:len(f)])for f in'<>< <><< <<>< <>>>< ><> >><> ><>> ><<<> ,<..>,'.split(' ')if s.startswith(f)]if s else print(p[1:])
z(input())

再帰的なソリューション。パーティーに遅れたが、とにかくSp3000を打ち負かしたので、とにかく投稿したいと思った20 総当たりで22バイト。

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