আপনি কি একটি ঘনক্ষেত্রে একটি হেক্সোমিনো ভাঁজ করতে পারেন?


24

আমার বাচ্চাদের পছন্দের খেলনাগুলির মধ্যে একটি সেট এটি । আসলে এটি আমার প্রিয় খেলনাগুলির মধ্যে একটি - আমি এটি নিয়ে খেলছি এবং এটি আমাকে কিছু পিপিসি চ্যালেঞ্জ ধারণা দিচ্ছে। এখানে একটি:

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও ASCII লাইন অঙ্কনকে ইনপুট হিসাবে গ্রহণ করে এবং সিদ্ধান্ত নেয় এটি কিউবে ফোল্ড হয় কিনা।

ইনপুট

ইনপুটটিতে ঠিক এর মতো স্কোয়ারগুলি থেকে তৈরি একটি হেক্সোমিনো থাকবে:

+-+
| |
+-+

উদাহরণস্বরূপ একটি বৈধ ইনপুট হেক্সিমিনো হ'ল:

+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+

আউটপুট

  • সত্যবাদী মান যদি হেক্সোমিনোকে একটি ঘনককে ভাঁজ করা যায়, বা
  • অন্যথায় একটি মিথ্যা মান।

আমাদের কিছুটা কাজ বাঁচাতে উইকিপিডিয়ায় এর দুর্দান্ত গ্রাফিক্স রয়েছে:

  • সমস্ত 35 hexominoes:

  • সমস্ত 11 টি হেক্সোমিনো যা কিউবগুলিতে ভাঁজ হয়:

নোট

  • ইনপুট হেক্সোমিনোয়সের কোনও ঘূর্ণন বা প্রতিবিম্ব থাকতে পারে, কেবল উপরের চিত্রগুলিতে দেখানো নয়
  • ইনপুট হেক্সোমিনোয়াসের নেতৃস্থানীয় স্পেস থাকতে পারে তবে তারা নিজেরাই যথাযথভাবে সংযুক্ত হবে
  • ইনপুট হেক্সোমিনোয়াসগুলিতে ইনপুট শেষে লাইনের শেষে এবং পিছনে নতুন লাইনের স্থান থাকতে পারে

1
আপনি এখানে ব্যাখ্যা করতে পারেন কেন এখানে একটি চিত্র-প্রসেসিং ট্যাগ রয়েছে? চ্যালেঞ্জটি সমাধান করার জন্য প্রশ্ন বা উত্তর দুটিই কোনও ধরণের চিত্র প্রক্রিয়াকরণ করতে হবে না।
অপ্টিমাইজার

শীর্ষস্থানীয় / চলমান স্থান সম্পর্কে স্পষ্টতা: প্রতিটি সারিতে অপ্রয়োজনীয় নেতৃস্থানীয় / পিছনের স্থান এবং ইনপুটটিতে অপ্রয়োজনীয় নিউলাইনগুলি অনুমোদিত? আমি কি 1000+ অক্ষর ইনপুট পরিচালনা করতে সক্ষম হব?
edc65

@ edc65 হ্যাঁ আপনার বর্ণনা করা অপ্রয়োজনীয় সাদা স্থান আশা করা উচিত। 1000 অক্ষর সর্বাধিক ইনপুট আকার যুক্তিযুক্ত বলে মনে হয় - আমি এটিকে সম্পাদনা করব
ডিজিটাল ট্রমা

হুম। আমি অবাক হয়েছি যে কোনও মুদ্রিত পৃষ্ঠায় কতগুলি কিউব হেক্সোমিনোসকে ছেঁটে ফেলা যায়?
luser droog

উত্তর:


7

পিএমএ / শামুক , 130

.!(z\ |o{c..!(z\ }3){w=(..!(z\ )|b..!(z\ )o{..!(z\ }2|c{..!(z\ }1,2w..!(z\ )|w{..!(z\ }1,2c..!(z\ }4o..!(z\ )(..!(z\ )|n..!(z\ )`2

বা আরও "পাঠ্য",

?
.!(z\  | o{c..!(z\ }3  )
{w =( ..!(z\ ) | b ..!(z\ ) o {..!(z\ }2  | c {..!(z\ }1,2w..!(z\ ) | w {..!(z\ }1,2c..!(z\  }4
o  ..!(z\ ) ( ..!(z\ ) | n ..!(z\ ) `2

অসাধারণভাবেই, এমন একটি সমস্যা এসেছিল যা এ পর্যন্ত কার্যকর করা সীমিত পরিমাণের বৈশিষ্ট্যগুলি দ্বারা পরিচালনা করা যেতে পারে। !(z\ )প্যাটার্ন নির্ধারণ করে একটি বর্গক্ষেত্র একটি নেতিবাচক কথন কিছু "octilinear" পথে একটি স্থান নেই ব্যবহার মাঝখানে স্পেস এ যা বর্তমান অবস্থান। সাধারণ ধারণাটি এমন একটি প্যাটার্নটি পরীক্ষা করে যা ম্যাচটি শুরু হয় এমন স্কোয়ারের সাথে তুলনামূলকভাবে প্রয়োজনীয় 5 টির প্রত্যেকটিতে একটি স্কোয়ার রাখে। এছাড়াও, এটি পরীক্ষা করা দরকার যে এটি স্কোয়ারের 2x2 ব্লকের মধ্যে নেই। প্রোগ্রামটি কাজ করার আগে, আমাকে প্রথম বন্ধনী পার্সিংয়ের সাথে একটি বাগ ঠিক করতে হয়েছিল।

যদি হেক্সোমিনো কোনও কিউবে মানচিত্র না রাখে 0তবে মুদ্রিত হয়। যদি এটি হয় তবে কিছু ইতিবাচক পূর্ণসংখ্যা মুদ্রিত হবে (ম্যাচের সংখ্যা)।

সমস্ত সম্ভাব্য পরীক্ষার কেস তৈরি করতে আমি এই পলিওমিনো জেনারেটরটি রূপান্তর করেছি :

n=input()
r=range
T=lambda P:set(p-min(p.real for p in P)-min(p.imag for p in P)*1j for p in P)
A=[]
for i in r(1<<18):
 P=[k%3+k/3*1j for k in r(18)if i>>k&1]
 C=set(P[:1])
 for x in P:[any(p+1j**k in C for k in r(4))and C.add(p)for p in P]
 P=T(P)
 if not(C^P or P in A or len(P)-n):
  #for y in r(4):print''.join(' *'[y+x*1j in P] for x in r(6))
  o = [ [' ']*13 for _ in r(9)]
  for y in r(4):
   for x in r(6):
    if y+x*1j in P: X=2*x;Y=2*y; o[Y][X]=o[Y+2][X]=o[Y][X+2]=o[Y+2][X+2]='+'; o[Y][X+1]=o[Y+2][X+1]='-';o[Y+1][X+2]=o[Y+1][X]='|'
  print '\n'.join(map(''.join,o))
  A+=[T([p*1j**k for p in P])for k in r(4)]

হাহাহাহাহাহাহাহাহা আরও "পাঠযোগ্যভাবে"
অপ্টিমাইজার

5

রুবি, 173 148 145 143 বাইট

h=->b,c{[c.count(c.max),c.count(c.min),3].max*2<b.max-b.min}
->s{x=[];y=[];i=j=0
s.bytes{|e|e==43&&x<<i|y<<j;i=e<32?0*j+=1:i+1}
h[x,y]||h[y,x]}

সর্বশেষ পরিবর্তন: বাম পাশে প্রতিস্থাপনের /2ডানদিকে । এর একটি সেট নির্মূলের অনুমতি দেয়<*2()

ব্যাখ্যা

কোডটি দুটি অংশে রয়েছে: একটি প্রধান নামবিহীন ফাংশন যা পার্সিং করে এবং একটি সহায়ক অজ্ঞাতনীয় ফাংশন যা ভেরিয়েবলের জন্য নির্ধারিত hহয় যা পরীক্ষা করে।

মূল ফাংশনটি স্ট্রিংয়ের মাধ্যমে বাইরের দিকে স্ক্যান করে এবং এতে পাওয়া i,jসমস্ত +চিহ্নের x এবং y স্থানাঙ্ক যুক্ত করে । এটি তখন দু'বার কল করে। প্রথমবার এটি অনুমান করে যে হেক্সোমিনোটি অনুভূমিক ( দৈর্ঘ্য এবং প্রস্থকে ধারণ করে ) এবং দ্বিতীয়বার এটি অনুভূমিক বলে ধরে নেয়।x[]y[]hx[]y[]

ফাংশনটি hঅ্যারেতে bদৈর্ঘ্যমুখী স্থানাঙ্কগুলি নেয় তারপর অ্যারেতে প্রস্থের স্থানাঙ্কগুলি cএটি এক্সপ্রেশন দ্বারা দৈর্ঘ্য (স্কোয়ারে) গণনা করে (b.max.b.min)/2। এটি 3 এর চেয়ে কম বা সমান হলে হেক্সোমিনোকে অন্য দিক দিয়ে মূল্যায়ন করা উচিত যাতে hপ্রত্যাবর্তন হয় false

হেক্সোমিনোস পরিদর্শন করে দেখাতে হবে যে দৈর্ঘ্য 4 হলে যেসব হেক্সোমিনোস ঘনককে ভাঁজ করবে তাদের +প্রথম এবং শেষ সারিতে 2 স্কোয়ার (3 চিহ্ন) এর বেশি হবে না । বেশিরভাগ স্কোয়্যার মাঝারি সারিতে ঘন থাকে, যা ঘনক্ষেত্রের নিরক্ষীয় অঞ্চলে পরিণত হবে। এই অবস্থাটি 4 ঘন দৈর্ঘ্যের হেক্সোমিনোগুলির জন্য প্রয়োজনীয় এবং পর্যাপ্ত হতে পারে যা একটি ঘনককে ভাঁজ করবে।

5 দৈর্ঘ্যের একমাত্র হেক্সোমিনো যা ঘনককে ভাঁজ করবে। +এটির প্রথম এবং শেষ সারিগুলিতে 3 স্কোয়ার (4 টি প্রতীক) রয়েছে। 5 এর দৈর্ঘ্যের অন্যান্য সমস্ত হেক্সোমিনোতে +প্রথম বা শেষ সারিতে হয় 5 বা ততোধিক চিহ্ন।

দৈর্ঘ্যের 6 টি মাত্র একটি হেক্সোমিনো রয়েছে এটির +প্রতিটি সারিতে 7 টি চিহ্ন রয়েছে ।

এই সমস্ত একসাথে রেখে, এটি পরীক্ষা করা যথেষ্ট যে হেক্সোমিনোটির দৈর্ঘ্য 3 এর চেয়ে বেশি এবং +প্রথম এবং শেষ সারিগুলির প্রতীক সংখ্যা (যেটি আরও বেশি) দৈর্ঘ্যের চেয়ে কম is

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

#checking function as explained in text
h=->b,c{[c.count(c.max),c.count(c.min),3].max<(b.max-b.min)/2}

#main function for parsing
f=->s{
  x=[]                 #separate assignments required, 
  y=[]                 #otherwise we get 2 pointers to the same array
  i=j=0                #start coordinates 0,0
  s.bytes{|e|          #scan string bytewise
    e==43&&x<<i|y<<j     #if byte is a + symbol (ascii 43) add the coordinates to arrays x and y
    i=e<32?0*j+=1:i+1    #if byte is before ascii 32 assume newline, increment j and zero i. Otherwise increment i
  }
  h[x,y]||h[y,x]       #call h twice, with x and y in each possible order
}



#VALID INPUTS
puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
+-+
| |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
      | |
      +-+"]

puts f["
    +-+
    | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
    +-+
    | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]


puts f["
  +-+
  | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]  
puts f["
+-+-+
| | |
+-+-+-+
  | | |
  +-+-+-+
    | | |
    +-+-+"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+-+
      | | | |
      +-+-+-+
"]


#INVALID INPUTS

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
  | | | |
  +-+-+-+
"]


puts f["
  +-+-+-+-+-+-+
  | | | | | | |
  +-+-+-+-+-+-+

"]


puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
    | |
    +-+
"]

puts f["
      +-+
      | |
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+-+
        | | |
        +-+-+"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
      | | |
      +-+-+
"] 


puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
  | | | |
  +-+ +-+
"]

puts f["
 +-+   +-+
 | |   | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
   +-+-+
   | | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+
  | |
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+-+-+
  | | | |
  +-+-+-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+
| |
+-+
| |
+-+"]

puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+-+
  | | |
  +-+-+
    | |
    +-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
    | | | |
    +-+-+-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
      | |
      +-+-+
      | | |
      +-+-+
"]


puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
      | | |
      +-+-+
        | |
        +-+
"]

আপনার লেখায় পেন্টনিমো → হেক্সোনিমো?
পাওলো ইবারম্যান

3

জাভাস্ক্রিপ্ট (ES6), 443 431

বাগ ফিক্স সম্পাদনা করুন , ইনপুট পার্স করার সময় সমস্যা, ফাঁকা কলামগুলি সরানো

F=t=>(a=b=c=d=e=f=g=h=0,M=Math.min,
t=t.split('\n').filter(r=>r.trim()>''),
t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))),
t.map((r,i)=>i&1&&[...r].map((_,j)=>j&1&&r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|'
&&(y=i>>1,x=j>>1,z=y*5,w=x*5,a|=1<<(z+x),e|=1<<(w+y),b|=1<<(4+z-x),f|=1<<(4+w-y),c|=1<<(20-z+x),g|=1<<(20-w+y),d|=1<<(24-z-x),h|=1<<(24-w-y)
))),~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(M(a,b,c,d,e,f,g,h)))

এটি খুব দীর্ঘ, এবং আরও দীর্ঘতর ইনপুট পার্সিং করা কাজটির একটি বড় অংশ।

আমি যা করি তা যাচাই করা হয় যদি প্রদত্ত ইনপুটটি 11 ফোল্ডেবল হেক্সোমিনোয়সের মধ্যে একটি হয়।

প্রতিটি ফোল্ডেবল হেক্সোমিনোকে কিছু 5x5 বিটম্যাপে ম্যাপ করা যায় (8 টি আলাদা, এক সাথে সিমেট্রি এবং আবর্তন)। বিটম্যাপগুলি 25 বিট নম্বর হিসাবে নেওয়া, আমি নীচের কোডটি ব্যবহার করে 11 টি উল্লিখিত হেক্সোমিনোয়ের ন্যূনতম মানগুলি পেয়েছি (খুব সাধারণ ইনপুট ফর্ম্যাট সহ)

h=[ // Foldable hexominoes
'o\noooo\no', ' o\noooo\n o', // pink
'o\noooo\n   o', ' o\noooo\n  o', 'ooo\n  ooo', 'oo\n oo\n  oo', //blue
'o\noooo\n o', 'o\noooo\n  o', 'oo\n ooo\n o', 'oo\n ooo\n  o', 'o\nooo\n  oo' // gray
]
n=[]
h.forEach(t=>(
  a=[],
  t.split('\n')
    .map((r,y)=>[...r]
      .map((s,x)=>s>' '&&(
         a[0]|=1<<(y*5+x),a[1]|=1<<(x*5+y),  
         a[2]|=1<<(y*5+4-x),a[3]|=1<<(x*5+4-y),  
         a[4]|=1<<(20-y*5+x),a[5]|=1<<(20-x*5+y),  
         a[6]|=1<<(24-y*5-x),a[7]|=1<<(24-x*5-y))
     )
  ),
n.push(Math.min(...a))
))

যে দেয় [1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]

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

// Not so golfed 

F=t=>(  
  a=b=c=d=e=f=g=h=0,M=Math.min,
  t=t.split('\n').filter(r=>r.trim()>''), // remove blank lines
  t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))), // remove blank colums to the left
  t.map((r,i)=>i&1&&[...r] // only odd rows
   .map((_,j)=>j&1&& // only odd columns
      r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|' // found a cell
         &&(y=i>>1,x=j>>1,z=y*5,w=x*5, // find bitmaps for 8 rotations/simmetries
            a|=1<<(z+x),e|=1<<(w+y),  
            b|=1<<(4+z-x),f|=1<<(4+w-y),  
            c|=1<<(20-z+x),g|=1<<(20-w+y),  
            d|=1<<(24-z-x),h|=1<<(24-w-y)  
    ))),
   ~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(Math.min(a,b,c,d,e,f,g,h)) // look for min
)

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


আমি যদি কিছু মিস করছি তবে আমাকে ক্ষমা করুন, তবে আপনি কি ,\nt=tদ্বিতীয় লাইনের শেষে / তৃতীয় লাইনের শুরু থেকে পারছেন না ?
কনর ও'ব্রায়েন

@ সিওবি'-এর ছয় মাস পরে পর্যালোচনা করে, পার্সিং কোডটি 10 ​​... 15 বাইট সংক্ষিপ্ত করা যায়। যেমনটি, আমার লাইন 2 এবং আবার 3 লাইনে টি করার জন্য অ্যাসাইনমেন্টটি প্রয়োজন কারণ 3 লাইনে এটি বাম দিকে কাটা ফাঁকা অক্ষরের সংখ্যাটি ব্যবহার করতে ব্যবহৃত হয়।
edc65
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.