বেফিংজের জন্য হ্যালটিং সমস্যা সমাধান করুন


29

আসুন একটি সাধারণ 2D ভাষা সংজ্ঞা দিন, যা আমরা অবিশ্বাস্যভাবে মূল নামটি বেফিংজ দেব । বেফিংয়ের 5 টি নির্দেশনা রয়েছে:

  • <>^vবেশিরভাগ 2 ডি এসোলংয়ের মতোই নির্দেশ নির্দেশিকাটি তাদের নিজ নিজ দিক থেকে পুনর্নির্দেশ করুন।
  • . একটি অপ- অপ হয়।

উপরের-বাম কোণে ডানদিকে যেতে নির্দেশ পয়েন্টারটি শুরু হয়। যদি নির্দেশ পয়েন্টারটি একটি প্রান্তে চলে যায় তবে প্রোগ্রামটি থামে। প্রতিটি বেফিং প্রোগ্রাম অবশ্যই স্পষ্টভাবে থামবে বা অসীম লুপে যাবে যা কিছুই করে না। এখানে দুটি উদাহরণ দেওয়া হল:

স্থগিত:

>.v
..<

অ স্থগিত:

>....v
..v..<
..>v..
^..<..

থামানো সমস্যা টিউরিং-সম্পূর্ণ ভাষার জন্য সমাধানযোগ্য নয়, তবে এটি এটির জন্য। আপনার কাজটি এমন একটি প্রোগ্রাম (বা ফাংশন) লিখতে হবে যা বেফিং প্রোগ্রামকে উপস্থাপন করে একটি স্ট্রিং নেয় এবং এটি থেমে যায় বা না তার উপর নির্ভর করে সত্যবাদী বা মিথ্যা মান দেয়।

  • আপনি ধরে নিতে পারেন যে ইনপুটটিতে কেবল এই অক্ষর থাকবে এবং একটি আয়তক্ষেত্র গঠনের জন্য স্পেস দিয়ে প্যাড করা হবে।
  • নির্দেশাবলীর জন্য আপনি পাঁচটি অক্ষরের কোনও সেট ব্যবহার করতে পারেন (উদাঃ adws )।

পরীক্ষার মামলা

স্থগিত:

.

v>
>^

....v....
....>...v
.^..<....
.......v<
.......v.
....^..<.

v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^<

অ স্থগিত:

>..v
^..<

>v<
v<.
>v.
v<.
>.^

>.>.>.v
.><.<.<

এটি , তাই সংক্ষিপ্ততম প্রোগ্রামটি (বাইটে) জিতেছে।


아희 (অহুই) সম্পর্কে কী ?
জংহওয়ান মিন

কিছু পরীক্ষার ক্ষেত্রে যেখানে প্রতিটি তীর হিট হয় না ভাল হবে।
xnor

টিউরিং প্রমাণ করেছে যে হ্যালটিং সমস্যাটি কোনও টিউরিং-সম্পূর্ণ ভাষার জন্য সমাধানযোগ্য নয়, তাই আমাকে একটি নকল তৈরি করতে হয়েছিল যা টিউরিং সম্পূর্ণ ছিল না। এমন একটি ভাষা যা সর্বশেষে থামবে টিউরিং সম্পূর্ণ নয়।
ফলটি Esolanging

1
আমাদের কাছে এমন কোনও উদাহরণ নেই যেখানে পথটি 90-ডিগ্রিবিহীন ঘুরিয়ে দেয় >..>.বা করে তোলে ><
xnor

2
@ পাইরুলেজ কারণ আমি চেয়েছিলাম যে দিকনির্দেশক গতি প্রক্রিয়াকরণ চ্যালেঞ্জের অংশ হতে পারে।
এএসএলং ফল

উত্তর:


4

ES6 (জাভাস্ক্রিপ্ট), 111, 101 বাইট

সম্পাদনা: আউটপুট মানগুলি Y এবং N এর পরিবর্তে সত্য এবং মিথ্যাতে পরিবর্তিত হয়েছে , আরও 10 বাইট ছাঁটাই করতে

Golfed

F=(I,M=[...I],c=0,i)=>(i={j:v=I.search`\n`+1,k:-v,h:-1,l:1,q:i,0:0}[M[c]])?F(I,M,c+i+(M[c]=0),i):i!=0

পরীক্ষা

F=(I,M=[...I],c=0,i)=>(i={j:v=I.search`\n`+1,k:-v,h:-1,l:1,q:i,0:0}[M[c]])?F(I,M,c+i+(M[c]=0),i):i!=0  

//Alphabet Map
tr={
'<':'h',
'>':'l',
'^':'k',
'v':'j',
'.':'q',
'\n':'\n'
};

//Test
T=(I,A)=>{
console.log({"Y":"#Halting","N":"#Non-Halting"}[A]);
console.log("I=\n",I,"\nF(I)=",O=F([...I].map(s=>tr[s]).join('')));
console.log('NY'[O*1] == A ? "OK !" : "NOT OK !");
}

//Halting
T(
`>.v
..<`
,'Y');

//Non-Halting
T(
`>....v
..v..<
..>v..
^..<..`
,'N');

//Halting
T(
`.`
,'Y')

//Halting
T(
`v>
>^`
,'Y');

//Halting
T(
`....v....
....>...v
.^..<....
.......v<
.......v.
....^..<.`
,'Y');

//Halting
T(
`v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^<`
,'Y');

//Non-Halting
T(
`>..v
^..<`
,'N');

//Non-Halting
T(
`>v<
v<.
>v.
v<.
>.^`
,'N');

//Non-Halting
T(
`>.>.>.v
.><.<.<`
,'N');

নমুনা আউটপুট

#Halting
I=
>.v
..< 
F(I)= true
OK !    

#Non-Halting
I=
>....v
..v..<
..>v..
^..<.. 
F(I)= false
OK !

#Halting
I=
 . 
F(I)= true
OK !

#Halting
I=
v>
>^ 
F(I)= true
OK !

#Halting
I=
....v....
....>...v
.^..<....
.......v<
.......v.
....^..<. 
F(I)= true
OK !

#Halting
I=
v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^< 
F(I)= true
OK !

#Non-Halting
I=
>..v
^..< 
F(I)= false
OK !

#Non-Halting
I=
>v<
v<.
>v.
v<.
>.^ 
F(I)= false
OK !

#Non-Halting
I=
>.>.>.v
.><.<.< 
F(I)= false
OK !

আপনি কেবল জাভাস্ক্রিপ্টের মতোই আউটপুট ব্যবহার করতে পারবেন না Yএবং উভয় সত্যইN
35

3

পাইথন 2 , 116 105 বাইট

x=1
X=Y=y=0
H=[]
G=input()
while(X,Y,x,y)not in H:H+=[(X,Y,x,y)];C=ord(G[Y][X]);x=C%3-1;y=C%5-1;X+=x;Y+=y

এটি অনলাইন চেষ্টা করুন!

চ্যালেঞ্জটি পুরানো, তবে আমি বুঝতে পেরেছি যেহেতু এটি সবচেয়ে সংক্ষিপ্ত পাইথন, আমি এটি পোস্ট করব। ইনপুটটি স্ট্রিংগুলির একটি তালিকা, তবে ব্যবহৃত অক্ষরগুলি অস্বাভাবিক।

> G
< B
v C
^ F
. L

উদাহরণস্বরূপ, তৃতীয় থামার উদাহরণটি রূপান্তরিত হয় ['LLLLCLLLL', 'LLLLGLLLC', 'LFLLBLLLL', 'LLLLLLLCB', 'LLLLLLLCL', 'LLLLFLLBL']। আউটপুটটি প্রস্থান কোডের মাধ্যমে হয়, 0 (সাফল্য) অ-থামার জন্য এবং 1 (ত্রুটি) থামার জন্য। কোন পরামর্শ বা কৌশল প্রশংসা।


2

বেফুঞ্জ -98 (পাইফুঞ্জ) , 217 209 200 বাইট

#v10dpf1dp12dp3dpk
 >#v~:a-#v_$10dp1dg1+1dp >
v  >10dp;>0dg1dgp0dg1+0dp^;f1dp
>0dg1dgg:'^-#v_n1-v
^<v01_v#!->':<
  <   >:'<-#v_01-0>   v
v^pd1+gd3gd1[:'v-#v_01>3dp2dpndg1dgp
>0dg2dg+0dp ^ @.!;>:'.-#;_

এটি অনলাইন চেষ্টা করুন!

একটি বেফিংজ থামানো সমস্যার একটি বেফঞ্জ সমাধান দরকার। সত্যের জন্য 0 এবং মিথ্যা হিসাবে 1 প্রদান করে। গ্রিডে ইনপুটটি 1,15 থেকে শুরু করে এবং তারপরে জিরো দিয়ে প্রতিস্থাপন করে উপরে চলে যায়। আমরা একটি শূন্য হিট করার সাথে সাথে আমরা জানি এটি লুপ হয়ে যায়। > <^ V এর বাইরে যে কোনও কিছু। এবং শূন্যকে প্রোগ্রামটি থামানোর জন্য বিবেচনা করা হয়, যার মধ্যে আমরা প্রোগ্রামের চারপাশে যে জায়গাগুলি পেয়েছি তার সীমানাটি গ্রিডে কিছুটা অফসেট রেখে এটি অন্তর্ভুক্ত করে।

কয়েকটি কামড় শেভ করার একটি সহজ উপায় হ'ল> <^ v এর পরিবর্তে সংখ্যা ব্যবহার করা। তবে আমি এটির মতো মূল্যবান মনে করি না।


A befinge halting problem needs a befunge solution.অবিকল। +1
Draco18s

1

টার্টল্ড , 146 বাইট

!u[*.[ r+.]l[ l]dr_+]#*#[ u]d[ (.r)(>.r{.r}@>)(v.d{.d}@v)(<.l{.l}@<)(^.u{.u}@^)(*@0' )],@1(0@0)(v' d)(<' r)(>' l)(^' d)[ u]d[ l]r[ [ r]l[ ' l]dr],

এই প্রোগ্রামটি I / O কে অন্যভাবে গ্রহণ করে: দয়া করে সর্বশেষটি সহ প্রতিটি লাইন একটি স্থান দিয়ে শেষ করুন। টার্টল্ড নিউলাইনগুলি পছন্দ করেন না, কারণ এটি অক্ষরের দ্বিতীয় মাত্রার জন্য গ্রিড ব্যবহার করে।

এটি অনলাইন চেষ্টা করুন!

লুপের জন্য 0 চিরকাল, 1 টি থামার জন্য।

সাধারণ ব্যাখ্যা:

এটি গ্রিডে ইনপুট লিখেছে, তারপরে এটি তীরগুলি গ্রিডের চারপাশে যে পথটি তৈরি করেছে এটি অনুসরণ করে, প্রতিটি তীরটিকে একটি * দিয়ে যাওয়ার সাথে প্রতিস্থাপন করে এবং চরটি দিকের দিকটিও সংরক্ষণ করে। যদি এটি একটি * এর আগে মুখোমুখি হয় একটি তীরের মুখোমুখি হয় তবে প্রোগ্রামটি থামবে না, সুতরাং এটি 0লুপটি প্রস্থান করে, চরটি সেট করে । অন্যথায়, এটি গ্রিডের শেষ প্রান্তে এসে লুপটি প্রস্থান করবে। এটি চর বর্ণ লিখবে। যদি এটি গ্রিডের শেষ প্রান্তে আঘাত করে তবে গ্রিডটিতে ফিরে আসার জন্য এটি চর ভারে সঞ্চিত দিকনির্দেশটি ব্যবহার করে 1এবং থামের জন্য চর ভেরি সেট করে । চরটি যদি বাস্তবে 0 হয় তবে কোনও দিকনির্দেশ নয়, এটি এখনও ফিরে আসার দরকার নেই, কারণ এটি এখনও রয়েছে এবং এটি এটিকে আবার সেট করে 0। এটি গ্রিডটি সাফ করে দেয়, তারপরে 1থামের জন্য লেখার জন্য চিঠিটি লিখেছে , অন্যথায় 0



1

জাভাস্ক্রিপ্ট (ES6), 158 127 বাইট

f=(a,x=0,y=0,d=1,e=0,c=a[y]&&a[y][x])=>c<'~'?(c>'.'&&(a[y][x]='~',d=(c=='>')-(c=='<'),e=(c=='v')-(c=='^')),f(a,x+d,y+e,d,e)):!c

দ্বি-মাত্রিক চরিত্রের অ্যারে হিসাবে ইনপুট নেয় এবং থামার trueজন্য এবং falseঅসীম লুপের জন্য ফিরে আসে । দর্শনীয় দিকের অক্ষরগুলি ~এটিকে পুনরাবৃত্তভাবে অনুসরণ করে যেমন সেট করে কাজ করে । সম্পাদনা করুন: পুনরাবৃত্তি করার আগে আমার দিকনির্দেশক ভেক্টর আপডেট করে 31 বাইট সংরক্ষণ করা হয়েছে।

নির্দেশের অক্ষরগুলিকে ( 1=^ 4=< 5=. 6=> 9=v) ব্যবহার করে আমাকে 101 বাইটে নামিয়ে নিয়ে যায়:

f=(a,x=0,y=0,d=1,e=0,c=a[y]&&a[y][x])=>+c?(c-5&&(a[y][x]='0',d=~-c%4,e=~-(c>>2)),f(a,x+d,y+e,d,e)):!c

> দ্বি-মাত্রিক চরিত্রের অ্যারে হিসাবে ইনপুট নেয় কী আলাদাভাবে ফর্ম্যাট করা ইনপুট অনুমোদিত? (ফ্ল্যাট স্ট্রিং থেকে অ্যারেতে যাওয়ার জন্য বাইটগুলিও নিতে হবে)।
জেপেলিন

@zeppelin আমার বিশ্বাস এটি অনুমোদিত is উদাহরণস্বরূপ meta.codegolf.stackexchange.com/q/2214/17602 দেখুন ।
নিল

রেফারেন্সএরর: f সংজ্ঞায়িত করা হয়নি
l4m2

@ l4m2 বাহ, আমি আবার এটি করেছি, আমি f=বাইট গণনায় অন্তর্ভুক্ত করেছি তবে কোড নয় ...
নীল

1

স্মাইলব্যাসিক, 158 145 বাইট

যদি একই তীরটি একাধিকবার মুখোমুখি হয় তবে প্রোগ্রামটি কখনও থামবে না। যখন নির্দেশ পয়েন্টারটি একটি তীরটি অতিক্রম করে, তখন এটি একটি পৃথক প্রতীক দিয়ে প্রতিস্থাপিত হয়, যার ফলে যদি ফাংশনটি আবার পৌঁছে যায় তবে 0টি ফিরে আসবে। আইপি যদি সীমা ছাড়িয়ে যায় তবে এটি 1 প্রদান করে।

DEF H P@L
C=VAL(P[Y][X])IF C>8THEN?0RETURN
IF C THEN D=C-1P[Y][X]="9
X=X+!D-(D==1)Y=Y+(D==2)-(D>2)IF X+1&&Y+1&&Y-LEN(P)&&X-LEN(P[0])GOTO@L
?1
END

স্ট্রিংগুলির অ্যারে হিসাবে ইনপুট নেয়। <any non-digit chracter>, 1, 2, 3, 4= ., >, <, v,^


0

পাইথন 2, 182 বাইট

m,v,d,x,y=input(),[],'>',0,0
try:
 while 1:
  if[x,y]in v:print 0;break
  c=m[y][x]
  if c!='.':d=c;v+=[[x,y]]
  if d in'><':x+=[-1,1][d=='>']
  else:y+=[-1,1][d=='v']
except:print 1

ইনপুট হিসাবে একটি স্ট্রিং অ্যারে লাগে। আমাকে আরও গল্ফ করতে হবে তবে আপাতত নির্বাচনের উপর চাপ দেওয়ার সময় এসেছে।

Ungolfed:

input = input()

visited = [  ] 

dir = ">"
x=0
y=0

try:
    while True:
        if[x,y]in visited:print False;break
        char=input[y][x]
        if char!=".":
            dir=char
            visited+=[[x,y]]

        if dir==">":
            x+=1
        if dir=="<":
            x-=1
        if dir=="v":
            y+=1
        if dir=="^":
            x-=1
except:
    print True

আরে, আপনি যদি মূল অংশটি ব্যবহারের বাইরে নিয়ে যান এবং কেবল সি = মি [ওয়াই] [এক্স] চেষ্টা করে দেখেন তবে কি হয়? এটি আপনাকে 1/0 দিয়ে বিরতি প্রতিস্থাপনের পাশাপাশি ইনডেন্টগুলি হ্রাস করার অনুমতি দেয়।
ধ্বংসাত্মক লেবু

1
[-1,1][d=='v'] -> 2*(d>'>')-1এবং [-1,1][d=='>'] -> 2*(d>'<')-1মোট 6 বাইট সংরক্ষণ করুন।
কেদে

এর সঠিক উত্তর["<>"]
ফেয়ারসাম

0

ক্লোজার, 143 বাইট

#((fn[p v i s](if-let[v({\> 1\< -1\^(- s)\. v\v s}(get % p))](if(neg? i)1(recur(+ p v)v(dec i)s))))0 1 1e9(+(count(take-while(set"<>v^.")%))1))

4 রাষ্ট্র আর্গুমেন্ট সহ একটি ফাংশন: অবস্থান p, বেগ v, পদক্ষেপ সূচক iএবং এক লাইনের আকার s। রিটার্নস 1যদি আমরা 10 ^ 9 পদক্ষেপ এবং এ সীমার বাইরে যাননি nilঅন্যথায়। আসলে আমাদের নিশ্চিত হতে কতগুলি পদক্ষেপ পরীক্ষা করতে হবে , (count %)? আমি মনে করি এটির চেয়েও অনেক বেশি একই এনওপিটিকে অনুভূমিকভাবে এবং উল্লম্বভাবে অনুসরণ করা যেতে পারে।

এটির মতো বলা যেতে পারে (সাধারণ স্ট্রিংগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে, সীমা getছাড়িয়ে nilগেলে ফিরে আসে ):

(def f #( ... ))
(f ">....v\n..v..<\n..>v..\n^..<..")
(f "v>\n>^")
(f "....v....\n....>...v\n.^..<....\n.......v<\n.......v.\n....^..<.")

রাষ্ট্রীয় রূপান্তরগুলি (+1, -1, + গুলি, -s) অভিধানে এনকোড করা আছে {\> 1\< -1\^(- s)\. v\v s}


গ্রিড অক্ষরের সংখ্যা 4 গুণ পর্যাপ্ত হওয়া উচিত: যদি পয়েন্টারটি একই আগত দিকের সাথে একই চরিত্রে ফিরে আসে, তবে এটি অসীম লুপে রয়েছে।
গ্রেগ মার্টিন

0

পাইথন 2/3, 201 192 বাইট

def f(x):
 X=Y=b=0;a=1;D={}
 while len(x)>Y>-1<X<len(x[Y]):
  try:
   a,b={'>':(1,0),'^':(0,-1),'<':(-1,0),'v':(0,1)}[x[Y][X]]
   if(X,Y)in D:return 0
  except:0
  D[X,Y]=0;X+=a;Y+=b
 return 1

এটি অনলাইন চেষ্টা করুন!

এর সঠিক উত্তর দেয় ["<>"]


আমি বিশ্বাস করি আপনি একটি ফাংশন থেকে সম্পূর্ণ প্রোগ্রামে পরিবর্তন করে বেশ কয়েকটি বাইট সংরক্ষণ করতে পারেন। আপনি প্রতিস্থাপন করতে পারেন def f(x):সঙ্গে x=input()0 বাইট পার্থক্য সঙ্গে, তারপর, অতিরিক্ত খাঁজ (-8 বাইটস) অপসারণ তারপর প্রতিস্থাপন return xসঙ্গে exit(x)(প্রতি মঞ্জুরিপ্রাপ্ত মেটা ঐক্যমত্য ,) অন্য 2 বাইট জন্য। যাইহোক, দুর্দান্ত সমাধান!
উভচর

0

জাভা, 477

আমি জানি যে এটি জিতেছে না, এন = এবং সম্ভবত আরও বেশি গল্ফ করা যেতে পারে তবে এটি অন্যান্য উত্তরগুলি কী ব্যবহার করে তা অনুরূপ পদ্ধতিতে প্ররোচিত করে তবে লকআপগুলি সম্পাদন করতে এটি হ্যাশম্যাপ ব্যবহার করে। ইনপুটটি কোনও চিহ্ন নেই বলে প্রতীকগুলি <<^ v এবং এটি ব্যতীত অন্য কিছু ব্যবহার করছে। ইনপুট অর্গগুলির মাধ্যমে আসে।

GOLFED

import java.util.*;interface B{static void main(String[]a){HashMap<String,Byte>h=new HashMap<>();int x,y=0;for(String s:a){x=0;for(char c:s.toCharArray()){if("><^v".indexOf(c)>-1)h.put(x+","+y,(byte)c);x++;}y++;}x=0;y=0;int d=0;int D=0;while(x>-1&&x<a[0].length()&&y<a.length&&y>-1){Byte v=h.get(x+","+y);if(v!=null){if(v==0){System.out.print(0);return;}d=(v<85)?"<>".indexOf(v)*2-1:0;D=(v>84)?"^v".indexOf(v)*2-1:0;}h.replace(x+","+y,(byte)0);x+=d;y+=D;}System.out.print(1);}}

UNGOLFED

আমদানি করুন java.util। *;

interface B{
    static void main(String a[]) {
        HashMap<String, Byte> h = new HashMap<>();
        int x, y = 0;
        for(String s : a) {
            x = 0;
            for(char c : s.toCharArray()) {
                if ("><^v".indexOf(c) > -1) h.put(x + "," + y, (byte) c);
                x++;
            }
            y++;
        }
        x = 0;
        y = 0;
        int d = 0;
        int D = 0;
        while(x > -1 && x < a[0].length() && y < a.length && y > -1) {
            Byte v = h.get(x + "," + y);
            if(v != null) {
                if(v == 0) {System.out.print(0); return;}
                d = (v < 85) ? "<>".indexOf(v)*2-1 : 0;
                D = (v > 84) ? "^v".indexOf(v)*2-1 : 0;
            }
            h.replace(x + "," + y, (byte) 0);
            x += d;
            y += D;
        }
        System.out.print(1);
    }
}

ব্যাখ্যা শীঘ্রই আসছে!


একটি ছোট জিনিস: আপনি স্থান পরিবর্তন String a[]করতে String[]aএবং বাদ দিতে পারেন ।
ফলটি Esolanging

আপনি varযদি জাভা 10 ব্যবহার করেন তবে আপনি অনেকগুলি স্থানেও ব্যবহার করতে পারেন
এসোসোলিং ফল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.