আমার 4 নোটের মিউজিক বক্সটি কি সেই গানটি খেলতে পারে?


51

আমার কাছে একটি ক্র্যাঙ্ক-চালিত সংগীত বাক্স রয়েছে যা চারটি নোট সিরিজ খেলতে পারে। আমি যখন ক্র্যাঙ্কটি ঘুরিয়ে দেই, এটি ক্র্যাঙ্কের অবস্থান এবং টার্নের দিকের উপর নির্ভর করে চারটি স্ট্রিংয়ের মধ্যে একটি প্লাক করে। ক্র্যাঙ্কটি যখন উত্তর দিকে পরিণত হয়, তখন বাক্সটি (তার স্ট্রিংগুলির সাথে 1 থেকে 4 এর মধ্যে সংখ্যাসূচক) প্রদর্শিত হবে:

1  |  2
   |
   O   

4     3

সেখান থেকে, আমি ক্র্যাঙ্কটি ঘড়ির কাঁটার দিকে ঘুরিয়ে # 2 স্ট্রিংটি খাড়া করতে এবং ক্র্যাঙ্কের পূর্ব দিকে নির্দেশ করতে পারি:

1     2

   O---   

4     3

বিকল্পভাবে, আমি # 1 স্ট্রিং খেলতে উত্তর থেকে ক্র্যাঙ্ককে ঘড়ির কাঁটার দিকে ঘুরিয়ে দিতে পারতাম এবং পশ্চিম দিকে ইশারা করে শেষ করতে পারতাম:

1     2

---O   

4     3

যে কোনও সময়ে, বাক্সটি দুটি নোটগুলির মধ্যে একটি খেলতে পারে: পরবর্তী নোটটি ঘড়ির কাঁটার দিকের দিক থেকে পাওয়া যাবে বা পরবর্তী নোটটি পাল্টা দিকের দিকের দিকের দিকের দিকে।

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা নোট মানগুলির একটি শূন্য খালি স্ট্রিং গ্রহণ করে (যেমন, এর 1মাধ্যমে সংখ্যাগুলি 4) এবং নির্ধারণ করে যে সংগীত বাক্সে নোটগুলির ক্রমটি চালানো কি কখনও সম্ভব কিনা determine ইনপুটটির playable বা প্লে-নাযোগ্যতা ইঙ্গিত করতে সত্যবাদী বা মিথ্যা ফলাফল উত্পাদন করুন।

কিছু নোট:

  • ইনপুট প্রাথমিক শুরুর অবস্থান সম্পর্কে কোনও অনুমান করে না। ইনপুটগুলি 214(পূর্ব 234থেকে শুরু করে কঠোরভাবে ঘড়ির কাঁটার দিকে অগ্রসর হওয়া ) এবং (উত্তর শুরু করা এবং কঠোরভাবে ঘড়ির কাঁটার দিকে অগ্রসর হওয়া) এবং উভয়ই বৈধ।

  • ক্র্যাঙ্ক প্রতিটি নোটের পরে অবাধে দুদিকেই চলতে পারে। একই নোটের একটি সিরিজ 33333একটি স্ট্রিং জুড়ে পিছনে এগিয়ে চলার মাধ্যমে (যেমন, ) সম্ভব । সিরিজটি 1221441পুরোপুরি খেলতে পারা যায় (পশ্চিম দিক থেকে শুরু করে, ঘড়ির কাঁটার দিকে দুটি ধাপ এগিয়ে চলেছে, তারপরে তিন ঘন্টার বিপরীতে, তারপর ঘড়ির কাঁটার দিকে দুটি ধাপ)।

নমুনা

কিছু trueক্ষেত্রে:

1
1234
1221
3333
143332
22234
2234
22214
1221441
41233

কিছু falseক্ষেত্রে:

13     (note 3 is never available after note 1)
1224   (after `122`, the crank must be north, so 4 is not playable)
121    (after `12` the crank is east; 1 is not playable)
12221  (as above, after `1222` the crank is east)
43221  

ইনপুটটি কোটস সহ স্ট্রিং হতে পারে?
লুইস মেন্ডো

@ লুইস মেন্ডো অবশ্যই, আমি এটির অনুমতি দেব - আমি আপনার অ্যালগরিদমের প্রতি আগ্রহী, আপনাকে ইনপুট পেতে ঝাঁপিয়ে পড়ে না। যাইহোক, আনুষ্ঠানিক সম্প্রদায়ের sensকমত্য রয়েছে যে এটি সাধারণত ঠিক আছে: স্ট্রিং ইনপুট "বা" ছাড়া?
অ্যাপসিলাররা 26:51

1
আমি এটা জানতাম না। লিঙ্কের জন্য ধন্যবাদ!
লুইস মেন্ডো

1
@ এজেম্যান্সফিল্ড না, সমাধানগুলিতে নির্বিচারে অনেকগুলি চক্রের জন্য অনুমতি দেওয়া উচিত। অবশ্যই, যদি কিছু ইনপুট আপনার কোডটিকে আপনার ভাষার দোভাষী বা আপনার কম্পিউটারের স্মৃতিতে সীমা ছাড়িয়ে যায়, তবে এটি ঠিক আছে (যেহেতু এটি শারীরিকভাবে আপনার মেমরির দ্বারা কেবলমাত্র সীমাবদ্ধ বা আপনার দোভাষী আপনাকে অনুমতি দেয়) তবে আপনার সমাধানটি অতিরিক্ত সীমাবদ্ধতা আরোপ করা উচিত নয় কত দূরে বা কতবার ক্র্যাঙ্ক চলে।
এপসিলাররা

1
এই চ্যালেঞ্জ জিতেছে যেমন দেখায় না হিসাবে সহজ বিভাগ PPCG 2016. এর সেরা দুর্ভাগ্যবশত, আমরা না অনুগ্রহকে মিথ্যা চ্যালেঞ্জ দিতে পারে, কিন্তু Zgarb আপনার সম্মানে একটি চ্যালেঞ্জ লিখেছেন । অভিনন্দন!
মার্টিন এন্ডার

উত্তর:


9

পাইথ, 30 27 বাইট

f!-aVJ.u%-ysYN8zTtJ,1 7cR2T

এই ধারণাটি এখানে:

 1.5  1  0.5

  2       0

 2.5  3  3.5

ক্র্যাঙ্কটি সর্বদা অর্ধ-পূর্ণসংখ্যার অবস্থানে থাকে c। প্রতিটি পদক্ষেপ এ, আমরা একটি পূর্ণসংখ্যা অবস্থান নোট ধরে প্রতিফলিত nসেটিং দ্বারা c = 2*n-c। যদি nবৈধ হয়, তবে cmod 1 টি মডেল 8 দ্বারা পরিবর্তন করুন ninvalid যদি অবৈধ cহয় তবে ± 3 টি মডেলের পরিবর্তে 8. আমরা সমস্ত মান সংগ্রহ করতে ইনপুটটিকে ক্রমশ কমিয়ে দেই cএবং তারপরে দেখুন সমস্ত নোট বৈধ ছিল কিনা। আমরা প্রতিটি প্রারম্ভিক মানের জন্য cএটি করি, কারণ এটি প্রথম নোটের সাথে সংলগ্ন কেবলমাত্রগুলি পরীক্ষা করার চেয়ে কম।

বিন্যাসকৃত:

f
  ! -
      aV J .u
              % -
                  y s Y
                  N
                8
              z
              T
         t J
      ,
        1 
        7
  cR2 T

টেস্ট স্যুট


18

সিজেম, 34 31 বাইট

8,q{~2*f{_@-_zF8b&,@@+8,=*}0-}/

এটি আমার ফোনে করেছে, সুতরাং আমাকে পরে একটি ব্যাখ্যা দিতে হবে। যদি সত্য হয় তবে আউটপুট মজাদার নয়।

অনলাইনে চেষ্টা করে দেখুন | পরীক্ষা স্যুট

ব্যাখ্যা

নতুন কোডটি লেআউটটি সামান্য পরিবর্তন করবে:

2    3    4

1    .    5

0/8  7    6

এমনকি সংখ্যাগুলি স্ট্রিং পজিশনের সাথে এবং বিজোড় সংখ্যাগুলি ক্র্যাঙ্ক পজিশনের সাথে মিলে যায়।

যা ঘটে তা এখানে:

8,           Create the range [0 1 .. 7] of possible starting positions
             We can leave the string positions [0 2 4 6] in since it doesn't matter
q{ ... }/    For each character in the input...
  ~2*          Evaluate as integer and double, mapping "1234" -> [2 4 6 8]
  f{ ... }     Map over our possible current crank positions with the string
               position as an extra parameter
    _@-          Calculate (string - crank), giving some number in [-7 ... 7]
    _z           Duplicate and absolute value
    F8b          Push 15 base 8, or [1 7]
    &,           Setwise intersection and get length. If (string - crank) was in
                 [-7 -1 1 7] then the move was valid and this evaluates to 1, otherwise 0
    @@+          Calculate ((string - crank) + string)
    8,=          Take modulo 8, giving the new crank position. x%y in Java matches the
                 sign of x, so we need to do ,= (range + index) to get a number in [0 .. 7]
    *            Multiply the new crank position by our previous 0 or 1
  0-           Remove all 0s, which correspond to invalid positions

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

কেবলমাত্র সিজেমে অতিরিক্ত প্যারামিটার দিয়ে ফিল্টার থাকলে ...


সম্পাদনা: অস্থায়ীভাবে ঘুরে ফিরে যখন আমি নিজেকে বোঝাতে পারি যে এই 29-বাইট কাজ করে:

8,q{~2*f{_@-_7b1#@@+8,=|}W-}/

37
প্রতিবারই কেউ সিজমের মতো কোনও কঠিন ভাষার সাথে উত্তর দেয় এবং বলে "আমার ফোনে এটি করেছে" আমি একটু ভিতরে মরে যাই
ডেনিস ভ্যান গিলস

2
তিনি সম্ভবত বোঝাচ্ছেন যে কোনও ফোন ব্যবহার করে পাঠ্যটি আউটপুট করা হয়েছিল, তবে এটি তাঁর মাথায় করা হয়েছিল।
নেলসন

7

হাস্কেল, 93 88 87 বাইট

any(all(\(a,b:c)->1>mod(a!!1-b)4).(zip=<<tail)).mapM((\a->[[a,a+1],[a+1,a]]).read.pure)

এটি একটি অনামী ফাংশনকে মূল্যায়ণ করে যা একটি স্ট্রিং নেয় এবং একটি বুলিয়ান দেয়। টেস্ট স্যুট এখানে।

ব্যাখ্যা

নিম্নলিখিত ধারণাটি অনুসারে ডানদিকে ল্যাম্বদা একটি সংখ্যার মানচিত্র aকরে [[a,a+1],[a+1,a]], সম্ভাব্য দুটি "চলন" যা এই সংখ্যার উপরে ক্র্যাঙ্ক নেয়, নিম্নলিখিত চিত্র অনুসারে:

  1 (2) 2

(1/5)  (3)

  4 (4) 3

মূল বেনামে ফাংশনটিতে আমরা প্রথমে করি mapM((...).read.pure), যা প্রতিটি চরিত্রকে একটি পূর্ণসংখ্যার সাথে রূপান্তর করে, উপরের ল্যাম্বডাকে এতে প্রয়োগ করে এবং ফলস্বরূপ সমস্ত চলমান ক্রমের তালিকাটি ফিরিয়ে নিয়ে দুটি পদক্ষেপের মধ্যে একটি বেছে নেয়। তারপরে, আমরা পরীক্ষা করে দেখি যে এই ক্রমের কোনওটিরও এমন বৈশিষ্ট্য রয়েছে যে প্রতিটি পদক্ষেপের দ্বিতীয় সংখ্যাটি পরবর্তী মডুলো 4 এর প্রথম সংখ্যার সমান, যার অর্থ এটি একটি শারীরিকভাবে সম্ভব ক্রম। এটি করার জন্য, আমরা zipপ্রত্যেকে এর সাথে ক্রম সরিয়ে নিয়েছি tail, allজোড়ার জন্য শর্তটি পরীক্ষা করে দেখুন এবং anyক্রমটি মূল্যায়ন করে কিনা তা দেখুন True



6

রেটিনা , 127 109 বাইট

^((1|2)|(2|3)|(3|4)|(4|1))((?<2-5>1)|(?<5-2>1)|(?<3-2>2)|(?<2-3>2)|(?<4-3>3)|(?<3-4>3)|(?<5-4>4)|(?<4-5>4))*$

এই মুদ্রণ 0বা 1, সেই অনুযায়ী।

এটি অনলাইন চেষ্টা করুন! (এটি সামান্য পরিবর্তিত সংস্করণ যা মুদ্রণের পরিবর্তে ইনপুটটিতে সমস্ত মিলকে চিহ্নিত করে 0বা 1।)

আমি একটি মার্জিত অ্যালগরিদম নিয়ে আসার চেষ্টা করেছি, তবে আমার প্রথম কয়েকটি প্রচেষ্টা ব্যাকট্র্যাকিংকে বাধা দিতে সক্ষম ছিল না ... এবং ব্যাকট্র্যাকিং বাস্তবায়ন বিরক্তিকর ... তাই আমি এমন একটি ভাষা ব্যবহার করেছি যা আমার জন্য ব্যাকট্রাকিংয়ের কাজ করে যেখানে আমার কেবল একটি এনকোড করা দরকার বৈধ সমাধান। দুর্ভাগ্যক্রমে, এনকোডিংটি মোটামুটি ভার্জোজ এবং মোটামুটি নিরর্থক ... আমি নিশ্চিত যে এটি ছোট করা যেতে পারে।

আমি আরও পরিষ্কার কিছু খুঁজে বের করার চেষ্টা করার সময়, যদি কেউ এটি কীভাবে কাজ করে তা বাছাই করতে চায় তবে এখানে আরও কিছু পাঠযোগ্য সংস্করণ:

^
(
    (?<a>1|2)
  | (?<b>2|3)
  | (?<c>3|4)
  | (?<d>4|1)
)
(
    (?<a-d>1) | (?<d-a>1)
  | (?<b-a>2) | (?<a-b>2)
  | (?<c-b>3) | (?<b-c>3)
  | (?<d-c>4) | (?<c-d>4)
)*
$

এবং এখানে একটি ইঙ্গিত:

1  a  2

d  O  b

4  c  3

6

এমএটিএল , 57 55 বাইট

1t_hjnZ^!t1tL3$)2_/wvG1)UGnl2$Ov+Ys.5tv3X53$Y+4X\G!U=Aa

এটি বর্তমান প্রকাশ (10.2.1) ব্যবহার করে যা এই চ্যালেঞ্জের চেয়ে আগের is

সম্পাদনা করুন (জানুয়ারী 17, 2017): ভাষা পরিবর্তনের কারণে,v প্রয়োজন দ্বারা প্রতিস্থাপন করা &v, এবং tL3$)দ্বারা Y)(অতিরিক্ত দায়িত্বে, কিছু অন্যান্য উন্নত পারে সম্পন্ন করা)। নিম্নলিখিত লিঙ্কে এই দুটি পরিবর্তন অন্তর্ভুক্ত রয়েছে

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

ব্যাখ্যা

কোড গল্ফের জন্য এটি আমার দুটি প্রিয় সরঞ্জামের উপর ভিত্তি করে: ব্রুট ফোর্স এবং কনভোলশন

কোড সংজ্ঞায়িত করে পাথ স্থানাঙ্ক পরিপ্রেক্ষিতে ঢিলা দ্বারা অনুসরণ 0.5, 1.5ইত্যাদি প্রতিটি সংখ্যা নোট মধ্যে ঢিলা অবস্থান বলে। কোডটি প্রথমে সমস্ত সম্ভাব্য পাথ সহ একটি পাথ অ্যারে তৈরি করে যা ইনপুট স্ট্রিংয়ের প্রথম নোট দিয়ে শুরু হয়। প্রতিটি পাথ এই অ্যারেতে একটি কলাম। এটি ব্রুট ফোর্স উপাদান component

এই পাথ অ্যারে থেকে, একটি নোট অ্যারে পাওয়া যায়, যেখানে প্রতিটি কলামটি প্লে নোটগুলির একটি যথাযথ অনুক্রম। উদাহরণস্বরূপ, অবস্থান থেকে আন্দোলন 0.5করার 1.5একটি নোট উত্পাদন করে 1। এটি পজিশনের মধ্যে গড় গ্রহণ এবং তারপরে একটি মডুলো 4 অপারেশন প্রয়োগ করে। প্রতিটি কলামের সাথে চলমান গড় 2D সমঝোতার মাধ্যমে সম্পন্ন হয় ।

পরিশেষে, প্রোগ্রামটি নোট অ্যারের কোনও কলাম ইনপুটটির সাথে মিলে যায় কিনা তা পরীক্ষা করে।

1t_h        % row array [1, -1]
j           % input string
nZ^!        % Cartesian power of [1, -1] raised to N, where "N" is length of string
t           % duplicate
1tL3$)      % extract first row
2_/         % divide by -2
wv          % attach that modified row to the top of Cartesian power array
G1)U        % first character of input string converted to number, "x"
Gnl2$O      % column array of N-1 zeros, where N is length of input
v           % concat vertically into column array [x;0;0...;0]
+           % add with singleton expansion
Ys          % cumulative sum along each column. Each column if this array is a path
.5tv        % column array [.5;.5]
3X5         % predefined string 'same' (for convolution)
3$Y+        % 2D convolution of path array with [.5;.5]
4X\         % modified modulo operation. This gives note array with values 1,2,3,4
G!U         % column array of input string characters converted to numbers
=Aa         % true if any column of the note array equals this

5

পাইথ, 43

Km-R2sMdc`M%R4-VJjQTtJ`0|Fm!s-VKdCm_B^_1dlK

পরীক্ষা স্যুট

এটি সম্ভবত খুব গল্ফযোগ্য, এবং গল্ফিংয়ের জন্য অনুকূল অ্যালগরিদমও নয় (আমি আশা করি সমস্ত পথগুলি সংক্ষিপ্ত করে দেওয়া হবে?) ... যাইহোক, আপনি যদি অ্যালগরিদমের কোনও ত্রুটি খুঁজে পান তবে দয়া করে আমাকে জানান, আমি মনে করি এটি কাজ করা উচিত তবে আমি আগে ভুল হয়েছে!

আমি এর উদাহরণ ইনপুট ব্যবহার করে আমার অ্যালগরিদম ব্যাখ্যা করব 1221। এই প্রোগ্রামটি প্রথম, তাদের উত্তরাধিকারী বিরুদ্ধে ডিজিটের মানচিত্র যেমন: [[1,2],[2,2],[2,1]]। তারপর এটি তাদের পার্থক্য গেলিক ভাষার পায় 4(Pyth ফলে ডান যুক্তি চিহ্ন মিলে যায় পায় %, তাই এই সবসময় ইতিবাচক): [3,0,1]। তারপর ফলাফলে বিভক্ত হয় 0এবং আছে 2তাদের প্রতিটি থেকে বিয়োগ: [[1],[-1]]

এখন সেটআপটি সম্পন্ন হয়ে গেলে, আমরা একটি তালিকা তৈরি করি [-1,1,-1...]এবং এটির অবহেলা [1,-1,...], উভয়ই পূর্বের থেকে ফলাফলের অ্যারের সমান দৈর্ঘ্য। তারপরে, এই তালিকার প্রতিটিের জন্য, তালিকার উপাদানগুলির এবং পূর্ববর্তী পদক্ষেপে উত্পন্ন তালিকার মধ্যে সেটওয়্যার বিয়োগফল সম্পাদন করুন। তারপরে, ফলাফলগুলির মধ্যে যদি কেবলমাত্র খালি তালিকা থাকে তবে আমরা সত্য ফল আউট করি।


"ফলাফলগুলি 0 এ বিভক্ত হয়" বলতে কী বোঝ? বিশেষত, আপনি কি জন্য পাবেন 1221221এবং 1221441?
নিল

1
@ নীল 1221221মিথ্যা এবং 1221441সামগ্রিকভাবে সত্য দেয়, তবে আমি যদি বুঝতে পারি যে আপনি অ্যালগরিদমের সেই পদক্ষেপের পরে ফলাফল চান? থেকে: যদি যে ক্ষেত্রে এটা দেয় [3, 0, 1, 3, 0, 1]করার [[3], [1, 3], [1]]এবং [3, 0, 1, 1, 0, 3]করতে [[3], [1, 1], [3]]। আপনি অন্য কিছু ব্যাখ্যা করতে চাইলে আমাকে জানান :)
FryAmTheEggman

আমি মনে করি আমি আগের তুলনায় আরও বিভ্রান্ত, সুতরাং কীভাবে আপনি (দুটি) সঠিক ফলাফলটি অর্জন করবেন তা বোঝাতে দয়া করে এই দুটি উদাহরণ শেষ করতে পারেন?
নিল

1
@ নীল শিওর, কোনও সমস্যা নেই :) সেখান থেকে, আমরা পেতে বিয়োগফলটি করি: [[1], [-1, 1], [-1]]এবং [[1], [-1, -1], [1]]এখান থেকে, আপনি দেখতে পাচ্ছেন যে প্রথমটির তালিকার মধ্যে বিকল্প নেই -1এবং 1অন্য তালিকার মধ্যে বিকল্প নেই, চূড়ান্ত ফলাফল দেয়। অ্যালগরিদমটি কিছুটা অবস্হিত, তবে এটি মূলত দিকনির্দেশ 0ও দিকনির্দেশকে ম্যাপিং করে +/-1, তারপরে কোনও জাম্প তৈরি হয় না এবং দিকগুলি অর্থবোধ করে তা পরীক্ষা করে।
FryAmTheEggman

ওহ, সুতরাং আমি যে বিটটি অনুপস্থিত ছিল তা হ'ল প্রতিটি বিভক্ত তালিকার অবশ্যই একই মান থাকতে হবে এবং সেই মানগুলি অবশ্যই বিকল্প হতে হবে। ধন্যবাদ!
নিল

4

মতলব, 279 180 বাইট

o=eye(4);a=input('')-'0';M=[o,o(:,[4,1:3]);o(:,[2:4,1:4,1])];x=2;for p=[a(1),mod(a(1),4)+1];for k=a;i=find(M*[o(:,k);o(:,p)]>1);if i;p=mod(i-1,4)+1;else;x=x-1;break;end;end;end;x>0

বেশ একটি অলস সমাধান, তবে আমি সবচেয়ে সংক্ষিপ্ততম সাথে সামনে আসতে সক্ষম হয়েছি। আমি বিশেষ ম্যাট্রিক্স তৈরি করা হয়েছে: যখন আপনি plucker ও শেষ স্ট্রিং যে অপহৃত করা রাজ্যের এনকোড, এটি একটি ভেক্টর, যে plucker নতুন অবস্থান এনকোড ফেরৎ, এবং কিনা পূর্ববর্তী প্লাক আদৌ সম্ভব ছিল না। এখন আমরা দুটি সম্ভাব্য দুটি শুরু পজিশন থেকে সমস্ত নোটগুলি লুপ করেছি এবং দেখি যে এর মধ্যে কোনও একটি খেলতে সক্ষম মেলোডের ফলস্বরূপ। সম্ভবত আরও অনেক গল্ফ করা যেতে পারে।

প্রসারিত এবং ব্যাখ্যা উত্স:

o=eye(4);
a=input('')-'0';

% encoding of plucker/notes
%      1
%   1     2
%4           2
%   4     3
%      3
%

M=[...
%12 3 4 1 2 3 4 <
1,0,0,0,0,1,0,0; %1  k = current note
0,1,0,0,0,0,1,0; %2  
0,0,1,0,0,0,0,1; %3  
0,0,0,1,1,0,0,0; %4  
0,0,0,1,0,0,0,1; %1  p = current position of plucker
1,0,0,0,1,0,0,0; %2
0,1,0,0,0,1,0,0; %3
0,0,1,0,0,0,1,0];%4
% the vector we multiply with this matrix has following structure,
% the k-th and the p+4 th entries are 1, the rest 0
% when we multiply this vecotr with this matrix, we get a vector with an
% entry of value 2 IF this is a valid move ( mod(positionOfThe2 -1,4)+1 is
% the position of the plucker now)
% or only entries less than 2 it is impossible
x=2;  %number of "chances" to get it right
for p=[a(1),mod(a(1),4)+1] %check both starting values;
    for k=a;                %loop throu the notes
        size(M);

        c = M * [o(:,k);o(:,p)];
        i=find(c>1);               %did we find a 2?
        if i;
           p=mod(i-1,4)+1;         %if yes, valid move
        else;
            x=x-1;                 %if no, invalid, 
            break;
        end 
    end
end
x=x>0 %if we failed more than once, it is not possible

4

ES6, 104 100 বাইট

s=>!/13|24|31|42|3[24]{2}1|4[13]{2}2|1[24]{2}3|2[13]{2}4|(.).\1/.test(s.replace(/(.)(\1\1)+/g,"$1"))

সম্পাদনা: @ ডিজিটাল ট্রামুমাকে ধন্যবাদ 4 টি বাইট সংরক্ষিত

আমার পূর্ববর্তী পদ্ধতিটি ত্রুটিযুক্ত হওয়ায় এটি একটি সম্পূর্ণ পুনর্লিখন।

রানটিতে কোনও বিজোড় বা এমনকি সংখ্যা ছিল কিনা তার উপর নির্ভর করে আমি সমস্ত অঙ্কের সংখ্যা 1 বা 2 এ হ্রাস করে শুরু করি। আমি তখন সমস্ত অবৈধ সংমিশ্রনের সন্ধান করি:

  • 13|24|31|42 (বিপরীত দিকগুলো)
  • 3[24]{2}1হিসাবে 3221এবং 3441অবৈধ
  • একইভাবে 4xx2, 1xx3এবং 2xx4যেখানে xনেই অনুপস্থিত সংখ্যা is
  • (.).\1যেমন জিনিসগুলি 121অবৈধ ( আগে 111কমেছে 1)

যদি কোনও অবৈধ জুড়ি বা "ট্রিপল" না থাকে তবে পুরো স্ট্রিংটি বৈধ (ইন্ডাকশন দ্বারা প্রমাণটি একটি অনুশীলন হিসাবে বাকি আছে কারণ এখানে গভীর রাত হয়েছে)।

আমি 3[24]{2}1|1[24]{2}3নেতিবাচক বর্ণনাকারী দৃser়তাটি ব্যবহার করে সরল করার চেষ্টা করেছি তবে এটি সেভাবে দীর্ঘতর হতে পারে।


f("1122") => true@ ডিজিটাল ট্রামুমা
কনর ও'ব্রায়ান

@ CᴏɴᴏʀO'Bʀɪᴇɴ আমি এতে কোনও ভুল দেখছি না। অন্যদিকে আমি বুঝতে পেরেছি যে f("1221221")ভুল উত্তর আউটপুট দেয়, তাই আমাকে পুনর্বিবেচনা করতে হবে।
নীল

একটি পরীক্ষার স্যুট অন্তর্ভুক্ত করা সর্বদা
পাভলো

@Pavlo ওহো, আমি golfed চাই [24][24]থেকে (2|4)\1কিন্তু আমি পর্যাপ্তরূপে পরীক্ষা করা হয়েছিল। এর জন্যে দুঃখিত.
নীল

আপনি কি গল্ফ [24][24]করতে পারেন [24]{2}?
ডিজিটাল ট্রমা

2

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

s=>[r=0,1,2,3].map(i=>[...s].map(n=>n-1-i%4?n%4-i%4?v=0:i+=3:i++,v=1)|v?r=1:0)|r

ব্যাখ্যা

i%4 বর্তমান ক্র্যাঙ্ক অবস্থান:

    1 (i%4 == 1) 2   

(i%4 == 0) (i%4 == 2)

    4 (i%4 == 3) 3   

অভিযুক্ত এবং মন্তব্য করা হয়েছে

s=>
  [r=0,1,2,3].map(i=> // i = crank position, test for i starting at 0 to 3, r = result
    [...s].map(n=>    // for each note n
      n-1-i%4?        // if n is not at the position after i
        n%4-i%4?      // if n is not at the position before i
          v=0         // set the result of this test to invalid
        :i+=3         // else i-- (+3 used because i%4 would break for negative values)
      :i++,           // else i++
      v=1             // v = result of test, initialise to 1 (valid)
    )
    |v?r=1:0          // if the test returned true, set the result to true
  )
  |r                  // return the result

পরীক্ষা

var solution = s=>[r=0,1,2,3].map(i=>[...s].map(n=>n-1-i%4?n%4-i%4?v=0:i+=3:i++,v=1)|v?r=1:0)|r
<input type="text" value="1221441" oninput="result.textContent=solution(this.value)" />
<pre id="result"></pre>


সুন্দরভাবে সম্পন্ন. আপনি কি |এই ক্ষেত্রে কাজ করে ব্যাখ্যা করতে পারেন ?
পাভলো

1
ধন্যবাদ পাভলো এটি লেখার একটি ছোট উপায় (x.map(...),v)। এটি কাজ করে কারণ যে অ্যারেটি mapফেরত দেয় 0এবং 0|v == v
ব্যবহারকারী 81655

2

লুয়া , 146 142 108 162 159 149 144 135 132 118 113 বাইট

z,q,s=0,0,io.read()for i in s:gmatch'.'do t=i-z if 2==math.abs(t)or t==q then return''end q=-t z=i end return 2>1

1 এবং 4 এর মধ্যে সংখ্যার একটি স্ট্রিং দিয়ে সত্য বা মিথ্যা প্রদান করে।

কেবল সর্বশেষ আন্দোলনটি কী তা ট্র্যাক করে এবং পরীক্ষা করে যদি এই আন্দোলনটি শেষ আন্দোলনের বিপরীত হয় (IE, 121 বা 12221) অথবা যদি দূরত্ব সরিয়ে নেওয়া সম্ভবের চেয়ে বেশি হয় তবে।

সম্পাদনা 1 :

6 টি বাইট সংরক্ষণ করা হয়েছে। আমি ভুলে গেছি যে if (int) thenসত্যটি যদি মানটি শূন্য না হয় তবে সত্যটি ফিরে আসে।

এভাবে:

if t~=0 then

এতে পরিবর্তিত হয়:

if t then

পুনর্গঠন করে কয়েকটি বাইটও সংরক্ষণ করেছেন।

সম্পাদনা 2 :

আমি আস্তে আস্তে এটি সন্ধান করছি। আমি এখানে ডকুমেন্টেশন পড়ছি: http://www.lua.org/pil/ এবং গল্ফিংয়ের জন্য সেখানে আরও দরকারী পৃষ্ঠাগুলির মধ্যে একটি হল http://www.lua.org/pil/3.3.html

বিশেষত, এটি খুব সহায়ক:

নিয়ন্ত্রণ কাঠামোর মতো সমস্ত লজিকাল অপারেটর মিথ্যা এবং শূন্যকে মিথ্যা এবং অন্য যে কোনও কিছুকে সত্য বলে বিবেচনা করে।

আমার পক্ষে এর অর্থ হ'ল আমি এগিয়ে যেতে পারি এবং q এর জন্য আমার ঘোষণাটি সরিয়ে ফেলতে পারি ( যা প্রাথমিকভাবে 0 তে সেট করা হয়েছিল ) কারণ এটি সেট না হওয়া পর্যন্ত এটি "মিথ্যা" হিসাবে বিবেচিত হবে। সুতরাং আমি এর মাধ্যমে আরও কয়েকটি বাইট সংরক্ষণ করি।

আরেকটি বিষয় উল্লেখযোগ্য, যদিও আমি এটি ব্যবহার করি না তা হ'ল আপনি যদি লুয়ায় মানগুলি অদলবদল করতে চান তবে অস্থায়ী পরিবর্তনশীলের প্রয়োজন ছাড়াই আপনি তা করতে পারেন a,b=b,a

সম্পাদনা 3

সুতরাং, কিছু চতুর পুনর্গঠনের পাশাপাশি একটি নতুন ফাংশনের মাধ্যমে, আমি আরও 9 দ্বারা বাইট গণনা পেয়েছি।

ইনপুট পাওয়ার জন্য সেরা মোড

আপনার যদি সংখ্যার তালিকায় পড়তে হয় এবং সেগুলি একবারে অপারেশন করতে হয় তবে আপনি ব্যবহার করতে পারেন:

for x in string:gmatch('.') do
    print(x) --This is our number
end

স্ট্রিং: সাব ব্যবহার করে আপনার বিকল্পের সাথে তুলনা করা হলে আপনি গল্ফের মূল্য (বা সাধারণ ব্যবহার) দেখতে পারেন:

for x=1,string:len() do
    print(string:sub(x,x)) --This is our number
end

পুনর্গঠন ফাংশন বা স্ট্রিং

দ্বিতীয় জিনিস, যদি আপনার এক লাইনে একাধিক ঘোষণা থাকে এবং মানগুলির মধ্যে একটি ফাংশন হয় বা আপনার একটি শর্ত থাকে যেখানে আপনি একটি সংখ্যাকে এই জাতীয় ফাংশনের ফলাফলের সাথে তুলনা করেন:

x,y,z=io.read(),0,0 print('test')

if math.abs(x)==2 then

এটি পুনর্গঠন করে যাতে সমাপনী বন্ধনী শর্ত বা ঘোষণার সর্বশেষ চরিত্র হয়, আপনি এর মতো একটি অক্ষর কেটে ফেলতে পারেন:

y,z,x=0,0,io.read()print('test') --Notice no space

if 2==math.abs(x)then --If we put the '2' first in the conditional statement, we can now remove a space character

'সত্য' বা 'মিথ্যা' পরিবর্তে সত্য বা মিথ্যা সমান ফেরত শর্তগুলি

আমার বাইট কাউন্টটি আরও নিচে কাটাতে আমি একটি আধা বিনোদনমূলক উপায় পেয়েছি। আপনার যদি সত্য বা মিথ্যা প্রত্যাবর্তনের দরকার হয় তবে আপনি এমন একটি বিবৃতি দিতে পারেন যা সত্য বা মিথ্যা সমান হয় যার "সত্য" বা "মিথ্যা" এর চেয়ে কম অক্ষর থাকে।

উদাহরণস্বরূপ, তুলনা করুন:

return true
return false

প্রতি:

return 2>1
return 1>2

121মিথ্যা আউটপুট করা উচিত।
lirtosiast

আহ, কিছুই নয়। আমি দেখি. শীঘ্রই ঠিক হয়ে যাবে
Skyl3r

আপনি যদি ইতিমধ্যে সেখানে তালিকাবদ্ধ না দেখে থাকেন তবে লুয়ায় গল্ফ করার জন্য টিপসে সেই লুয়ার কয়েকটি টিপস যুক্ত করতে আগ্রহী হতে পারেন।
এপসিলাররা

2

এমএটিএল, 49 বাইট (প্রতিদ্বন্দ্বী 1 )

১. উত্তর (আব) এমএটিএল-র নতুন সংস্করণগুলির কম কড়া সূচক ব্যবহার করে এবং এই চ্যালেঞ্জটি পোস্ট হওয়ার সময়ে কাজ করতে পারত না।

dt~aX`tt~f1)q:)w3MQJh)_ht~a]tT-3hX|n2=wT_3hX|n2=+

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

আমি এই চ্যালেঞ্জটি সেরা সেরা পিপিসি ২০১ 2016 এ দেখেছি এবং অনুভব করেছি যে এটি আমার প্রিয় অপারেটরটি ব্যবহার করতে পারে :

d

বা, diffম্যাটল্যাব / অক্টেভে (আমি মানুষের ব্যাখ্যায় পড়া সহজ, কারণ) আমি আমার ব্যাখ্যাতে ম্যাটল্যাব / অক্টাভা পরিভাষাটি নির্দ্বিধায় ব্যবহার করব)। এই কমান্ডটি কোনও ভেক্টর বা এই ক্ষেত্রে একটি অক্ষরের অ্যারেতে উপাদান-ভিত্তিক পার্থক্য গণনা করে।

এই সমস্যার জন্য, পার্থক্যগুলি একটি আকর্ষণীয় প্যাটার্ন প্রদর্শন করে। মনে রাখবেন যে

দিক পরিবর্তনের অর্থ অবশ্যই একটি নোট দু'বার বাজানো হয়েছে ।

পার্থক্য প্যাটার্নের জন্য ( 1-4আপাতত রূপান্তর উপেক্ষা করে ) এর অর্থ এটি

সাইন ইন-এর পরিবর্তনের মধ্যে diff(input)অবশ্যই একটি বিজোড় সংখ্যার শূন্য থাকতে হবে । বিপরীতভাবে, এমনকি শূন্যের সমান সংখ্যক পরে সাইনটি পরিবর্তন করার অনুমতি নেই ।


আমি এটি প্রয়োগ করেছি, প্রতিটি অ্যারের জন্য, প্রথম শূন্য খুঁজে বের করে। আমি শূন্য আউট ছাঁটাই, এবং এর পরে সমস্ত উপাদান গুণ করে -1। শেষ ফলাফলের জন্য, এর অর্থ এই যে সমস্ত উপাদানগুলির অবশ্যই একই চিহ্ন থাকতে হবে। অবশ্যই, সেখানে ছোট বিষয় -3equaling +1এবং 2সাধারণভাবে অননুমোদিত হচ্ছে। আমি ফলাফলটির সেট ইউনিয়নটি সাথে নিয়ে [1 -3]এবং এটি 2 মাপের কিনা তা পরীক্ষা করে সমাধান করেছি (উদাহরণস্বরূপ, ইউনিয়নটির মাধ্যমে কোনও অস্বীকৃত উপাদান সেটটিতে প্রবেশ করেছে না)। এর জন্য পুনরাবৃত্তি করুন [-1 3]এবং (বা উভয়ই, 1 দৈর্ঘ্যের ইনপুট ক্ষেত্রে) সত্য কিনা তা পরীক্ষা করে দেখুন।

d                                % Difference of input
 t~a                             % Check if any element equals 0
    X`                     t~a]  % Start while loop, ending in the same check
       t~                           % Get a new vector, logical negated to find zeroes.
          f1)                       % Find the position of the first zero. 
      t         q:)                 % Decrement by 1, to index all elements before that zero.
                   w3MQJh)          % Push the result of 'find', but increment to get all elements after.
                         _h         % Multiply the second half by -1, and concatenate horizontally.

  T-3hX|n2=                      % Check if set union with [1 -3] is size 2
 t        wT_3hX|n2=             % Check if set union with [-1 3] is size 2
                    +            % Logical OR. 

ধন্যবাদ লুইস মেন্ডো আমার সত্যিই পড়তে হবে M, শেষ বার চেষ্টা করার পরে, এটি প্রত্যাশার চেয়ে আলাদাভাবে কাজ করেছে তাই আপাতত আমি এটিকে উপেক্ষা করেছি। এটি কি বলা উচিত যে এটি হওয়া দরকার 3Mকারণ আমি তখন ইনপুট পাই না ), :তবে না q(এড়িয়ে যাচ্ছি wএটি কোনও সাধারণ ক্রিয়া নয়)?
Sanchises

হ্যাঁ অবশ্যই. wএড়ানো হয় কারণ এটি কোনও সাধারণ ফাংশন নয়। সাধারণ ফাংশনগুলি যা কোনও ইনপুট নেয় না সেগুলিও এড়িয়ে যায়
লুইস মেন্ডো

2

পাইথন (3.5) 160 151 150 বাইট

একটি পুনরাবৃত্তি সমাধান

def f(s):g=lambda s,c:s==''or g(s[1:],(c[:4]*2)[(s[0]==c[0])*2+1:])if s==''or s[0]in c[:2]else 0;return any([g(s,"1234123"[i:])for i in range(4)])

ল্যাম্বদা ছাড়াই নিরপেক্ষ

def f(s):
    def g(s,c):
        if s=='' or s[0] in c[:2] :
            return s=='' or g(s[1:],(c[:4]*2)[(s[0]==c[0])*2+1:])
        else:
            return False
    return any([g(s,"1234123"[i:]) for i in range(4)])

আমি ক্র্যাঙ্কের পরিবর্তে সমস্ত বাক্স ঘোরান। ক্র্যাঙ্ক অবস্থানটি স্ট্রিংয়ের প্রথম এবং দ্বিতীয় অক্ষরের মধ্যে থাকে। আমার ক্র্যাঙ্কের সমস্ত শুরুর অবস্থান পরীক্ষা করা দরকার।

স্ট্রিংটি ঘোরানোর জন্য ট্রিক ব্যবহার করুন

পাইথন ( s[i:]+s[:i]) তে স্ট্রিংটি ঘোরানোর জন্য সাধারণ উপায়ে সূচী এবং স্ট্রিং উভয়েরই পুনরাবৃত্তি প্রয়োজন। এই ক্ষেত্রে আমি স্ট্রিংটির সদৃশ এবং প্রথম অক্ষর ক্রপ করি।

(c*2)                        # duplicate the string
     [(s[0]==c[0])*2+1       # test that return 1 if firsts characters match 3 instead 
                      :]     
                        [:4] # crop again to have a 4 characters string

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

[f(i) for i in ["1", "1234", "1221", "3333", "143332", "22234", "2234", "22214", "1221441", "41233", "13", "1224", "121", "12221", "43221"]]
[True, True, True, True, True, True, True, True, True, True, False, False, False, False, False]

1
আপনি স্থানটি সরাতে পারেন 3"[i:]) for
এরিক আউটগলফার

@ এরিকথ আউটগল্ফার ধন্যবাদ আমি এটি সরিয়েছি।
এরওয়ান


1

জাভাস্ক্রিপ্ট (ES2015), 110 95

p=(s,d)=>(h=s[0],t=s.slice(1),g=t[0],!g||(d?g==h?p(t,-d):g%4==(h-d)%4&&p(t,d):p(s,1)||p(s,-1)))

15 বাইট সংরক্ষিত নীল! অরিজিনাল করা আসল সংস্করণ:

p = (s, d) => {
  h = s[0]
  t = s.substr(1)

  if (!t[0]) return true
  if (!d) return p(s, 1) || p(s, -1)
  if (t[0] == h) return p(t, d*-1)
  if (t[0] == (h-d > 4 ? 1 : h-d || 4)) return p(t, d)

  return false
}

পরীক্ষা: https://jsbin.com/cuqicajuko/1/edit?js,console


1
আপনাকে 17 বাইট সংরক্ষণ করেছে:(s,d)=>(h=s[0],t=s.slice(1),g=t[0],!g||(d?g==h?p(t,-d):g%4==(h-d)%4&&p(t,d):p(s,1)||p(s,-1)))
নিল

এখনও @ ব্যবহারকারী 81655 এর উত্তরের চেয়ে কম নয়।
নিল

1

টুরিং মেশিন কোড, 395 বাইট

0 1 _ r a
0 2 _ r b
0 3 _ r c
0 4 _ r d
a 1 _ r a
a 2 _ r E
a 3 _ r h
a 4 _ r S
b 1 _ r W
b 2 _ r b
b 3 _ r S
b 4 _ r h
c 1 _ r h
c 2 _ r N
c 3 _ r c
c 4 _ r W
d 1 _ r N
d 2 _ r h
d 3 _ r E
d 4 _ r d
N 1 _ r W
N 2 _ r E
N _ _ r r
N * _ r h
E 2 _ r N
E 3 _ r S
E _ _ r r
E * _ r h
S 3 _ r E
S 4 _ r W
S _ _ r r
S * _ r h
W 4 _ r S
W 1 _ r N
W _ _ r r
W * _ r h
h _ 0 r halt
h * _ r h
r _ 1 r halt

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

এটি মূলত একটি রাষ্ট্র-ভিত্তিক পদ্ধতি:

  • প্রাথমিক অবস্থা 0
  • a, b, c, এবং d"অমীমাংসিত যুক্তরাষ্ট্র" যে শুধুমাত্র শুরুতে ঘটে
  • N, E, S, এবং W"সিদ্ধান্ত নিয়েছে যুক্তরাষ্ট্র" অবশ্যই জন্য দাঁড়িয়ে আছেন NOrth, EAST, South, এবং Wহল।

1

থু, 203 বাইট

আমি কীভাবে এই আরও গল্ফ করব তা ভাবতে পারি না।

0::=:::
>11::=>1
>22::=>2
>33::=>3
>44::=>4
>12::=b
>21::=d
>14::=c
>41::=a
>23::=c
>32::=a
>34::=d
>43::=b
a1::=d
a2::=b
b2::=a
b3::=c
c3::=b
c4::=d
d4::=c
d1::=a
a<::=~n
b<::=~e
c<::=~s
d<::=~w
::=
>0<

যদি নোট ক্রমটি সম্ভব হয় তবে আউটপুট সমাপ্তির দিকনির্দেশনা হবে, অন্যথায় আউটপুট খালি থাকবে।


1

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

a(N,P):-P=N;N=1,P=4,!;P is N-1.
m([A,B|C],[X,Y|Z]):-a(A,X),a(B,X),a(B,Y),X\=Y,m([B|C],[Y|Z]).
m([_],_).
p(N):-m(N,_).

প্লেটেবল সংজ্ঞা দেয় pযা প্লেযোগ্য ইনপুটগুলিতে সাফল্য পায় (পূর্ণসংখ্যার তালিকার হিসাবে দেওয়া হয়) এবং প্লেযোগ্য খেলাগুলিতে ব্যর্থ হয়। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

aনোট Nএবং ক্র্যাঙ্ক অবস্থানের মধ্যে একটি সংলগ্ন সম্পর্ককে সংজ্ঞায়িত করে P। আমরা পি এবং নোট পি এবং পি + 1 এর মধ্যে অবস্থান পিকে সংজ্ঞায়িত করি । সুতরাং, একটি অবস্থান iff নোট সংলগ্নN

  • এটি সমান N( P=N); অথবা
  • নোটটি 1 এবং অবস্থানটি 4 ( N=1,P=4); অথবা
  • উপরের !কেসটি সত্য নয় ( ) এবং অবস্থান সমান N-1( P is N-1)।

mনোটগুলির একটি তালিকা নেয় এবং পজিশনের একটি তালিকা তৈরি করার চেষ্টা করে যা এই নোটগুলি খেলবে। Aসবেমাত্র নোটটি বাজানো হয়, Bসেই নোটটি কী খেলতে চলেছে; Xবর্তমান ক্র্যাঙ্ক অবস্থান, Yপরের ক্র্যাঙ্ক অবস্থান। একটি পদক্ষেপ বৈধ হয় if

  • সবে খেলানো নোটটি বর্তমান ক্র্যাঙ্ক পজিশনের ( a(A,X)) সংলগ্ন ;
  • প্লে করা সম্পর্কে নোটটি বর্তমান ক্র্যাঙ্ক অবস্থানের সাথেও সংলগ্ন ( a(B,X));
  • খেলতে হবে নোটটি পরবর্তী ক্র্যাঙ্ক অবস্থানের ( a(B,Y)) সংলগ্ন ; এবং
  • দুটি ক্র্যাঙ্ক অবস্থান সমান নয় ( X\=Y)।

এই সব যদি ধরে থাকে তবে পুনরাবৃত্তি করুন। যদি আমরা সফলভাবে কোনও একটি নোট ( m([_],_)) এ নামি, তবে নোটগুলির ক্রম খেলতে পারা যায়।

এই প্রশ্নের জন্য, আমরা কেবল চালনার ক্রম বিদ্যমান কিনা তা যত্নশীল তাই আমরা ক্র্যাঙ্ক পজিশনের উত্পন্ন তালিকাটি pকল করতে mএবং বাতিল করতে সংজ্ঞায়িত করি ।

একটি নিরবচ্ছিন্ন সংস্করণ দেখুন এবং সমস্ত পরীক্ষার কেস এখানে যাচাই করুন

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