একটি বিমানে বৈধ সাপ


23

ভি হার্টের একটি ভিডিওর দ্বারা অনুপ্রাণিত (যা সম্ভাব্য চ্যালেঞ্জের ধারণাগুলিতে ভরপুর একটি ধন)

একটি সাপ একই দৈর্ঘ্যের অংশগুলি নিয়ে গঠিত এবং প্রতিটি বিভাগের মধ্যে সংযোগ সোজা হতে পারে বা 90 ° টার্ন করা যায়।
আমরা এমন একটি সাপ এনকোড করতে পারি (একটি ঘূর্ণন অবধি, যা প্রাথমিক দিকের উপর নির্ভর করে) একটি সরু লিখে , বাঁকগুলির দিক (সোজা / বাম / ডান) লাগে takes এইটি, উপরের বাম দিকে শুরু করে এবং ডান দিকে নির্দেশ করছে

-+    +--+    SR    RSSR
 |  +-+  |     S  RSL  S
 +--+  --+     LSSL  SSR

সরু দ্বারা প্রতিনিধিত্ব করা হবে SRSLSSLRLRSSRSRSS

এবং অবশ্যই একটি পরিকল্পনাকারী সাপ নিজেকে ছেদ করতে পারে না (এর মতো SSSSLLLSS), এটি একটি ভয়াবহ পিক্সिलेটেড গেমের ওভারে পরিণত হবে।

আপনার কাজ হ'ল স্লাইথটি বৈধ আছে কি না তা নির্ধারণ করা (কমপক্ষে একটি স্ব-ছেদ দেওয়ার ফলাফল)

ইনপুট
একটি স্ট্রিং অক্ষর থেকে তৈরি SLRসঙ্গে 2 < length < 10000
আউটপুট
কিছু Truthy যদি এটি একটি বৈধ হড়কাতে হড়কাতে চলা এবং কিছু Falsey যদি তার না।

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

__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL

__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

আপনি এখানে স্লিটার আঁকতে পারেন (আর ও এল ফ্লিপড, তবে এটি বৈধতার উপর প্রভাব ফেলবে না)


প্রোগ্রামে ইনপুটটি করতে হবে বা এটি কোনও ফাইল থেকে পড়া যায়?
এমআই রাইট

1
এসআরআরআরটি সত্য বা মিথ্যা হওয়া উচিত? এটি সংযোগ দেয় কিন্তু নিজেকে ছেদ করে না।
orlp

স্পর্শকারী সাপগুলি এনএসএফডাব্লু চ্যালেঞ্জ?
ইওয়ান

3
আপনি যদি SRRRপ্রতি বিভাগে এক বর্গক্ষেত্রের সাথে একটি গ্রাফ পেপার আঁকেন তবে এটি ওভারল্যাপ হয়ে যাবে এবং সুতরাং এটি অবৈধ, কেবল RRRতবে, ওভারল্যাপ ছাড়াই ঠিক 2x2 বর্গক্ষেত্রটি দখল করবে (ক্লাসিক গেমের মতো)
ডেনডেনডো

অনুরূপ তবে একটি সদৃশ নয় (বিভিন্ন উদ্দেশ্য এবং বিভিন্ন নির্মাণের বিধিগুলির কারণে)।
ট্রাইকোপ্লাক্স

উত্তর:


20

পাইথ, 22 20 বাইট

ql{m+=Z*=T^.j)hCdzlz

এটি নিজে চেষ্টা করুন বা টেস্টসাইটটি চালান

এসআরএল এর এএসসিআইআই মানগুলি যথাক্রমে 83, 76, 82 নোট করুন I

i 83 + 1 = 1
আমি 76 + 1 = i
আমি 82 + 1 = -আই

এখান থেকে আমি কেবল বর্তমান অবস্থান এবং বর্তমান দিকনির্দেশের জন্য একটি পরিবর্তনশীল রাখি। প্রতিটি চরিত্রের জন্য আমি উপরের জটিল সংখ্যার সাথে বর্তমান দিকটি গুণ করি, তারপরে এটি বর্তমান অবস্থানে যুক্ত করি।

শেষে আমি যাচাই করা সমস্ত পর্যালোচনা অবস্থান অনন্য কিনা তা পরীক্ষা করে দেখুন।


এসআরআরআর = সত্য ????
ইওয়ান

@ ইভান কাছাকাছি পরিদর্শন করার সময় - আমি নিশ্চিত নই যে এটি মিথ্যা হওয়া উচিত কি না। মাথা এবং লেজ সংযোগ করে, তবে ছেদ করে না।
orlp

এসআরআরএস সম্পর্কে কি?
ইভান

@ ইভান একই গল্প - সংযোগ কিন্তু কোনও ছেদ নেই। এইগুলির জন্য কী ফিরিয়ে দেওয়া উচিত তা প্রশ্ন পরিষ্কার নয়।
orlp

1
আপনি কীভাবে এসআরআরআর আঁকবেন?
ইওয়ান

6

সিজেম, 30 বাইট

q{iF%U+:U[XWe4W1e4]=T+:T}%__&=

শিগগিরই অনুসরণ করার ব্যাখ্যা।

এটি এখানে অনলাইনে চেষ্টা করুন বা পুরো স্যুটটি চালান


জঘন্য, দ্রুত ছিল। আমি নিজে এটিকে সমাধান করার জন্য এমনকি একটি অ্যালগরিদম সম্পর্কেও ভাবিনি।
ডেনডেনডো

এসআরআরএস = সত্য ???
ইভান

@ ইয়ান উম্ম, আমরা কি ধরে নিচ্ছি যে প্রাথমিকভাবে 0 টি পূরণ করা হয়েছে এবং গণনা করা হচ্ছে?
অপ্টিমাইজার

1
আমি অনুমান করি যে আমি এটি সাপের খেলার মতো ব্যাখ্যা করছি, যেখানে পদক্ষেপগুলি স্থানের ব্লকগুলি গ্রহণ করে। এবং আপনারা কেউ কেউ এটিকে শূন্য প্রস্থের লাইন হিসাবে ব্যাখ্যা করছেন
ইওয়ান

@ ইভান আমার প্রশ্নটি যদিও কিছুটা আলাদা। যখন আমাদের একটি চল আছে, বলুন S, এর অর্থ কি সাপটি ইতিমধ্যে উভয়কে (0,0) এবং (1,0) দখল করে নিয়েছে?
অপ্টিমাইজার

6

জাভাস্ক্রিপ্ট (ES6), 84 89

পরীক্ষার জন্য ফায়ারফক্সে স্নিপেট চালান।

কিছু নোট:

  • সাপ এফ অ্যারের ভিতরে চলে যায়। আমন্ত্রিত কক্ষগুলির মান রয়েছে undefined। প্রথম দর্শনে, টিলড অপারেটর এটি -1 এ পরিবর্তন করে যা সত্য truth অবশেষে, দ্বিতীয় বারে 0 তে মান পরিবর্তন হয় যা everyমিথ্যা হয় এবং লুপটি মিথ্যা ফেরত সমাপ্ত করে।
  • জেএস-তে, অ-ক্যানোনিক সূচকগুলি সহ অ্যারের উপাদানগুলি (সংখ্যাসূচক বা নেতিবাচক নয়) কোনওভাবে 'লুকানো' থাকে তবে তাদের উপস্থিতি থাকে। এখানে আমি কোনও সমস্যা ছাড়াই নেতিবাচক সূচকগুলি ব্যবহার করি।

F=s=>[...s].every(c=>f[p+=[1,1e5,-1,-1e5][d=d+{R:1,L:3,S:0}[c]&3]]=~f[p],d=p=0,f=[])

//TEST
$('#S').on('keyup mouseup change', Draw);

function Draw(){
  var s = S.value.toUpperCase();
  if (!s) {
    C.width = C.height = 0;
    return
  }
  C.width = 600;
  C.height = 400;
  
  var ctx = C.getContext("2d");  
  var px, py, int=0;
  
  ctx.strokeStyle = '#008';
  ctx.lineWidth = 2;
  ctx.translate(300,200);
  ctx.beginPath();
  ctx.moveTo(0,0);
  
  [...s].forEach(c=>{
    (f[p+=[1,1e4,-1,-1e4][d=d+{R:1,L:3,S:0}[c]&3]]=~f[p])
    ? 1 
    : (++int)
    if (int==1) ctx.stroke(), ctx.strokeStyle = '#800', ctx.beginPath(), ctx.moveTo(10*px,10*py);
    
    py = (p / 1e4 | 0) - 5e3;
    px = (p % 1e4) -5e3
    ctx.lineTo(10*px, 10*py);
  }, d=0,p=50005000,f=[]);
  ctx.stroke();
  
}

valid=["SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS",
"SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR",
"SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS",
"SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS",
"LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL"];
invalid=["SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS",
"SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS",
"LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"];

V.innerHTML=valid.map(s=>F(s)+' '+s).join('\n')
I.innerHTML=invalid.map(s=>F(s)+' '+s).join('\n')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Type to check and draw <input id=S>
(better full page)<br>
<canvas id=C width=1 height=1 ></canvas><br>
Valid<pre id=V></pre>
Invalid<pre id=I></pre>


6

টিআই-বেসিক, 49 56 53 51 বাইট

abs(e^(i)-cumSum(i^cumSum(seq(inString("SL",sub(Ans,X,1))-1,X,1,length(Ans→X
SortA(∟X
min(ΔList(∟X

অরল্পের পদ্ধতির অনুরূপ, এটি সাপ দ্বারা পরিদর্শন করা জটিল প্লেনের সমস্ত পয়েন্টের একটি তালিকা তৈরি করে, উত্স থেকে শুরু করে। যদি তালিকার কোনও সদৃশ উপাদান না থাকে তবে কোডটি কিছু ইতিবাচক মান দেয়। মনে রাখবেন যে 999 টিরও বেশি উপাদানের একটি স্ট্রিংয়ে ক্যালকুলেটর পর্যাপ্ত দীর্ঘ তালিকা তৈরি করতে অক্ষম হবে এবং ত্রুটি হবে।

সম্পাদনা: জটিল প্লেনে কোনও দুটি জাল পয়েন্ট ই e i থেকে একই দূরত্ব হতে পারে না বলে কদর্য ব্যয়ে দুটি বাইট সংরক্ষণ করা হয়েছে।


5

টিআইবি-বেসিক, 60 58 বাইট

সম্পাদনা: নীচের সমস্ত কিছু উপেক্ষা করুন: একটি কার্যকারী টিআই-বেসিক সমাধান এখানে থোমাস-কোয়া দ্বারা । উড়ান যে!

হয় [(-)]কী, ও ANS হয় [2ND]->[(-)]। কোপের ( [ALPHA]->[+]সাফল্যের পরে) নামটির পরে সাপের নির্দেশাবলীর সংযুক্ত করে এটি চালান program উদাহরণস্বরূপ, আপনি যদি প্রোগ্রামটির নাম "SNAKE" করেন তবে আপনি ওপিতে টেস্ট কেসটি চালিয়ে যাবেন "SRSLSSLRLRSSRSRSS":prgmSNAKE

seq(inString("SRL",sub("0"+Ans,I,1)),I,1,length(Ans
Disp 0<sum(⁻1+2seq(Ans(I)≠(Ans(I-1),I,2,dim(Ans

সম্পাদনা: ব্যর্থ SRRLSLLRRRS। আমার 61১ বাইটে একটি সংশোধিত সংস্করণ রয়েছে তবে এটি প্রথম অবৈধ পরীক্ষার ক্ষেত্রে ব্যর্থ:

seq(inString("SRL",sub("0"+Ans,I,1)),I,1,length(Ans
cumSum(⁻1+2seq(Ans(I)≠(Ans(I-1),I,2,dim(Ans
Disp 0<Ans(dim(Ans

আমি আগামীকাল ঠিক করার চেষ্টা করব।


আপডেট: সুতরাং সমস্যাটি আসলে আমার অ্যালগরিদম ত্রুটিযুক্ত। আমি যদি সের বিপরীতে লুপ ব্যবহার করি ((একই জিনিস অর্জনের জন্য) এটি (উপরে উভয় অ্যালগরিদম, আসলে) এটি হিসাবে বর্ণনা করা যেতে পারে:

  1. কাউন্টার ভেরিয়েবলটি 1 এ শুরু করুন।
  2. স্ট্রিং পড়ুন। প্রতীকটি পরিবর্তিত হলে, কাউন্টার ভেরিয়েবল বৃদ্ধি করুন। প্রতীকটি যদি পুনরাবৃত্তি করে তবে এটি হ্রাস করুন।
  3. যদি কাউন্টার ভেরিয়েবল 0 এর চেয়ে বেশি হয় তবে 1 (বৈধ) প্রদর্শন করুন। অন্যথায়, 0 (অবৈধ) প্রদর্শন করুন।

তবে এটি পছন্দ মতো অবৈধ স্লিটারে ব্যর্থ SRLRLRLRLRRRSS। আমি এখন আরও ভাল অ্যালগরিদম নিয়ে আসার চেষ্টা করব ... বা অন্য উত্তর থেকে চুরি করব।


আমি 90% নিশ্চিত যে এটিকে একটি একক seq(কমান্ডের সাথে প্রতিস্থাপন করা যেতে পারে , তবে এখনের জন্য এটি যতটা ছোট আমি তা পেতে পারি। যদি আপনি এটি 8 টাইপ করে সোর্সকোডার ব্যবহার করে এটি টাইপ করার বিপরীতে গড়তে চান , তবে নোটটি প্রতিস্থাপন করা উচিত !=এবং ⁻1+বিটটি প্রতিস্থাপন করা উচিত ~1+


1

রুবি 87 89

F=->s{d=[1,w=1e4,-1,-w]
v=[w]+s.chars.map{|c|w+=d.rotate!(c<?R?-1:c>?R?0:1)[0]}
v==v&v}

অনলাইন পরীক্ষা: http://ideone.com/pepeW2

অবরুদ্ধ সংস্করণ:

F = -> input {
  # Coordinates are expressed using one number,
  # that is computed using the formula `y + x*max_x`.
  # Assume max horizontal field width (max_x) to be 10000,
  # since that's the max length of the input.
  position = max_x = 1e4

  # These are possible directions to move to (coordinate deltas).
  # The current direction is always the first in the array.
  directions = [1,max_x,-1,-max_x]

  visited = [position]

  visited += input.chars.map{|c|
    # adjust current direction...
    directions.rotate! case c
    when ?L
      -1
    when ?R
      1
    when ?S
      0
    end

    # ...and move there
    position += directions[0]
  }

  # Return `true` if `visited` only contains distinct elements, `false` otherwise
  visited == visited & visited
}

0

গল্ফস্ক্রিপ্ট 48 49 50

[10.4?:z-10z~)]z*z@{'R L S'?@>(@+.`n}%n/@;\;..&=

স্ট্রিং স্ট্যাক এবং আয় হয় উপস্থিত প্রত্যাশা 0বা 1

বৈধ এবং অবৈধ সাপের পরীক্ষা দিয়ে আপনি এটি অনলাইনে চেষ্টা করতে পারেন ।

এটি আমার রুবি উত্তরের মত মূলত একই ধারণা । কেবল দিকনির্দেশের অ্যারেটি আলাদাভাবে মোকাবেলা করা হয়, কারণ আফাইক গল্ফস্ক্রিপ্টটিতে আড়াল ঘোরানো ফাংশন নেই। এই ক্ষেত্রে, আমি বর্তমান কমান্ড (এস, আর, বা এল) এর উপর নির্ভর করে এটি 10000 বার গুণ করে এবং তার শুরু 0, 1, বা 3 উপাদান থেকে ছাঁটাই করে যথেষ্ট পরিমাণে বড় দিকনির্দেশের অ্যারে তৈরি করি। বর্তমান "দিকনির্দেশ" এ সরানো সর্বদা অ্যারের প্রথম আইটেম।

এখানে এটি মন্তব্য সহ:

# Build the direction array and set current position
[1 10000:z-1z~)]z*z

@{
  # For each character in the input:

  # set current direction by cutting 0, 1 or 3 elements 
  # from the beginning of the directions array
  'SR L'?
  @>

  # move to current direction
  .0=@+.

  # format as number and addd newline
  `n
}%

# split by newlines
n/

# cleanup
@;\;

# return 1 if array contains distinct elements, 0 otherwise
..&=

সম্পাদনা:

"দিকনির্দেশগুলি" অ্যারে কীভাবে ব্যবহৃত হয় তা সংশোধন করে 1 চর সংরক্ষণ করা হয়েছে।

সম্পাদনা:

?(পাওয়ার) সিনট্যাক্সটি ব্যবহার করতে 1 এর পরিবর্তে 10 এর ইনক্রিমেন্ট বাড়িয়ে 1 চর সংরক্ষণ করা হয়েছে ।

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