물고기 해석 (해당 물고기가 아님)


69

이 다섯 가지 ASCII 아트 바다 생물을 고려하십시오.

  1. 표준 물고기 : ><>또는<><
  2. 빠른 물고기 : >><>또는<><<
  3. 건장한 물고기 : ><>>또는<<><
  4. 신축성있는 물고기 : ><<<>또는<>>><
  5. 게: ,<..>,

임의의 문자열을 허용하는 프로그램을 작성하십시오 <>,.. 전체 스트링을 겹치지 않는 일련의 바다 생물 로 해석하는 방법이 있다면 , 생물 사이에 삽입 된 단일 공백으로 스트링을 다시 인쇄해야합니다. 이 해석이 불가능하면 아무것도 출력되지 않아야합니다 (프로그램은 자동으로 종료됩니다).

예를 들어, 문자열 <><><>은 두 개의 표준 피쉬 백투백으로 해석 될 수 있습니다. 해당 출력은입니다 <>< ><>.

또 다른 예로, 문자열 ><>><>>에는 ...의 "인스턴스"가 포함
됩니다 (괄호는 지표로만 추가됨)

  • 몇 가지 표준 물고기 : [><>][><>]>
  • 빠른 물고기 : ><[>><>]>
  • 몇 가지 방법으로 건장한 물고기 : [><>>]<>>><>[><>>]

그러나 표준 물고기와 건장한 물고기의 [><>][><>>]쌍만 물고기를 공유하는 문자없이 겹침없이 문자열의 전체 길이에 걸쳐 있습니다. 따라서에 해당하는 출력 ><>><>>><> ><>>입니다.

문자열을 해석 할 수있는 여러 방법이있는 경우 그 중 하나를 인쇄 할 수 있습니다. (만 인쇄 . 중)를 예를 들어, <><<<><표준 물고기와 튼튼한 물고기로 해석 될 수있다 [<><][<<><], 또는 빠른 물고기와 표준 물고기 : [<><<][<><]. 따라서 <>< <<><또는 <><< <><유효한 출력이됩니다.


게는 단지 재미입니다. 그들이 시작하거나 끝나지 않기 때문에 <또는 >, 그들은 (적어도 시각)를 식별하기가 훨씬 쉽다. 예를 들어, 문자열

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

분명히 출력을 생성합니다

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

다음은 출력을 생성하지 않는 문자열 (한 줄에 하나씩)의 예입니다.

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

선행을 제거하면 여기에서 마지막 문자열을 구문 분석 할 수 있습니다 <.

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

(가능한 다른 출력이있을 수 있습니다.)

세부

  • 입력 문자열에는 문자 만 포함됩니다 <>,..
  • 입력 문자열은 하나 이상의 문자 길이입니다.
  • 일반적인 방법 (명령 행, stdin)으로 입력을 받고 stdout으로 출력하십시오.
  • 바이트 단위의 가장 짧은 코드가 이깁니다. ( 핸디 바이트 카운터. ) Tiebreaker는 이전 게시물입니다.

4
나는 우리가 :-( 물고기 '가사를 해석하는 줄 알았는데
RemcoGerlich

9
@RemcoGerlich 저 물고기도
Calvin의 취미

4
마지막으로 RFC 3889 General Fish Transfer Format (RFC3500 : Standard Fish Transfer Format 구현)의 코드 골프!
Sanchises

11
BrainF ***를 사용하면 보너스 포인트! 또한 자체 코드가 물고기와 호환되지 않는 프로그램을 만드는 데 시간이 오래 걸릴수록 좋습니다.
mbomb007

3
나는 이것을 보았고 아래로 스크롤하여 이것이 @ Calvin'sHobbies이고 아무도, 아무도 없다는 사실로 사임했다.
Soham Chowdhury

답변:


21

Pyth, 64 48 50 바이트

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

테스트 사례.


(영원히지지 않습니다 버전 ) 여기에 52 바이트.O(9n/3)


이것은 무차별 대입 방식이며 모든 시퀀스를 생성하고 입력에 대한 합계가 있는지 확인합니다. 물고기 다이어그램은 문자로 압축되며 이진 표현은 >and <입니다. 모든 것은 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

온라인 컴파일러가 질문의 예제 입력에서 실행하기에는 너무 느립니까?
Optimizer

예, 시간이 너무 느리거나 너무 짧습니다. ><>><>>내 컴퓨터에서 15 초가 걸립니다.
isaacg

28
O (9 ^ n) , 거룩한 비 효율성!
mbomb007

2
@ mbomb007 나는 규칙에서 효율성에 대해 아무것도 보지 못했다 : P +1!
John Odom

3
@ mbomb007 : 아마도 C ++ 컴파일러보다 여전히 낫습니다.
Mark K Cowan

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 블로 브는 단순히 공간을 삽입하고 모든 것을 옮기는 데 사용됩니다 다음 문자를 오른쪽으로 하나씩.

문자열을 해석 할 수 있으면 문자열을 받아들이고 테이프에 공백이 삽입 된 문자열이 포함됩니다. 그렇지 않으면 문자열을 거부합니다 (출력이없는 것으로 간주합니다-테이프를 비우는 것은 꽤 쉽지만 많은 전환 규칙이 필요하며 전환 기능이 더 예쁘다고 생각하지 않습니다).


1 참고 : 컴파일하기가 어렵습니다. 내가 편집 한 src/tape.cpp파일과 교체 LONG_MAX1<<30다음으로 이동 demo, 디렉토리 대체 할 수있는 메이크 편집 EXE_BASENAMEturing.exe및 실행을 make. 그런 다음 내가 작성한 파일이있는 디렉토리로 이동하여 실행하십시오 /path/to/turing/download/src/turing.exe meta.


3
분명히 나는 ​​광기로 +1했다.
Kzqai

22

물고기 (예, 그 물고기), 437 바이트

이것은 정확히 하나의 언어가 올바른 프로그래밍 작업 중 하나입니다.

#!/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
BASE64 얼룩이 포함 된 BASH 383 자에서 동일한 프로그램 포함 : printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
Mark K Cowan

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

파이썬 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 물고기의 수에 대한 상한이다. char 당 최대 하나의 물고기를 포함 하기 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 April

@ Sp3000 지금 작동해야한다고 생각합니다. 이것은 Falsey a and b or cb수있을 때 삼항 이 잘못된 값을주는 경우입니다 . 나는 if/else2 자로 되돌아 갔지만 삼항 일을하는 방법이있을 수 있습니다.
xnor April

이미 Python 3을 사용하고 있기 때문에 다음과 같이 사용할 수도 있습니다. : P*l,s=[],input()
Sp3000

^ that했을 때 바이트 수를 줄이는 것을 잊었다
undergroundmonorail

12

펄, 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기능 도 사용 하므로 이러한 최신 기능을 사용 하려면 -E또는 -M5.010스위치 (또는 use 5.010;)로 실행해야 합니다. 전통적 으로 특정 버전의 언어를 사용하기 위해 단독으로 사용 된 이러한 스위치는 바이트 수에 포함되지 않습니다.

또는 특별한 명령 줄 스위치가 전혀 필요하지 않은 87 바이트 버전이 있습니다. stdin에서 한 줄을 읽은 후 줄 바꿈없이 결과 (있는 경우)를 stdout에 인쇄합니다.

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

추신. 출력 시작 부분에 여분의 공간을 인쇄 할 수 있다면 다음과 같이 2 바이트를 더 절약 할 수 있습니다.

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

분해하면 몇 바이트를 줄일 수 있습니다. 예 :><(>|<<)>
Sp3000

@ Sp3000 : 감사합니다! 그것은 물고기의 각 방향에 대한 바이트를 절약합니다.
Ilmari Karonen

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

파이썬 2, 234 바이트

파이썬 정규식 솔루션을 먼저 시도했지만 여러 패턴에서 일치 후 그룹을 추출하는 방법이없는 것 같습니다. 다음은 테스트 사례에서 잘 작동하는 것으로 보이는 재귀 검색입니다.

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 
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>

그리고 ungolfed 버전 :

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이 한 줄에있을 수 있다고 생각합니다 (다른 곳에서했던 것처럼). 또한 대신 몇 바이트를 절약 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 포함) (즉, 해결책을 찾았습니다) .

나는 그렇게 오래 걸리지 않기 때문에 물고기 끈에 일반적인 kolmogorov 치료법을 제공하려는 시도를 많이하지 않았으며 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"";
    }
}

오, 당신은 저를 얻었다. 그것이 다중 정의라는 것을 보지 못했습니다. 노이즈를 줄이기 위해 주석을 제거했습니다.
Kroltan

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);

나는 약간의 파이썬 멍청한 놈이므로 이상한 점을 무시하십시오 : P


3
PPCG에 오신 것을 환영합니다. 이것은 코드 골프 도전이며 가능한 한 적은 문자로 코드를 작성해야합니다. 처음에는 당신이 (예를 들어, 단일 문자 변수를 사용할 수있는 m대신 msg, s대신 start, ...) 및 증가 당 1의 공간을 사용합니다. 그리고 프로그램의 문자 수를 추가하십시오 ( 여기서 셀 수 있습니다 ).
Jakube

@Jakube에게 감사드립니다. 골프도 마찬가지라는 것을 몰랐습니다. 팁 주셔서 감사합니다.
franklynd

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

하스켈, 148146 바이트

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

자바 스크립트 (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

자바 스크립트 (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

트윗 담아 가기 현재로서는 해결책이 없습니다. 나중에 고치려고 노력하겠습니다
Ismael Miguel

0

스칼라, 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

자바, 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

파이썬 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.