ত্রিভুজাকার গ্রিডগুলিতে প্রান্তিককরণ


18

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

প্রথমত, আমরা কীভাবে ত্রিভুজাকার গ্রিড উপস্থাপন করব? নিম্নলিখিত উদাহরণটি বিবেচনা করুন (আপাতত সঠিক চিত্রটি উপেক্ষা করুন):

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

কোষগুলি ঝরঝরেভাবে একটি নিয়মিত গ্রিডের উপরে পড়ে (নিয়মিত গ্রিডের পার্থক্য কেবল কেবল সেই ঘরগুলি সংলগ্ন বলে মনে করা হয়):

1234567
89abcde
fghijkl
mnopqrs

এখন, ডান চিত্রটি যেমন দেখায়, ত্রিভুজাকার গ্রিডটিতে তিনটি প্রধান অক্ষ রয়েছে: একটি অনুভূমিক এবং দুটি তির্যক।

এএসসিআইআই গ্রিডে এগুলি হাইলাইট করা:

AVAVAVA
VAabcAV
fVAiAVl
mnVAVrs

চ্যালেঞ্জ

আপনাকে একটি ত্রিভুজাকার গ্রিড উপস্থাপন করে একটি আয়তক্ষেত্রাকার স্ট্রিং দেওয়া হয়েছে (যেখানে উপরের বাম কোণটি একটি উপরের দিকে নির্দেশিত ত্রিভুজ)। বেশিরভাগ কোষের .কক্ষগুলি হবে তবে সঠিকভাবে দুটি কোষ হবে #যেমন:

....#
.#...
.....

দুটি #গ্রিডের তিনটি অক্ষের সাথেই বিন্যস্ত রয়েছে কিনা তা নির্ধারণ করুন (উদাহরণস্বরূপ উপরে বর্ণিত তিনটি দিকের যে কোনও একটিতে তারা একটি সারিতে রয়েছেন কিনা)। এই উদাহরণস্বরূপ, উত্তরটি "না"।

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

ইনপুট লাইনফিড বা কিছু অন্যান্য সুবিধাজনক চরিত্র বা স্ট্রিংয়ের তালিকার মাধ্যমে সীমাবদ্ধ একক স্ট্রিং হতে পারে। আপনি এর জায়গায় কোন দুটি (সামঞ্জস্যপূর্ণ) মুদ্রণযোগ্য ASCII অক্ষর ব্যবহার করতে পারেন .এবং #

আউটপুট একটি হওয়া উচিত truthy মান যদি হাইলাইট কোষ সংযুক্ত করা হয় এবং একটি falsy মান অন্যথায়।

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

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

সত্যবাদী গ্রিড:

.#..#.

#
#

...........
...#.......
...........
...........
...........
.......#...
...........

...........
.......#...
...........
...........
...........
...#.......
...........

.#.........
...........
...........
...........
...........
.......#...
...........

...........
...#.......
...........
...........
...........
...........
.......#...

.........#.
...........
...........
...........
...........
...#.......
...........

...........
.......#...
...........
...........
...........
...........
...#.......

...........
.#.....#...
...........
...........
...........

মিথ্যা গ্রিড:

#.....
.....#

.....#
#.....

...#.......
...........
...........
...........
...........
.......#...
...........

...........
...#.......
...........
...........
...........
...........
.........#.

.......#...
...........
...........
...........
...........
...#.......
...........

...........
.......#...
...........
...........
...........
...........
.#.........

উত্তর:


3

শামুক , 40 39 বাইট

\#{z|=(ul.ul.`,l~a~)(l.a3|.a|d.ea5}.,\#
\# ,, ম্যাচ '#'
{
  z | ,, হয় যে কোনও অষ্টিনিয়র দিকে ঘুরুন, বা stuff এর আগে অন্য সমস্ত জিনিসগুলি করুন}
  = (,, যদি এই দৃser়তা সফল হয় তবে শুরুর ঘরটি একটি "উপরের দিকে নির্দেশিত ত্রিভুজ"
    ul.ul.`, ,, একটি সেল উপরে যান বা দুবার রেখে যান, যে কোনও সংখ্যক বার।
              ,, এটি ul.`2, বা ul.`2 + এর সাথে এক বাইট ছোট হওয়া উচিত ছিল? কিন্তু
              `এর পার্সিংটি বগি।
    l ~ a ~ ,, পরীক্ষা করুন যে বামে এবং তারপরে উত্তর-পূর্বের সীমানা মিলে আমরা শীর্ষ-বাম কক্ষে রয়েছি
  )
  (l.a3 | ,, একবার বাম দিকে সরানো, তারপরে উত্তর-পশ্চিম দিকে দিকনির্দেশ করুন; বা
    .এ | ,, একবার ডানদিকে সরান (প্রাথমিক দিক), তারপরে উত্তর-পূর্বের দিকে দিক নির্ধারণ করুন; অথবা
    d.ea5 ,, একবার নীচে সরান, তারপরে উত্তর-পশ্চিম বা উত্তর-পূর্বের দিকে দিক নির্ধারণ করুন
}
।, ,, যেকোন সংখ্যক স্বেচ্ছাসেবী চরিত্রের সাথে মিলিত করুন (বর্তমান দিকে চলমান)
\# ,, ম্যাচ '#'

2

সিজেম, 47 বাইট

ঠিক আছে, এখন একটি সংক্ষিপ্ত সমাধানের পরে আমার নিজের ভাগ করে নিতে খারাপ লাগছে না। :) (বেশিরভাগ ক্ষেত্রে আপনার কাছে 2 ডি প্যাটার্নের সাথে ম্যাচিং ভাষা না থাকলেও এটি বিশেষত কঠিন নয় তা দেখানোর জন্য ...)

qN%:eeee::f+:~{S&},2f<:P0f=P::+Xf|P::-Xf|]::=:|

এটি এর জায়গায় স্পেস #এবং সত্যিকারের অন্য কিছু ব্যবহার করে .

সমস্ত পরীক্ষার কেস অনলাইনে চালান।

আমি সদৃশটিকে ঘৃণা করি P::+Xf|P::-Xf|তবে এখন পর্যন্ত আমি এ থেকে মুক্তি পাওয়ার জন্য কিছুই নিয়ে আসিনি।

ব্যাখ্যা

আপনি নিজের জন্য কোনও সমাধান বের করতে চান কিনা তা পড়বেন না।

প্রথমত, বিরক্তিকর অংশ: ইনপুট গ্রিডে দুটি স্পেসের দুটি স্থানাঙ্ক জোড়া পাওয়া:

qN%   e# Read input and split into lines.
:ee   e# Enumerate the characters in each line. I.e. turn each character 'x into a pair
      e# [N 'x] where N is its horizontal 0-based index.
ee    e# Enumerate the lines themselves, turning each line [...] into [M [...]] where M
      e# is its vertical 0-based index.
::f+  e# This distributes the vertical index over the individual lines, by prepending it
      e# to each pair in that line. So now we've got a 2-D array, where each character 'x
      e# has been turned into [M N 'x].
:~    e# Flatten the outermost dimension, so that we have a flat list of characters with
      e# their coordinates.
{S&}, e# Filter only those lists that contain a space.
2f<   e# Truncate the two results to only their first two elements.
:P    e# Store the result in P.

আকর্ষণীয় অংশটি হল কীভাবে স্থানাঙ্কগুলি সারিবদ্ধ করা হয়েছে কি না তা নির্ধারণ করা। আমার কোডগুলি তিনটি অক্ষকে আলাদাভাবে গণনা করে:

  • অনুভূমিক অক্ষটি তুচ্ছ। উল্লম্ব স্থানাঙ্ক মেলে কিনা তা পরীক্ষা করে দেখুন।
  • উত্তর-পূর্ব তির্যকটি দেখুন look এএসসিআইআই গ্রিডে সর্বদা দুটি এন্টিডিজোনাল থাকে যা প্রতিটি ত্রি-গ্রিডের তিরুজের অন্তর্গত:

    ....AV..
    ...AV...
    ..AV....
    

    আমরা সমন্বয়কারীগুলি xএবং যোগ করে বর্তমান অ্যান্টিডিয়োনালটি সনাক্ত করতে পারি y:

    01234567
    12345678
    23456789
    

    সুতরাং আমরা চাই 0এবং 1একই তির্যক, সেইসাথে 2এবং 3, এবং 4এবং এর 5সাথে সম্পর্কিত হতে চাই। তার মানে, একবার আমাদের অ্যান্টি-ডায়াগোনাল ইনডেক্স পরে আমরা পরবর্তী বিজোড় সংখ্যার দিকে যেতে চাই। অন্য কথায়, আমরা কিছুটা ওদিকে নিয়ে যাই 1। (আমরা বিটওয়াইস এবং এর সাথে পরবর্তী সমান সংখ্যায়ও যেতে পারি -2তবে কোডে এটি আরও ব্যয়বহুল))

  • এখন দক্ষিণ-পূর্ব তির্যক:

    .VA.....
    ..VA....
    ...VA...
    

    অর্ডার কর্ণ একটি সূচক দিতে করার জন্য, আমরা বিয়োগx থেকে yতুল্য (অক্ষর যেমন প্রতিনিধিত্বমূলক ঋণাত্মক সংখ্যা):

    0abcdefg
    10abcdef
    210abcde
    

    এই ক্ষেত্রে, আমরা চাই 0এবং 1একই তির্যক, সেইসাথে এবং -1এবং -2, বা 2এবং এর অন্তর্গত 3। সুতরাং আবার, আমরা পরবর্তী বিজোড় সংখ্যা পর্যন্ত পেতে চান।

তার জন্য কোডটি এখানে:

0f=  e# The coordinates are still on the stack. Replace each with its vertical coordinate
     e# to check for the horizontal axis.
P    e# Push the coordinates again.
::+  e# Sum each pair to get an anti-diagonal index.
Xf|  e# OR each index with 1 to round up to the next odd number.
P    e# Push the coordinates again.
::-  e# In each pair, subtract the horizontal coordinate from the vertical, to
     e# get a diagonal index.
Xf|  e# OR each index with 1.
]    e# Wrap all three index pairs in an array.
::=  e# Check equality for each pair.
:|   e# Fold bitwise OR over the results to check if at least one pair of indices
     e# was equal.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.