টপল কিছু ডমিনোস!


22

কিছু অনুপ্রেরণার জন্য এই প্রশ্নের ধন্যবাদ

এই প্রতিদ্বন্দ্বিতায় আমরা একটি স্ট্রিং হিসাবে dominoes একটি লাইন প্রতিনিধিত্ব করবে |, /এবং \। আপনাকে ইনপুট হিসাবে ডোমিনোজের একটি স্ট্রিং দেওয়া হবে এবং তারা স্থির হওয়ার পরে তাদের দেখতে কেমন হবে তা আপনাকে নির্ধারণ করতে হবে। ডোমিনোস কীভাবে নেমে আসে তার নিয়ম এখানে

  • |একটি বাম পতিত ডোমিনোর বাম একটি দাঁড়ানো ডোমিনো \পাশাপাশি বাম পতিত ডোমিনোতে পরিণত হবে।

  • |ডান পতিত ডোমিনোর ডানদিকে দাঁড়িয়ে থাকা ডমিনো /পাশাপাশি ডান পতিত ডোমিনোতে পরিণত হবে।

  • যদি একটি স্ট্যান্ডিং ডোমিনো একটি বাম পড়ে \এবং ডান পতিত /ডোমিনোর মধ্যে থাকে তবে এটি দাঁড়িয়ে থাকবে।

ব্যবস্থাটি আর পরিবর্তন না হওয়া পর্যন্ত এই নিয়মগুলি বারবার প্রয়োগ করা হয়।

একটি ইনপুট কীভাবে তার উপসংহারে আসতে পারে তার উদাহরণ এখানে

|||||||\/|||||||\||\|||/||||||\|||||

||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||

\\\\\\\\////|\\\\\\\|||////\\\\|||||

আপনার টাস্কটি এমন কোনও কোড লেখা যা কোনও ইনপুটের শেষ ফলাফল খুঁজে পায় এবং আউটপুট করে। আপনি ধরে নিতে পারেন যে ইনপুটটি সর্বদা বৈধ এবং কমপক্ষে 2 টি অক্ষর থাকে।

এটি তাই কম বাইট ভাল হওয়ার সাথে বাইটে উত্তরগুলি দেওয়া হবে।

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

|||/||||  -> |||/////
|||\||||  -> \\\\||||
|/||||\|  -> |///\\\|
||/|||\|  -> ||//|\\|
||\|||/|  -> \\\|||//

6
ব্যাকস্ল্যাশ পালাতে আহো! (আমরা কি অন্যান্য চিহ্ন ব্যবহার করতে পারি?)
আর্নল্ড

1
@ আর্নল্ড না, আপনার স্ল্যাশ ব্যবহার করা উচিত নয়।
গম উইজার্ড

1
আমি পালাতে পারি না এবং কী করণীয় তা বুঝতে পারি না ...
সম্পূর্ণরূপে

ইনপুটটি কি কখনও ফাঁকা স্ট্রিং বা একক অক্ষর হবে?
ডুরকনব

3
এটি আমাকে b //////// | like এর মতো বিষয়গুলি স্থিতিশীল বলে বিবেচিত হওয়ার চেয়ে বেশি বিরক্ত করে।
মজবয়েস

উত্তর:


13

রেটিনা , 32 বাইট

+`(/.\\)|(/)\||\|(\\)
$1$2$2$3$3

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

ব্যাখ্যা

+রেটিনা বলে না হওয়া পর্যন্ত স্ট্রিং পরিবর্তন করতে ব্যর্থ হয় একটি লুপ প্রতিস্থাপন চালানোর জন্য। প্রতিটি প্রতিস্থাপন এক ধাপ পতনশীল ডোমিনোস গণনা করে। প্রতিস্থাপনটি নিজেই একটিতে তিনটি প্রতিস্থাপন, তবে এটি নিশ্চিত করে যে তারা একই সাথে ঘটবে:

(/.\\)...
$1

এটি ঠিক মেলে /|\(পাশাপাশি)/\\ এবং /\\তবে এটি গুরুত্বপূর্ণ নয়) এবং এটিকে অপরিবর্তিত রাখে ser এর উদ্দেশ্য হ'ল |উভয় পক্ষের পতিত ডোমিনয়েজগুলি এড়িয়ে যাওয়া , কারণ এই দুটি ক্ষেত্রে পৃথক বর্ণনামূলক ক্ষেত্রে পৃথক বর্ণনাকারী মামলার রায় দেওয়ার চেয়ে এটি সংক্ষিপ্ত।

...(/)\|...
$2$2

এই মেলে /| এবং এটিকে রূপান্তরিত করে //

...\|(\\)
$3$3

এটি মেলে |\এবং এটিকে রূপান্তরিত করে\\


বলতে পারি না যে আমি আসছি তা দেখিনি। কাজের জন্য রেটিনা অবশ্যই একটি ভাল সরঞ্জাম।
গম উইজার্ড

@ ওয়েট উইজার্ড এটি সমাধান করা সহজ, তবে সম্ভবত এখনও সমস্ত পালিয়ে যাওয়া এবং $1$2$2$3$3গল্ফিংয়ের ভাষাগুলিকে পরাস্ত করতে খুব ভার্জোজ ।
মার্টিন এেন্ডার

5

পাইথন 2 , 115 114 111 108 98 95 বাইট

-1 বাইট ধন্যবাদ ওভেসকে ধন্যবাদ

a=input()
for i in range(4)*len(a):a=a.replace('//|x||\ \\'[i::4],'/\/x|\/ \\'[3-i::4])
print a

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


114 বাইট আর স্ট্রিং ব্যবহার করে।
ovs

আপনি অপসারণ করতে পারেন b=0;এবং ঘটনার প্রতিস্থাপন bদ্বারা idদুই বাইট সংরক্ষণ করুন!
লিন

4

ভি , 23 বাইট

òÓ¯À<!|¨Ü©ü¨¯©|ÜÀ!/±±²²

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

সত্যই, এটি রেটিনা উত্তরের সাথে খুব মিল, কেবল এটি দেখতে দেখতে খারাপ লাগে। রেজেক্স সংক্ষেপণ ব্যবহার করে।

Hexdump:

00000000: f2d3 afc0 3c21 7ca8 dca9 fca8 afa9 7cdc  ....<!|.......|.
00000010: c021 2fb1 b1b2 b2                        .!/....

ব্যাখ্যা:

òস্ট্রিং পরিবর্তন না হওয়া অবধি ভি চালিয়ে যেতে বলে। বাকিটি একটি সংকোচিত রেজেক্স। আসুন এটি ভিম সমতুল্য রূপান্তর করা ...

:s/\v\/@<!\|(\\)|(\/)\|\\@!/\1\1\2\2/g

:s/                                     " Substitute...
   \v                                   " Turn on magic (use less escaping)
          \|                            " A bar
            (\\)                        " Followed by a captured backslash
       @<!                              " That is not preceded by
     \/                                 " A forward slash
                |                       " OR...
                 (\/)                   " A captured forward slash
                     \|                 " Followed by a bar
                       \\@!             " That is not followed by a backslash
                           /            " Replace this with
                            \1\1        " Pattern 1 twice (will be empty if we matched the second path)
                                \2\2    " Pattern 2 twice (will be empty if we matched the first path)
                                    /g  " Replace every match on this line

4

SNOBOL4 (CSNOBOL4) , 117 115 112 111 বাইট

	D =INPUT
S	D '/|\' ='_'	:S(S)
	E =D
	D '/|' ='//'
	D '|\' ='\\'
	D E	:F(S)
R	D '_' ='/|\'	:S(R)
	OUTPUT =D
END

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

পরীক্ষার পরিবর্তে পরিবর্তনগুলি দেখতে দ্বিতীয় ভেরিয়েবলের সাথে থামার অবস্থার জন্য ধারণার জন্য রডের অজগর উত্তরের ক্রেডিট D '/|' | '|\'

	D =INPUT		;* read input
S	D '/|\' ='_'	:S(S)	;* replace '/|\' with '_', recursively
	E =D			;* set E to D, this is the while loop
	D '/|' ='//'		;* topple right
	D '|\' ='\\'		;* topple left
	D E	:F(S)		;* if D doesn't match E, goto S
R	D '_' ='/|\'	:S(R)	;* replace '_' with '/|\' (inverse of statement S)
	OUTPUT =D		;* output
END

3

হাস্কেল , 114 107 বাইট

until=<<((==)=<<)$g
g s=t<$>zip3('|':s)s(tail s++"|")
t(l,'|',r)|l<'0',r/='\\'=l|r=='\\',l>'/'=r
t(_,e,_)=e

এটি অনলাইন চেষ্টা করুন! প্রথম লাইন একটি বেনামী ফাংশন সংজ্ঞায়িত করে।

ব্যাখ্যা:

  • until=<<((==)=<<)$gএকটি ফিক্স পয়েন্ট ফাংশন ( ব্যাখ্যাটির জন্য এখানে দেখুন ) যা ফাংশনটি প্রয়োগ করেg ফলাফলটি আর পরিবর্তন না করা অবধি ইনপুট স্ট্রিংয়ে ।
  • zip3('|':s)s(tail s++"|")প্রতিটি ডোমিনোর জন্য তৈরি করে, এটি স্ট্রিংয়ের চরিত্র s, প্রি এবং উত্তরোত্তর ডমিনো সহ একটি ট্রিপল, |প্রান্তগুলিতে প্যাডিং । যেমন /\|হয়ে যায়[(|,/,\),(/,\,|),(\,|,|)] (পালিয়ে যাওয়া উপেক্ষা করে) ।
  • তারপরে tট্রিপলের কেন্দ্র অংশের নতুন অবস্থান গণনা করার জন্য ফাংশনটি ত্রিপলগুলির প্রত্যেকটিতে প্রয়োগ করা হয়।


2

প্রোলোগ (এসডাব্লুআই) , 132 বাইট

+[]-->[].
+[47,124,92|T]-->"/|\\",+T.
+[47,47|T]-->"/|",+T.
+[92,92|T]-->"|\\",+T.
+[X|T]-->[X],+T.
X+Y:- +(N,X,[]),!,(X=N,Y=N;N+Y).

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

এই প্রোগ্রামটি একটি প্রাকটিকাকে সংজ্ঞায়িত করে +/2 যে সত্য যদি দ্বিতীয় যুক্তিটি প্রথমটির স্থিত সংস্করণ হয়। উভয় যুক্তি হ'ল অক্ষর কোডের তালিকা।

ব্যাখ্যা

এই সমাধানটি ডিসিজি ব্যবহার করে পরবর্তী পদক্ষেপটি কী তা নির্ণয় করে এবং তারপরে পরবর্তী পদক্ষেপটি বর্তমান ধাপের সমান না হওয়া পর্যন্ত বারবার পরবর্তী পদক্ষেপ গণনা করে।

ডিসিজি

+[]-->[].
+[47,124,92|T]-->"/|\\",+T.
+[47,47|T]-->"/|",+T.
+[92,92|T]-->"|\\",+T.
+[X|T]-->[X],+T.

এই পাঁচটি লাইনের কোড একটি ডিসি (ডিফিনেট ক্লজ ব্যাকরণ) নিয়মকে সংজ্ঞায়িত +করে যা প্রোগ্রামে ডোমিনোস টপলিংয়ের একক ধাপ গণনা করতে ব্যবহৃত হয়। প্রোলোগের ডিসিজিগুলি নিয়মের প্রথম কেসটি আবিষ্কার করে যার ডান হাতের স্ট্রিংয়ের সাথে মেলে এবং সেই প্রক্রিয়াটির মাধ্যমে বাম দিকে নিয়মের যুক্তি নির্ধারণ করে কাজ করে। যদি কোনও মামলা মেলতে ব্যর্থ হয় তবে এটি ব্যাকট্র্যাক করবে এবং পরবর্তী কেসটি চেষ্টা করবে।

+[]-->[].

এই লাইনটি +নিয়মের বেস কেস উপস্থাপন করে । এটি সহজভাবে জানিয়েছে যে যদি বর্তমানে কোনও ডোমিনোস না থাকে তবে পরবর্তী পদক্ষেপে এখনও কোনও ডমিনো থাকবে না।

+[47,124,92|T]-->"/|\\",+T.

যেহেতু এই প্রোগ্রাম চরিত্র কোডের তালিকা সঙ্গে একচেটিয়াভাবে পুলিশ এটা খেয়াল করা গুরুত্বপূর্ণ যে চরিত্র কোড /, \এবং |47, 92, এবং 124 যথাক্রমে। +নিয়মের এই ক্ষেত্রে /|\স্ট্রিং পরিচালনা করে ।

+[47,47|T]-->"/|",+T.

এই কেসটি ডমিনোকে ডানদিকে ডানকে ডানদিকে পড়ার ডানিনো পরিচালনা করে। যেহেতু কেসটি হ্যান্ডলিংয়ের পরে আসে /|\এটি সম্ভাবনার জন্য ব্যবহার করা হবে না।

+[92,92|T]-->"|\\",+T.

ডমিনোকে তার বাম দিকে ছিটকে একটি বাম পতনশীল ডোমিনোর জন্য কেস পরিচালনা করে।

+[X|T]-->[X],+T.

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

ভবিষ্যদ্বাণী

X+Y:- +(N,X,[]),!,(X=N,Y=N;N+Y).

প্রধান শিকারী দুটি আর্গুমেন্ট গ্রহণ করে, প্রথমটি প্রাথমিক ডমিনো সেটআপ, দ্বিতীয়টি স্থিত ডোমিনয়েস। যেহেতু এটি প্রোগল দ্বিতীয় তাই নির্ধারিত হতে পারে এবং প্রোগ্রামটি এটি গণনা করবে। এর মধ্যে এবং নিজেই +(N,X,[])প্রিডিকেট মোটামুটি সহজ , ডিসিজি কল করে এবং এতে ডোমিনোস সংরক্ষণের পরবর্তী ধাপটি গণনা করে N(X=N,Y=N;N+Y)ডোমিনোসের পরবর্তী পদক্ষেপ বর্তমানের মতো একই কিনা এবং এটি যদি এটির সাথে সেট Yহয় যেহেতু ডোমিনোস অবশ্যই স্থির হয়ে গেছে এবং যদি এটি পুনরাবৃত্তি না করে তবে ডমিনোসের পরবর্তী পদক্ষেপের Nপরিবর্তে একই শিকারীকে কল করে X


1

এপিএল (ডায়ালগ) , 36 বাইট

({(↑∘1¨3 ¯3)⍳⊂⍵≠'/|\'}⊃'\/',2⊃⊢)⌺3⍣≡

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

-3 আংশিকভাবে গরু কোয়াকে ধন্যবাদ ।

মনে হয় এতটা নিরবচ্ছিন্ন ... :(



1

মুখ , 166 বাইট

\|/,cm_/o>AvI[IIcP/+PP|m_/m*/Sl*Im1/11:~-_I|'|?_1-_P|?_1`I-III_|+II|'I.C:1-_I|?_C'|-_P|?_C_|'I-_I|`I?_!'I.C:!'|'|-III+II|'I:C_|-PPP+PPI'I?I~_I-PPP+PP|-**1?*~Sl*Iw*I*>

কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয় এবং STDOUT এ আউটপুট দেয়। এটি কেবল প্রতিশ্রুতিতে 86494f6 এবং এর বাইরেও যে প্রতিশ্রুতিতে কোনও বাগফিক্সের কারণে কাজ করে।

নান্দনিকতার জন্য আবৃত:

\|/,cm_/o>AvI[IIcP/+PP|m_/m*/Sl*Im1/11:~-_I|'|?_1-_P|?_1`I
-III_|+II|'I.C:1-_I|?_C'|-_P|?_C_|'I-_I|`I?_!'I.C:!'|'|-III
+II|'I:C_|-PPP+PPI'I?I~_I-PPP+PP|-**1?*~Sl*Iw*I*>

এবং নিরবচ্ছিন্ন / মন্তব্য করেছে:

\|/,cm_/o>              ( setup )

AvI[II                  ( store input into I )
cP/+PP|m_/              ( store 92, ascii for \, into P, meaning prev char )
m*/Sl*Im1/11            ( store length of input into counter variable * )

( main loop: )
:~

    -_I|'|?_1           ( branch to 1 if the character is not \ )
    -_P|?_1             ( also branch to 1 if the previous character wasn't | )
    `I-III_|+II|'I      ( we have a sequence |\ so prev needs to be toppled )
    .C                  ( jump to C, the "continue" label at end of loop )

    :1
    -_I|?_C             ( branch to C if the character is not | )
    '|-_P|?_C           ( also branch to C if the previous character wasn't / )
    _|'I-_I|`I?_!       ( branch to ! if the next character isn't \ )
    'I.C:!              ( otherwise, skip the next \ and branch to continue )
    '|'|-III+II|'I      ( if all conditions hold we have /|| or /|/ so topple )

    :C
    _|                  ( reset pointer to source )
    -PPP+PPI            ( update prev variable )
    'I                  ( step through data )

?I~

_I-PPP+PP|-**1          ( reset input/prev and decrement counter )
?*~                     ( repeat main loop as many times as there are chars )

Sl*Iw*I*>               ( output final string to stdout )

এখানে কয়েকটি সূক্ষ্ম কৌশল রয়েছে যা কয়েকটি অতিরিক্ত বাইট যেমন শেভ করে

  • ভেরিয়েবলের নামকরণ | এবং /, যার ASCII মানগুলি পরে কোডে আত্মতন্ত্রের মাধ্যমে অ্যাক্সেস করা হয়েছে

  • '|প্রধান লুপ, যা সেখানে সেট করার জন্য পরিবর্তে বলা হয় দ্বিতীয় লাইনে প্রথম লাইনে | মূল লুপের দ্বিতীয় বিভাগে ব্যবহারের জন্য পয়েন্টার


1

পার্ল 5 , 52 + 1 (-পি) = 53 বাইট

মিককে ধন্যবাদ -6 বাইটস

পার্লের পক্ষে সম্ভবত সবচেয়ে ভাল সম্ভব নয়, তবে এটিই আমি সামনে আসতে পেরেছিলাম।

0while(s/(?<!\/)\|(?=(\\))|(?<=(\/))\|(?!\\)/$1$2/g)

ব্যাখ্যা

while(
  s/
    (?<!\/)\|(?=(//)) # If there's a | that precedes a \ but doesn't follow a /, capture /
      | # Or
    (?<=(\/))\|(?!//)/ # If there's a | that follows a / doesn't precede a \, capture /
  /$1$2/ # Replace all | with capture group 1 or 2, as one of the two will always be empty
  g # Repeat as much as possible for this string
)

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


-pপরিবর্তে -aপ্রয়োজন মুছে ফেলার জন্য print;; whileডামি এক্সপ্রেশনটির প্রত্যয় হিসাবে ব্যবহার করা (উদাহরণস্বরূপ 0) আরও 2 বাইট সাশ্রয় করবে
মিক

ধন্যবাদ @ মিক, আমি সেই কৌশলগুলি জানতাম না। আমি আরও বুঝতে পারি যে আমি কিছু বাইট সংরক্ষণ করতে অন্য কিছু দিয়ে রেজিটাকে সীমাবদ্ধ করতে পারি। পরে যেতে পারে।
জেফ্রি এইচ।



0

চুনি , 83 বাইট

প্রযুক্তিগতভাবে প্রতারণামূলক 9.times , বা এমনকি999.times তবে আমি সস্তা বলে মনে করি না :)

এখনও বিশাল গল্ফিংয়ের সম্ভাবনা রয়েছে। (দ্রষ্টব্য: এর y while undoneতুলনায় অনেক দীর্ঘ x.size.times)

->x{x.size.times{x.gsub! /\/\|\\?|\|\\/,'/|\\'=>'/|\\','/|'=>'//','|\\'=>'\\\\'}
x}

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



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