मछली की व्याख्या करना (नहीं, वह मछली नहीं)


69

इन पांच ASCII कला समुद्री जीवों पर विचार करें:

  1. मानक मछली: ><>या<><
  2. शीघ्र मछली: >><>या<><<
  3. कठोर मछली: ><>>या<<><
  4. स्ट्रेची मछली: ><<<>या<>>><
  5. केकड़ा: ,<..>,

एक प्रोग्राम लिखें जो वर्णों की एक मनमानी स्ट्रिंग को स्वीकार करता है <>,.। अगर पूरी व्याख्या करने का कोई तरीका है स्ट्रिंग को गैर-अतिव्यापी समुद्री जीवों की श्रृंखला के रूप में , तो स्ट्रिंग को प्राणियों के बीच एकल रिक्त स्थान के साथ पुनर्मुद्रित किया जाना चाहिए। यदि यह व्याख्या असंभव है, तो कुछ भी आउटपुट नहीं होना चाहिए (प्रोग्राम चुपचाप समाप्त हो जाता है)।

उदाहरण के लिए, स्ट्रिंग <><><>को दो मानक मछली बैक-टू-बैक के रूप में व्याख्या की जा सकती है। इसी आउटपुट होगा<>< ><>

एक अन्य उदाहरण के रूप में, स्ट्रिंग ><>><>>में "उदाहरण" हैं ...
(केवल संकेतक के रूप में जोड़े गए ब्रैकेट)

  • कुछ मानक मछली: [><>][><>]>
  • एक तेज़ मछली: ><[>><>]>
  • एक युगल तरीके से एक मजबूत मछली: [><>>]<>>और><>[><>>]

हालांकि, केवल एक मानक मछली और एक मजबूत मछली की जोड़ी [><>][><>>]स्ट्रिंग की पूरी लंबाई के साथ होती है जिसमें मछली साझा करने वाले वर्ण (कोई ओवरलैप नहीं) होते हैं। इस प्रकार उत्पादन के अनुरूप ><>><>>है ><> ><>>

यदि कई तरीके हैं जिनसे स्ट्रिंग की व्याख्या की जा सकती है, तो आप उनमें से किसी एक को प्रिंट कर सकते हैं। (और उनमें से केवल एक प्रिंट करें।) उदाहरण के लिए, <><<<><एक मानक मछली और एक मजबूत मछली के रूप में व्याख्या की जा सकती है: [<><][<<><]या एक तेज मछली और एक मानक मछली के रूप में [<><<][<><]:। तो या तो <>< <<><या <><< <><वैध उत्पादन होगा।


केकड़े सिर्फ मनोरंजन के लिए हैं। चूंकि वे शुरू करने या के साथ समाप्त नहीं है <या >, वे बहुत पहचान करने के लिए (कम से कम नेत्रहीन) आसान होता है। उदाहरण के लिए, स्ट्रिंग

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

जाहिर है उत्पादन का उत्पादन होगा

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

यहाँ स्ट्रिंग के कुछ उदाहरण हैं (प्रति पंक्ति एक) जो कोई आउटपुट नहीं देते हैं:

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

यदि आप अग्रणी को हटाते हैं तो यहां अंतिम स्ट्रिंग को पार्स किया जा सकता है <:

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

(अन्य संभावित आउटपुट हो सकते हैं।)

विवरण

  • इनपुट स्ट्रिंग में केवल वर्ण होंगे <>,.
  • इनपुट स्ट्रिंग कम से कम एक वर्ण लंबी होगी।
  • इनपुट को किसी भी सामान्य तरीके से लें (कमांड लाइन, स्टडिन) और आउटपुट को स्टडआउट करें।
  • बाइट्स में सबसे छोटा कोड जीतता है। ( हैंडी बाइट काउंटर। ) टाईब्रेकर पहले की पोस्ट है।

4
मुझे लगा कि हम मछली के गीतों की व्याख्या करने जा रहे हैं :-(
रेमकोगर्लिच

9
@RemcoGerlich नहीं है कि मछली या तो
केल्विन के

4
अंत में RFC 3889 जनरल फिश ट्रांसफर फॉर्मेट (RFC3500 लागू करना: स्टैंडर्ड फिश ट्रांसफर फॉर्मेट) के लिए एक कोड-गोल्फ!
Sanchises

11
बोनस अंक अगर आप ब्रेनफ *** का उपयोग करते हैं! और अब अपने कार्यक्रम को महसूस करने के लिए अपने कोड को मछली-संगत नहीं है, बेहतर है।
mbomb007

3
मैंने इसे देखा और नीचे स्क्रॉल किया, इस तथ्य से इस्तीफा दे दिया कि यह @ केल्विन हॉबी होगा और कोई नहीं, कोई और नहीं।
सोहम चौधरी

जवाबों:


21

पायथ, 64 48 50 बाइट्स

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

परीक्षण का मामला।


संस्करण जो हमेशा के लिए नहीं है ( ) यहाँ , 52 बाइट्स में।O(9n/3)


यह ब्रूट फोर्स एप्रोच है, सभी सीक्वेंस जेनरेट करते हैं और जांचते हैं कि इनपुट का कोई योग है या नहीं। मछली चित्र पात्रों के रूप में संकुचित, जिसका बाइनरी अभ्यावेदन हैं >और< । पूरी चीज़ को एक कोशिश-पकड़ ब्लॉक में लपेटा जाता है ताकि कोई परिणाम न मिलने पर कोई आउटपुट न हो।

यह एक उपाय है।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
ओ (९ ^ एन) , पवित्र अक्षमता!
mbomb007

2
@ mbomb007 मुझे नियमों में दक्षता के बारे में कुछ भी नहीं दिखता है: P +1!
जॉन ओडम

3
@ mbomb007: संभवतः C ++ कंपाइलर की तुलना में अभी भी बेहतर है।
मार्क के।

27

गैर-नियतात्मक ट्यूरिंग मशीन, 20 राज्य, 52 संक्रमण (882 बाइट्स शायद)

आप इसे बाइट में कैसे बदलते हैं? मैंने इस मशीन को एक ट्यूरिंग मशीन 1 के एलेक्स विनकुर के सिम्युलेटर के साथ निष्पादित करने के लिए फाइलें (बिल्कुल नहीं गढ़ी हुई) लिखी हैं । निम्नलिखित आउटपुट (विवरण फ़ाइल और इनपुट फ़ाइलों को छोड़कर):wc -c

 12 alphabet
 49 meta
740 rules
 81 states
882 total

वैसे भी, मैं अपने कंप्यूटर साइंस ए-लेवल की तैयारी कर रहा था, इसलिए मुझे लगा कि यह एक अच्छा व्यायाम होगा (मुझे नहीं पता कि मैं क्या सोच रहा था)। तो यहाँ परिभाषा है:

परिभाषा

राज्य अमेरिका

वर्णमाला

प्रारम्भिक अवस्था

खाली पात्र

राज्यों को स्वीकार करना

संक्रमण समारोह

(संक्रमण समारोह)

खराब छवि का बहाना है, लेकिन मैं इस बात को कंप्यूटर पर पुनः बताने से परेशान नहीं हो सकता। यदि आप वास्तव में संक्रमण नियमों को समझना चाहते हैं, तो मैं आपको ऊपर दी गई नियम फ़ाइल के माध्यम से पढ़ने की सलाह देता हूं।


मैंने Xरिक्त स्थान के बजाय s का उपयोग किया है क्योंकि रिक्त स्थान यहाँ कल्पना करना कठिन है और सिम्युलेटर वर्णमाला में रिक्त स्थान स्वीकार नहीं करता है।

अवधारणा काफी सरल है - q1 से q4 का उपयोग राइट-फेसिंग मछलियों को पकड़ने के लिए किया जाता है, q11 से q14 का उपयोग वाम-सामना करने वाली मछलियों को पकड़ने के लिए किया जाता है, q15 से q19 को केकड़ों के लिए और q5 से q10 बूँद को बस एक जगह डालने और सभी को हिलाने के लिए उपयोग किया जाता है एक के बाद एक अक्षर।

यदि स्ट्रिंग व्याख्या करने योग्य है, तो यह स्ट्रिंग को स्वीकार करता है और टेप में स्ट्रिंग सम्मिलित किए गए स्थानों के साथ होता है। अन्यथा यह स्ट्रिंग को खारिज कर देता है (मुझे लगता है कि यह मायने रखता है कि कोई आउटपुट नहीं है - टेप को खाली करना बहुत आसान होगा, लेकिन बहुत सारे संक्रमण नियमों की आवश्यकता होगी और मुझे नहीं लगता कि यह संक्रमण फ़ंक्शन को देखने के लिए सुंदर बना देगा)।


1 नोट: इसे संकलित करना मुश्किल है। मैं संपादित करने के लिए किया था src/tape.cppफ़ाइल और की जगह LONG_MAXके साथ 1<<30और उसके बाद के लिए जाने demoनिर्देशिका, Makefile को बदलने के लिए संपादित EXE_BASENAMEसाथ turing.exeऔर निष्पादित make। फिर निर्देशिका में उन फ़ाइलों के साथ जाएं, जिन्हें मैंने लिखा है और निष्पादित करें /path/to/turing/download/src/turing.exe meta


3
पागलपन के लिए स्पष्ट रूप से I +1।
काजकाई

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
BASH64 बूँद के साथ BASH के 383 वर्णों में समान कार्यक्रम शामिल हैं: printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
मार्क के कोवान

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

अजगर 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इसमें प्रति चार में से एक मछली शामिल है।

Bugfixes के लिए 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/else2 वर्णों के लिए वापस आया , लेकिन टर्नरी कार्य करने का एक तरीका हो सकता है।
xnor

चूँकि आप पहले से ही पायथन 3 में हैं, तो आप इसका उपयोग (ab) कर सकते हैं: P*l,s=[],input()
Sp3000

आप बाइट की संख्या को कम करने के लिए भूल गए जब आपने ^ ^
भूमिगत

12

पर्ल, 81 + 1 बाइट्स

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

इस कोड को ऑनलाइन आज़माएं।

यह कोड $_चर में इनपुट की अपेक्षा करता है ; इसे प्रत्येक इनपुट लाइन पर लागू करने के लिए पर्ल के -nस्विच ( +1 बाइट के रूप में गिना जाता है ) के साथ इसे चलाएं , जैसे:

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

यह कोड पर्ल के रेगेक्स इंजन (और विशेष रूप से इसकी एम्बेडेड कोड निष्पादन सुविधा) का उपयोग करता है ताकि एक कुशल बैकट्रैकिंग खोज की जा सके। पाई जाने वाली अलग-अलग मछलियों को @aसरणी में एकत्र किया जाता है , जिसे मैच सफल होने पर कठोर और मुद्रित किया जाता है।

इस कोड को भी पर्ल 5.10+ का उपयोग करता है sayसुविधा है, और इसलिए साथ चलाने की जानी चाहिए -Eया -M5.010स्विच (या use 5.010;इस तरह के आधुनिक सुविधाओं को सक्षम करने के लिए)। परंपरा से, भाषा के किसी विशेष संस्करण को सक्षम करने के लिए पूरी तरह से उपयोग किए जाने वाले ऐसे स्विच बाइट की गिनती में शामिल नहीं होते हैं।

वैकल्पिक रूप से, यहां एक 87-बाइट संस्करण है जिसके लिए किसी विशेष कमांड-लाइन स्विच की आवश्यकता नहीं है। यह स्टड से एक पंक्ति को पढ़ता है, और परिणाम (यदि कोई है) को स्टडआउट में प्रिंट करता है, बिना किसी ट्रेलिंग लाइनफीड के:

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

Ps। यदि आउटपुट की शुरुआत में एक अतिरिक्त स्थान की अनुमति दी गई थी, तो मैं तुच्छ रूप से दो और बाइट्स बचा सकता था:

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


@ Sp3000: धन्यवाद! यह मछली की प्रत्येक दिशा के लिए एक बाइट को बचाता है।
इल्मरी करोनें

6

पायथन 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 
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>

और अनगुल्ड संस्करण:

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:]कुछ बाइट्स को बचाने के लिए कर सकते हैं ।
मैथमैनंदन

4

सी # - 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"";
    }
}

बेनाम: ओह, तुम मुझे मिल गया। नहीं देखा था कि यह एक एकाधिक परिभाषा है। शोर को कम करने के लिए टिप्पणी निकाली।
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
यदि इनपुट को विभाजित नहीं किया जा सकता है तो यह एक त्रुटि संदेश को प्रिंट करता है, क्योंकि चुपचाप विफल होने का विरोध करता है।
जर्गर्ब

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 तो अजीबता को नजरअंदाज: पी


3
PPCG में आपका स्वागत है। यह एक कोड-गोल्फ चुनौती है, जिसका अर्थ है कि आपको यथासंभव कुछ वर्णों के साथ कोड लिखने का प्रयास करना चाहिए। एक शुरुआत के लिए आप एकल अक्षर चर का उपयोग कर सकते हैं (उदाहरण mके लिए msg, के sबजाय 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(' ')

यहाँ प्रयास एक 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

हास्केल, 148 146 बाइट्स

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

परिक्षण:

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

$ गूंज "> <> <>>" | 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

जावास्क्रिप्ट (ईएस 6), 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:''

टेस्ट सूट (फ़ायरफ़ॉक्स / फायरबग कंसोल में चलाएं)

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

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

उत्पादन

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

अनफॉर्म्ड बस के फंक्शन

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
चुनौती स्पष्ट रूप से एक पूर्ण कार्यक्रम के लिए पूछती है जो एक फ़ंक्शन के विपरीत, अपने आउटपुट को प्रिंट करता है।
जर्गर्ब

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

@ edc65 डैम! अभी के लिए, मेरे पास कोई हल नहीं है। मैं बाद में ठीक करने की कोशिश करूँगा
इस्माइल मिगुएल

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

मैं आकार के लिए नहीं जा रहा था, लेकिन यहां डार्ट में ऐसा करने का तरीका समझना आसान है।

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 बाइट्स के बिना उत्तर को भंग करने के लिए मजबूर करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.