การตีความปลา (ไม่ใช่ไม่ใช่ปลา)


69

พิจารณาสัตว์ทะเล ASCII ทั้งห้านี้:

  1. ปลามาตรฐาน: ><>หรือ<><
  2. ปลาเร็ว: >><>หรือ<><<
  3. ปลาที่แข็งแรง: ><>>หรือ<<><
  4. ปลายืด: ><<<>หรือ<>>><
  5. ปู: ,<..>,

<>,.จงเขียนโปรแกรมที่รับสตริงโดยพลการของตัวละคร หากมีวิธีในการตีความสตริงทั้งหมดเป็นชุดของสิ่งมีชีวิตในทะเลที่ไม่ทับซ้อนกันสตริงนั้นควรพิมพ์ซ้ำด้วยช่องว่างเดียวที่แทรกระหว่างสิ่งมีชีวิต หากการตีความนี้เป็นไปไม่ได้ไม่มีสิ่งใดที่ควรส่งออก

ตัวอย่างเช่นสาย<><><>สามารถตีความได้ว่าเป็นปลาสองมาตรฐานกลับไปด้านหลัง <>< ><>ผลลัพธ์ที่สอดคล้องกันจะเป็น

เป็นอีกตัวอย่างหนึ่งสตริง><>><>>มี "อินสแตนซ์" ของ ...
(เครื่องหมายวงเล็บถูกเพิ่มเป็นตัวบ่งชี้เท่านั้น)

  • ปลามาตรฐานสองสามตัว: [><>][><>]>
  • ปลาที่รวดเร็ว: ><[>><>]>
  • ปลาที่แข็งแรงในสองสามวิธี: [><>>]<>>และ><>[><>>]

อย่างไรก็ตามมีเพียงการจับคู่ของปลามาตรฐานและปลาที่แข็งแรง[><>][><>>]ครอบคลุมช่วงความยาวทั้งหมดของสตริงโดยไม่มีอักขระการแชร์ปลา (ไม่มีการทับซ้อนกัน) ดังนั้นการส่งออกที่สอดคล้องกับการเป็น><>><>>><> ><>>

หากมีหลายวิธีที่สามารถตีความสตริงได้คุณสามารถพิมพ์หนึ่งในนั้นได้ (และมีเพียงพิมพ์หนึ่งของพวกเขา.) ตัวอย่างเช่น<><<<><สามารถตีความได้ว่าเป็นปลาที่ได้มาตรฐานและเป็นปลาที่มีความทนทาน: หรือเป็นปลาที่รวดเร็วและปลามาตรฐาน:[<><][<<><] [<><<][<><]ดังนั้นทั้ง<>< <<><หรือ<><< <><จะเป็นเอาท์พุทที่ถูกต้อง


ปูเป็นเพียงเพื่อความสนุกสนาน เนื่องจากพวกเขาไม่ได้เริ่มต้นหรือลงท้ายด้วย<หรือ>พวกเขาจะง่ายต่อการระบุ (อย่างน้อยมองเห็น) ตัวอย่างเช่นสตริง

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

จะสร้างผลผลิตอย่างเห็นได้ชัด

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

นี่คือตัวอย่างของสตริง (หนึ่งรายการต่อบรรทัด) ที่ไม่มีเอาต์พุต:

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

สตริงสุดท้ายที่นี่สามารถแยกวิเคราะห์ถ้าคุณลบนำ<:

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

(อาจมีเอาต์พุตอื่น ๆ ที่เป็นไปได้)

รายละเอียด

  • สตริงอินพุตจะมีเฉพาะอักขระ<>,.เท่านั้น
  • สตริงอินพุตจะมีความยาวอย่างน้อยหนึ่งตัว
  • รับอินพุตในวิธีทั่วไป (บรรทัดคำสั่ง stdin) และเอาต์พุตไปยัง stdout
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ( ตัวนับไบต์ที่มีประโยชน์ ) Tiebreaker เป็นโพสต์ก่อนหน้า

4
ฉันคิดว่าเรากำลังจะตีความเนื้อร้องของ Fish :-(
RemcoGerlich

9
@RemcoGerlich ไม่ใช่ปลานั่นอย่างใดอย่างหนึ่ง
งานอดิเรกของ Calvin

4
ในที่สุดรหัส - กอล์ฟสำหรับ RFC 3889 รูปแบบการถ่ายโอนปลาทั่วไป (การนำ RFC3500: รูปแบบการถ่ายโอนปลามาตรฐาน)!
Sanchises

11
คะแนนโบนัสหากคุณใช้ BrainF ***! และยิ่งโปรแกรมของคุณใช้เวลานานขึ้นในการตระหนักถึงโค้ดของตัวเองแล้วมันก็ไม่ได้เป็นไปตามมาตรฐานปลา
mbomb007

3
ฉันเห็นสิ่งนี้และเลื่อนลง, ลาออกจากความจริงที่ว่านี่จะเป็น @ Calvin's งานอดิเรกและไม่มีใคร, ไม่มีใครอีกแล้ว
Soham Chowdhury

คำตอบ:


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!
John Odom

3
@ mbomb007: อาจยังดีกว่าคอมไพเลอร์ C ++
Mark K Cowan

27

เครื่องทัวริงที่ไม่ได้กำหนดค่าไว้, 20 สถานะ, 52 ช่วงการเปลี่ยนภาพ (882 ไบต์อาจจะ)

คุณแปลงเป็นไบต์ได้อย่างไร ผมเคยเขียนไฟล์ (อย่างไม่แข็งแรงเล่นกอล์ฟ) ที่จะดำเนินการเครื่องนี้กับอเล็กซ์ Vinokur ของจำลองของทัวริงเครื่อง 1 wc -cส่งออกข้อมูลต่อไปนี้ (ไม่รวมไฟล์คำอธิบายและไฟล์อินพุต):

 12 alphabet
 49 meta
740 rules
 81 states
882 total

อย่างไรก็ตามฉันกำลังเตรียมตัวสำหรับ A-Levels วิทยาศาสตร์คอมพิวเตอร์ของฉันดังนั้นฉันคิดว่านี่จะเป็นการออกกำลังกายที่ดี (ฉันไม่รู้ว่าฉันกำลังคิดอะไรอยู่) ดังนั้นนี่คือคำจำกัดความ:

คำนิยาม

สหรัฐอเมริกา

ตัวอักษร

สถานะเริ่มต้น

อักขระว่าง

การยอมรับสถานะ

ฟังก์ชั่นการเปลี่ยน

(ฟังก์ชั่นการเปลี่ยนแปลง)

ขอโทษนะภาพไม่ดี แต่ฉันไม่สามารถรำคาญกับการวาดสิ่งนี้บนคอมพิวเตอร์ หากคุณต้องการถอดรหัสกฎการเปลี่ยนแปลงจริง ๆ ฉันขอแนะนำให้คุณอ่านไฟล์กฎที่ลิงก์ไว้ด้านบน


ฉันใช้Xช่องว่างแทนเพราะช่องว่างยากที่จะมองเห็นที่นี่และเครื่องมือจำลองไม่ยอมรับช่องว่างเป็นตัวอักษร

แนวคิดนี้ค่อนข้างง่าย - ใช้ q1 ถึง q4 เพื่อจับปลาที่หันหน้าไปทางขวา, q11 ถึง q14 ใช้สำหรับจับปลาหันหน้าไปทางซ้าย, q15 ถึง q19 สำหรับปูและ q5 ถึง q10 blob เป็นเพียงการแทรกพื้นที่และเคลื่อนย้ายทั้งหมด ติดตามตัวละครตัวหนึ่งไปทางขวา

หากตีความได้สตริงจะยอมรับสตริงและเทปมีสตริงที่มีช่องว่างแทรกอยู่ มิฉะนั้นจะปฏิเสธสตริง (ฉันคิดว่าสิ่งนี้นับว่าไม่มีเอาต์พุต - การล้างเทปจะค่อนข้างง่าย แต่ต้องใช้กฎการเปลี่ยนจำนวนมากและฉันไม่คิดว่ามันจะทำให้ฟังก์ชั่นการเปลี่ยนภาพดูน่าสนใจยิ่งขึ้น)


1หมายเหตุ: รวบรวมยาก ผมต้องแก้ไขsrc/tape.cppไฟล์และแทนที่LONG_MAXด้วย1<<30และจากนั้นไปที่demoไดเรกทอรีแก้ไข Makefile เพื่อแทนที่EXE_BASENAMEด้วยและดำเนินการturing.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
คุณรู้อะไรมีอย่างน้อยสอง ภาษาที่เหมาะสม สำหรับงานนี้! ใครบางคน (ที่ไม่ใช่ฉัน) ควรทำอย่างอื่น :-)
xebtl

2
โปรแกรมเดียวกันใน 383 chars ของ BASH พร้อม BASE64 blob รวม: 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:                                          <       <

วิธีการแก้ปัญหาในปลาอาจเล่นได้มาก แต่เป็นโปรแกรมแรกของฉัน>> ใช้อินพุตจากอินพุตสแต็กและรันบนล่ามออนไลน์> <> ล่าม

มันทำงานอย่างไร :

การวนซ้ำอ่านอินพุตทั้งหมดและสแต็กย้อนกลับและวาง -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 sด้วยfor _ in [0]*3โดยที่ 3 คือขอบเขตบนของจำนวนปลา มันใช้งานได้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 ฉันคิดว่ามันน่าจะใช้ได้แล้ว นี่เป็นกรณีของผู้ประกอบการที่a and b or cให้ค่าที่ไม่ถูกต้องเมื่อbอาจเป็นเท็จ ฉันเปลี่ยนกลับไปif/elseเป็น 2 ตัวอักษร แต่อาจมีวิธีที่จะทำให้การทำงานแบบไตรภาค
xnor

เนื่องจากคุณอยู่ใน Python 3 แล้วคุณอาจใช้ (ab) ด้วยเช่นกัน: P*l,s=[],input()
Sp3000

คุณลืมที่จะลดจำนวนไบต์เมื่อคุณได้ ^ นั่น
undergroundmonorail

12

Perl, 81 + 1 ไบต์

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

ลองใช้รหัสนี้ทางออนไลน์

รหัสนี้คาดว่าการป้อนข้อมูลใน$_ตัวแปร; เรียกใช้ด้วย-nสวิตช์ของ Perl ( นับเป็น +1 ไบต์ ) เพื่อใช้กับแต่ละบรรทัดอินพุตเช่นเช่นนี้:

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

รหัสนี้ใช้เอ็นจิ้น regexp ของ Perl (และโดยเฉพาะคุณสมบัติการประมวลผลโค้ดแบบฝังตัว ) เพื่อทำการค้นหาย้อนรอยที่มีประสิทธิภาพ ปลาแต่ละตัวที่พบจะถูกรวบรวมใน@aอาเรย์ซึ่งจะถูกทำให้เป็นสตริงและพิมพ์หากการจับคู่สำเร็จ

รหัสนี้ยังใช้คุณสมบัติ Perl 5.10+ sayและจะต้องเรียกใช้ด้วย-Eหรือ-M5.010สลับ (หรือuse 5.010;) เพื่อเปิดใช้งานคุณลักษณะที่ทันสมัยดังกล่าว ตามธรรมเนียมสวิตช์ดังกล่าวที่ใช้เพื่อเปิดใช้งานรุ่นภาษาเฉพาะเท่านั้นจะไม่รวมอยู่ในจำนวนไบต์

หรือนี่คือเวอร์ชัน 87- ไบต์ที่ไม่ต้องการสวิตช์บรรทัดคำสั่งพิเศษเลย มันอ่านหนึ่งบรรทัดจาก stdin และพิมพ์ผลลัพธ์ (ถ้ามี) ไปยัง stdout โดยไม่มี linefeed ต่อท้าย:

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

ps หากอนุญาตให้พิมพ์พื้นที่พิเศษที่จุดเริ่มต้นของผลงานได้ฉันสามารถบันทึกสองไบต์ด้วย:

/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{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

Python 2, 234 ไบต์

ฉันลองใช้โซลูชัน Python regex ก่อน แต่ดูเหมือนว่าจะไม่มีทางแยกกลุ่มหลังจากการแข่งขันในหลายรูปแบบ ต่อไปนี้เป็นการค้นหาแบบเรียกซ้ำซึ่งน่าจะทำได้ดีในกรณีทดสอบ

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อาจอยู่ในบรรทัดเดียว (เช่นที่คุณทำที่อื่น) นอกจากนี้แทนที่จะ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

Haskell (Parsec) - 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 ฉันไม่รู้ว่ามันเป็นความท้าทายของกอล์ฟเช่นกัน ขอบคุณสำหรับเคล็ดลับ
ตรงไปตรงมา

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(' ')

ความพยายามที่นี่คือการขยาย regexp ซ้ำและจับคู่กับอินพุต
หากพบการจับคู่ที่ยาวขึ้น 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 bytes

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

การทดสอบ:

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

$ echo "> <>> <>>" | ปลา runhaskell

<>> <>>

คำอธิบาย

ตามคำตอบก่อนหน้าของฉันกับคำถามที่คล้ายกัน อัลกอริทึมทำงานในเวลาที่ชี้แจง

สิ่งนี้อ่านจากขวาไปซ้าย

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

เอาท์พุต

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

Ungolfedเพียงแค่ฟังก์ชั่น 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

Haskell, 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 ไบต์)

ไม่ใช่นักกอล์ฟส่วนใหญ่ที่นี่อาจถูกปล้นได้เล็กน้อย

อันนี้เป็นฐาน regex และ tad ยากที่จะคิดออกว่าเกิดอะไรขึ้น

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 คุณต้องมี lookahead หรือ backtrak หรืออะไรก็ตาม ...
edc65

@ edc65 DAMN! สำหรับตอนนี้ฉันไม่มีทางออก ฉันจะพยายามแก้ไขในภายหลัง
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

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

โซลูชันแบบเรียกซ้ำ ไปงานปาร์ตี้สาย แต่ฉันคิดว่าฉันจะโพสต์มันเพราะมันเต้นโดย Sp300020 22 ไบต์โดยไม่ต้องบังคับให้ตอบคำถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.