Menafsirkan Ikan (bukan, bukan Ikan itu)

69

Pertimbangkan lima makhluk laut seni ASCII ini:

  1. Ikan standar: ><>atau<><
  2. Ikan cepat: >><>atau<><<
  3. Ikan kokoh: ><>>atau<<><
  4. Ikan melar: ><<<>atau<>>><
  5. Kepiting: ,<..>,

Tulis program yang menerima string karakter yang berubah-ubah <>,.. Jika ada cara untuk menafsirkan seluruh string sebagai serangkaian makhluk laut yang tidak tumpang tindih, maka string tersebut harus dicetak ulang dengan spasi tunggal yang disisipkan di antara makhluk. Jika penafsiran ini tidak mungkin, tidak ada yang harus dihasilkan (program diam-diam berakhir).

Sebagai contoh, string <><><>dapat diartikan sebagai dua ikan standar back-to-back. Output yang sesuai adalah<>< ><> .

Sebagai contoh lain, string ><>><>>berisi "instance" dari ...
(tanda kurung hanya ditambahkan sebagai indikator)

  • beberapa ikan standar: [><>][><>]>
  • ikan cepat: ><[>><>]>
  • ikan yang kokoh dalam beberapa cara: [><>>]<>>dan><>[><>>]

namun, hanya pasangan ikan standar dan ikan kokoh yang [><>][><>>]membentang sepanjang tali tanpa karakter berbagi ikan (tanpa tumpang tindih). Jadi output yang sesuai ><>><>>adalah ><> ><>>.

Jika ada beberapa cara string dapat ditafsirkan, Anda dapat mencetak salah satu dari mereka. (Dan hanya mencetak satu . Dari mereka) Sebagai contoh, <><<<><dapat diartikan sebagai ikan standar dan ikan kokoh: [<><][<<><], atau sebagai ikan cepat dan ikan standar: [<><<][<><]. Jadi salah satu <>< <<><atau <><< <><akan menjadi output yang valid.


Kepiting hanya untuk bersenang-senang. Karena mereka tidak memulai atau mengakhiri dengan <atau >, mereka lebih mudah untuk diidentifikasi (setidaknya secara visual). Misalnya, string

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

jelas akan menghasilkan output

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

Berikut adalah beberapa contoh string (satu per baris) yang tidak menghasilkan output:

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

String terakhir di sini dapat diuraikan jika Anda menghapus yang memimpin <:

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

(Mungkin ada output lain yang mungkin.)

Detail

  • String input hanya akan berisi karakter <>,..
  • String input akan memiliki setidaknya satu karakter.
  • Ambil input dengan cara biasa (baris perintah, stdin) dan output ke stdout.
  • Kode terpendek dalam byte menang. ( Penghitung byte berguna. ) Tiebreaker adalah posting sebelumnya.
Hobi Calvin
sumber
4
Saya pikir kami akan menafsirkan lirik Fish :-(
RemcoGerlich
9
@RemcoGerlich Bukan Ikan itu juga
Hobi Calvin
4
Akhirnya kode-golf untuk RFC 3889 Format Transfer Ikan Umum (menerapkan RFC3500: Format Transfer Ikan Standar)!
Sanchises
11
Poin bonus jika Anda menggunakan BrainF ***! Dan semakin lama program Anda menyadari kode sendiri tidak sesuai dengan ikan, semakin baik.
mbomb007
3
Saya melihat ini dan menggulir ke bawah, mengundurkan diri pada kenyataan bahwa ini adalah @ Calvin Hobi dan tidak ada, tidak ada yang lain.
Soham Chowdhury

Jawaban:

21

Pyth, 64 48 50 byte

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

Kasus cobaan.


Versi yang tidak memakan waktu lama ( ) di sini , dalam 52 byte.O(9n/3)


Ini adalah pendekatan brute force, hasilkan semua urutan dan periksa apakah ada jumlah pada input. Diagram ikan dikompresi sebagai karakter, yang representasi binernya adalah >dan <. Semuanya dibungkus dalam blok try-catch sehingga tidak ada output yang terjadi ketika tidak ada hasil yang ditemukan.

Ini solusinya.O(9n)

Beberapa karakter dilucuti di atas, karena karakter kontrol digunakan. Mereka direproduksi dengan setia pada tautan di atas.

output 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
isaacg
sumber
Apakah kompiler online terlalu lambat untuk menjalankannya pada contoh input dalam pertanyaan?
Pengoptimal
Ya, terlalu lambat / terlalu singkat. ><>><>>membutuhkan 15 detik pada mesin saya.
isaacg
28
O (9 ^ n) , inefisiensi suci!
mbomb007
2
@ mbomb007 Saya tidak melihat apa pun tentang efisiensi dalam aturan: P +1!
John Odom
3
@ mbomb007: Mungkin masih lebih baik daripada kompiler C ++.
Mark K Cowan
27

Mesin Turing Non-deterministik, 20 negara, 52 transisi (mungkin 882 byte)

Bagaimana Anda mengonversikan ini menjadi byte? Saya telah menulis file (sama sekali tidak golf) untuk mengeksekusi mesin ini dengan Simulator Alex Turing dari Mesin Turing 1 dari Alex Vinokur . wc -cmenampilkan yang berikut (tidak termasuk file deskripsi dan file input):

 12 alphabet
 49 meta
740 rules
 81 states
882 total

Ngomong-ngomong, saya sedang mempersiapkan A-Level Ilmu Komputer saya, jadi saya pikir ini akan menjadi latihan yang baik (saya tidak tahu apa yang saya pikirkan). Jadi, inilah definisi:

Definisi

Serikat

Alfabet

Keadaan awal

Karakter kosong

Negara penerima

Fungsi transisi

(fungsi transisi)

Maafkan gambar yang buruk, tapi saya tidak bisa repot-repot menggambar ulang hal ini di komputer. Jika Anda benar-benar ingin menguraikan aturan transisi, saya sarankan Anda membaca file aturan yang saya tautkan di atas.


Saya telah menggunakan Xs bukan spasi karena spasi sulit untuk divisualisasikan di sini dan simulator tidak menerima spasi dalam alfabet.

Konsepnya cukup sederhana - q1 ke q4 digunakan untuk menangkap ikan yang menghadap ke kanan, q11 ke q14 digunakan untuk menangkap ikan yang menghadap ke kiri, q15 ke q19 untuk kepiting dan gumpalan q5 ke q10 hanya untuk memasukkan ruang dan memindahkan semua mengikuti karakter satu ke kanan.

Jika string dapat diartikan, ia menerima string dan rekaman itu berisi string dengan spasi yang disisipkan. Kalau tidak, ia menolak string (saya kira ini dianggap sebagai tidak ada output - mengosongkan rekaman itu akan sangat mudah tetapi akan membutuhkan banyak aturan transisi dan saya tidak berpikir itu akan membuat fungsi transisi lebih cantik untuk dilihat).


1 Catatan: Sulit untuk dikompilasi. Saya harus mengedit src/tape.cppfile dan mengganti LONG_MAXdengan 1<<30dan kemudian pergi ke demodirektori, edit Makefile untuk mengganti EXE_BASENAMEdengan turing.exedan menjalankan make. Lalu pergi ke direktori dengan file yang saya tulis dan jalankan /path/to/turing/download/src/turing.exe meta.

jazzpi
sumber
3
Tampaknya saya memberi +1 untuk kegilaan.
Kzqai
22

ikan (ya, ikan itu), 437 byte

Ini menurut saya sebagai salah satu tugas pemrograman di mana tepatnya satu bahasa benar.

#!/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]

Versi berikut masih merupakan jawaban terpanjang untuk tantangan,

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]

tetapi karena ini dilakukan terutama untuk permainan kata-kata (saya harap, saya berharap), bermain golf lebih baik dibiarkan sebagai latihan untuk pembaca.

xebtl
sumber
9
Apa yang Anda ketahui, ada (setidaknya) dua bahasa yang tepat untuk pekerjaan ini! Seseorang (yang bukan saya) harus melakukan yang lain :-)
xebtl
2
Program yang sama dalam 383 karakter BASH dengan gumpalan BASE64 termasuk: 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 byte

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:                                          <       <

Sebuah solusi di Fish, mungkin sangat golf tetapi ini adalah program pertama saya>. Dibutuhkan input dari tumpukan input dan berjalan pada penerjemah online> <>.

Bagaimana itu bekerja :

Sebuah loop membaca semua input dan menumpuknya, membalikkannya dan meletakkan -1 di bagian bawah yang akan menandai bahwa parsing selesai (semua karakter tetap di stack sampai string dianggap parsable).
Penguraian menggunakan fakta bahwa semua karakter berbeda modulo 5, dan semua pola adalah deterministik kecuali <> << dan> <>>. Karakter yang diuraikan diletakkan di bagian bawah tumpukan.
Ketika sebuah pola selesai, jika -1 di atas, semua karakter dicetak, jika tidak spasi ditambahkan dan program loop.
Jika <> << atau> <>> ditemukan, register bertambah (0 di awal), dan 0 ditempatkan di tumpukan sebelum karakter terakhir (sehingga <> <atau> <> tetap setelah rollback) . Jika kesalahan muncul sesudahnya selama penguraian, register berkurang, semua karakter setelah 0 dimasukkan kembali ke atas (kecuali spasi berkat% 8 = 0 test).
Jika kesalahan terdeteksi saat register adalah 0, atau di dalam kepiting, program langsung berakhir.

David D
sumber
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

Strateginya adalah untuk menghasilkan daftar ikan dan membandingkan rangkaian mereka dengan string input.

Ini sangat lama. Jika Anda benar-benar ingin melihat output, ganti for _ in sdengan for _ in [0]*3, di mana 3 adalah batas atas untuk jumlah ikan. Ini berfungsi untuk digunakan skarena smengandung paling banyak satu ikan per arang.

Terima kasih kepada Sp3000 untuk perbaikan bug dan char save on input.

Lama 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])
Tidak
sumber
@ Sp3000 Tangkapan bagus, saya pikir saya tahu masalahnya.
xnor
@ Sp3000 Saya pikir ini harus berfungsi sekarang. Ini adalah kasus ternary yang a and b or cmemberikan nilai yang salah ketika bmungkin Falsey. Saya kembali ke if/elseuntuk 2 karakter, tetapi mungkin ada cara untuk membuat pekerjaan ternary.
xnor
Karena Anda sudah menggunakan Python 3, Anda mungkin juga (ab) menggunakannya: P*l,s=[],input()
Sp3000
Anda lupa mengurangi jumlah byte ketika Anda melakukannya ^
undergroundmonorail
12

Perl, 81 +1 byte

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

Coba kode ini secara online.

Kode ini mengharapkan input dalam $_variabel; jalankan ini dengan -nsakelar Perl ( dihitung sebagai +1 byte ) untuk menerapkannya pada setiap jalur input, misal seperti ini:

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

Kode ini menggunakan mesin regexp dari Perl (dan khususnya fitur eksekusi kode yang disematkan ) untuk melakukan pencarian penelusuran mundur yang efisien. Masing-masing ikan yang ditemukan dikumpulkan dalam @asusunan, yang dirangkai dan dicetak jika kecocokan berhasil.

Kode ini juga menggunakan fitur Perl 5.10+ say, sehingga harus dijalankan dengan -Eatau -M5.010beralih (atau use 5.010;) untuk mengaktifkan fitur modern tersebut. Secara tradisional, sakelar semacam itu yang hanya digunakan untuk mengaktifkan versi bahasa tertentu tidak termasuk dalam jumlah byte.

Atau, inilah versi 87-byte yang tidak memerlukan sakelar baris perintah khusus sama sekali. Bunyinya satu baris dari stdin, dan mencetak hasilnya (jika ada) ke stdout, tanpa linefeed baris tambahan:

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

Ps. Jika mencetak ruang ekstra di awal output diizinkan, saya bisa menghemat dua byte dengan:

/^((>><>|><(|>|<<)>|<><<|<(|<|>>)><|,<\.\.>,)(?{local$a="$a $2"}))*$(?{say$a})/
Ilmari Karonen
sumber
Anda dapat membuat beberapa byte jika Anda ><(>|<<)>
memfaktorkan
@ Sp3000: Terima kasih! Itu menghemat satu byte untuk setiap arah ikan.
Ilmari Karonen
6

Python 3, 196 186 byte

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)

Rekursi sederhana. gbaik mengembalikan daftar ikan yang diuraikan, atau Nonejika string input tidak dapat diurai.

Sp3000
sumber
6

Python 2, 234 byte

Saya mencoba solusi regex Python pertama, tetapi tampaknya tidak ada cara untuk mengekstrak grup setelah kecocokan pada beberapa pola. Berikut ini adalah pencarian rekursif yang tampaknya bekerja dengan baik pada kasus uji.

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)

Contoh tes:

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

Dan versi yang tidak diserang:

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)
Ksatria Logika
sumber
3
Saya pikir yang terakhir Anda ifbisa berada pada satu baris (seperti yang Anda lakukan di tempat lain). Juga, alih-alih if p<len(t)saya pikir Anda dapat melakukan if t[p:]untuk menghemat beberapa byte.
mathmandan
4

C # - 319 byte

Solusi ini memalukan sederhana, hampir tidak apa-apa untuk Golf. Ini adalah program yang lengkap, mengambil input sebagai garis dari STDIN, dan output hasilnya ke 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"";}}

Ini hanya mencoba untuk mencocokkan setiap ikan ke posisi pertama setelah spasi (atau di awal string), dan mencocokkan setiap jenis ikan dengan itu. Jika ikan cocok, maka secara rekursif memanggil pemecah setelah memasukkan spasi setelah ikan, atau hanya mengembalikan input itu (dengan \ n untuk alasan output) jika string yang tidak cocok secara harfiah adalah ikan (yaitu kami telah menemukan solusi) .

Saya belum melakukan banyak upaya untuk memberikan ikan string pengobatan kolmogorov yang biasa, karena tidak terlalu lama, dan saya tidak dapat menemukan cara murah untuk membalikkan string dalam C # (saya tidak berpikir LINQ akan membayar), jadi mungkin ada beberapa peluang di sana, tapi saya agak meragukannya.

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"";
    }
}
VisualMelon
sumber
Oh, kamu menangkapku. Tidak melihat itu definisi ganda. Komentar yang dihapus untuk mengurangi kebisingan.
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)()""
desir
sumber
2
Ini mencetak pesan kesalahan jika input tidak dapat dibagi, sebagai lawan gagal secara diam-diam.
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);

im sedikit python noob jadi abaikan keanehannya: P

terus terang
sumber
3
Selamat datang di PPCG. Ini adalah tantangan kode-golf, artinya Anda harus mencoba menulis kode dengan sesedikit mungkin karakter. Sebagai permulaan, Anda bisa menggunakan variabel huruf tunggal (mis. mAlih- alih msg, sbukannya start, ...) dan hanya menggunakan 1 spasi per kenaikan. Dan tolong posting menambahkan jumlah karakter program Anda (Anda dapat menghitungnya di sini ).
Jakube
Terima kasih @ Jakube, saya tidak tahu bahwa itu juga tantangan golf. Terima kasih atas tipsnya.
franklynd
2

Ruby, 177 byte

Bukan yang terpendek tapi yang pertama di ruby:

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

Upaya di sini adalah memperluas regexp secara rekursif dan mencocokkannya dengan input.
Jika kecocokan yang lebih panjang ditemukan r () akan muncul kembali, jika tidak maka kecocokan akan memeriksa apakah kecocokan terakhir mengkonsumsi seluruh string input dan hanya kemudian mengeluarkannya dengan spasi tambahan.

Shirkrin
sumber
1

CJam, 111 96 91 (atau 62 byte)

Pendekatan serakah yang berulang untuk mencari tahu semua kombinasi ikan yang mungkin dilakukan saat Anda mengulanginya. Benar-benar tidak bermain golf sekarang.

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

Kode berisi beberapa karakter yang tidak patut dicetak, jadi gunakan tautan di bawah ini untuk referensi.

Perbarui Mengodekan string

Akan menambah penjelasan begitu selesai bermain golf

Cobalah online di sini


62 byte

Versi super lambat. Ini pada dasarnya menciptakan semua kombinasi dan pemeriksaan yang sama dengan input.

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

Ini juga mengandung karakter yang tidak patut dicetak, jadi andalkan tautan di bawah ini.

Cobalah online di sini

Pengoptimal
sumber
1

Haskell, 148 146 bytes

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

Pengujian:

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

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

<>> <>>

Penjelasan

Berdasarkan jawaban saya sebelumnya untuk pertanyaan serupa. Algoritme berjalan dalam waktu eksponensial.

Ini berbunyi dari kanan ke kiri.

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

Ini tidak akan mencetak string yang berakhir dengan spasi, meskipun string seperti itu dihasilkan juga, karena lawannya tanpa spasi dihasilkan terlebih dahulu.

Zgarb
sumber
1

JavaScript (ES6), 164

Pemindaian berulang rekursif dan mendalam.
Sebagai program dengan I / O via popup:

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

Sebagai fungsi yang dapat diuji:

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:''

Test suite (dijalankan di Firefox / FireBug console)

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

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

Keluaran

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

Tidak digabungkan hanya fungsi 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 ''
}
edc65
sumber
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[]

ini menggunakan daftar pemahaman untuk beralih pada ikan, memilih orang-orang yang cocok dengan awal dan melanjutkan secara rekursif.

haskeller bangga
sumber
3
Tantangan secara eksplisit meminta program lengkap yang mencetak hasilnya, sebagai lawan dari fungsi.
Zgarb
0

Javascript (122 135 byte)

Bukan yang paling golf di sini, bisa dilucuti sedikit.

Yang ini berdasarkan regex, dan agak sulit untuk mencari tahu apa yang sedang terjadi.

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

Yang ini satu kalimat.

Pada dasarnya, saya memeriksa sintaks dan kemudian saya membagi string berdasarkan karakter dan bergabung bersama.
Ini melempar pengecualian ketika Anda memberikan input yang tidak valid.

Jika tidak bisa melempar pengecualian (126 139 byte):

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

Keduanya satu garis.
Keduanya bekerja dengan cara yang sama.


Terima kasih @ edc65 untuk mendeteksi kasing tepi yang tidak berfungsi dengan baik.


Anda dapat mengujinya di sini (output akan ditulis ke dokumen).

Ini didasarkan pada versi yang melempar pengecualian ketika Anda memasukkan kode yang tidak valid.

(Saat ini, ada bug di tumpukan potongan, Saya telah memposting di metaItu sudah ditanyakan kemarin. Agar berfungsi, saya telah diganti $dengan \x24, yang memiliki output yang sama. Anda dapat membaca tentang bug di sini: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )

Ismael Miguel
sumber
Gagal dengan contoh ><>><>>. Saya pikir ini tidak dapat diselesaikan dengan begitu mudah dengan Regexp, Anda memerlukan beberapa lookahead atau backtrak atau apa pun ...
edc65
@ edc65 DAMN! Untuk saat ini, saya tidak punya solusi. Saya akan mencoba memperbaikinya nanti
Ismael Miguel
0

Scala, 299 Bytes

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

Uji Kasus

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

Keluaran

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

<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<>< 
Dave Swartz
sumber
0

Java, 288 byte

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

Diformat:

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()));
    }
}
Landei
sumber
0

Saya tidak mencari ukuran, tapi di sini ada cara mudah untuk melakukan hal ini di 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(",<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>"));
}
kaendfinger
sumber
0

Python 3, 166 164 byte

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

Solusi rekursif. Terlambat ke pesta, tapi kupikir aku akan mempostingnya karena mengalahkan Sp3000's20 22 byte tanpa harus memaksa jawaban.

Alexander Revo
sumber