মুখের স্বীকৃতি


43

এই কাজের উদ্দেশ্য হ'ল যে কোনও 'চিত্র' তে সমস্ত মুখ চিহ্নিত করা, পরিষ্কার করা এবং চিহ্নিত করা।

কি মুখে?

একটি মুখটি একটি জেডএক্সজেড স্কোয়ারে থাকবে যেখানে জেডটি ১ এর চেয়ে বড় একটি পূর্ণসংখ্যার পূর্ণসংখ্যা The বাকি রেখাটি পূরণ করতে '_' অক্ষর উদাহরণ:

একটি 3x3 মুখ:

O O
 O
\_/

একটি 5x5 চেহারা:

O   O

  O

\___/

একটি 7x7 মুখ:

O     O


   O


\_____/

প্রভৃতি

ইনপুট

ইনপুটটি STDIN এ থাকবে এবং এতে অক্ষরের সমান দৈর্ঘ্যের স্ট্রিং থাকবে।

আউটপুট

আউটপুট হ'ল সমস্ত স্বীকৃত মুখ সাফ করা (যেমন চোখ, নাক এবং মুখের জোরে সমস্ত অক্ষর মুখের সীমানা থেকে সরানো হবে) এবং বক্সযুক্ত (+, -, এবং | অক্ষর দ্বারা বেষ্টিত) ইনপুট হওয়া উচিত। যেখানে দুটি বা ততোধিক মুখ দুটিই পরিষ্কার করা এবং বক্স করা উচিত তবে বৃহত্তর মুখকে অগ্রাধিকার দেওয়া উচিত (এটি শীর্ষে রাখা উচিত); যদি উভয় মুখ একই আকার হয় তবে অগ্রাধিকারটি প্রয়োগকারীটির বিচক্ষণতার জন্য রেখে দেওয়া হবে। যদি ইনপুটটির কোনও মুখ না থাকে তবে আউটপুটটি ইনপুট হিসাবে একই হওয়া উচিত।

কিছু উদাহরণ

ইনপুট:

*******
*******
**O*O**
***O***
**\_/**
*******
*******

আউটপুট:

*******
*+---+*
*|O O|*
*| O |*
*|\_/|*
*+---+*
*******

ইনপুট (অসম্পূর্ণ মুখ):

*******
*******
**O*O**
*******
**\_/**
*******
*******

আউটপুট:

*******
*******
**O*O**
*******
**\_/**
*******
*******

ইনপুট (নেস্টেড মুখ):

*******
*O***O*
**O*O**
***O***
**\_/**
*\___/*
*******

আউটপুট:

+-----+
|O   O|
|     |
|  O  |
|     |
|\___/|
+-----+

ইনপুট (একাধিক মুখ):

~{$FJ*TBNFU*YBVEXGY%
FOCO$&N|>ZX}X_PZ<>}+
X$OOPN ^%£)LBU{JJKY%
@\_/$£!SXJ*)KM>>?VKH
SDY%£ILO(+{O:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJO$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@\___/GER%^*BI
@{PO{_):<>KNUYT*&G&^

আউটপুট:

+---+*TBNFU*YBVEXGY%
|O O|&N|>ZX}X_PZ<>}+
| O |N ^%£)LBU{JJKY%
|\_/|£+-----+M>>?VKH
+---+I|O   O|HO(UR$W
XVBFTE|     |LO*(&P:
>?LKPO|  O  |&L:}~{&
~@?}{)|     |@~}P>OU
:@<L::|\___/|ER%^*BI
@{PO{_+-----+YT*&G&^

ইনপুট (সীমানার নিকটে):

~{$FJ*TBNFU*YBVEXGY%
OCO$&N|>ZX}X_PZ<>}+^
$OOPN ^%£)LBU{JJKY%{
\_/$£!SXJ*)KM>>?VKHU
SDY%£ILO(+{8:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJ^$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@BJYT*GER%^*BI
@{PO{_):<>KNUYT*&G&^

আউটপুট:

---+J*TBNFU*YBVEXGY%
O O|&N|>ZX}X_PZ<>}+^
 O |N ^%£)LBU{JJKY%{
\_/|£!SXJ*)KM>>?VKHU
---+£ILO(+{8:HO(UR$W
XVBFTER^&INLNLO*(&P:
>?LKPO)UJ^$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@BJYT*GER%^*BI
@{PO{_):<>KNUYT*&G&^

ইনপুট (ওভারল্যাপিং মুখগুলি):

~{$FJ*TBNFU*YBVEXGY%
FXC£$&N|>ZX}X_PZ<>}+
X$*OPN O%£)LBO{JJKY%
@:U%$£!SXJ*)KM>>?VKH
SDY%£OLO(+{P:HO(UR$W
XVBFTER^&IOLNLO*(&P:
>?L\___/JR$£^&L:}~{&
~@?}{)JKOINLM@~}P>OU
:@<L::@\_____/R%^*BI
@{PO{_):<>KNUYT*&G&^

আউটপুট:

~{$FJ*TBNFU*YBVEXGY%
FX+---+-------+Z<>}+
X$|O  |O     O|JJKY%
@:|   |       |>?VKH
SD|  O|       |(UR$W
XV|   |   O   |*(&P:
>?|\__|       |:}~{&
~@+---|       |}P>OU
:@<L::|\_____/|%^*BI
@{PO{_+-------+*&G&^

সংযুক্ত মুখগুলি সম্পর্কে কী (উদাহরণস্বরূপ যেখানে একটি ও বাম চোখ এবং ডান চোখের দ্বিগুণ)? এগুলি কি ওভারল্যাপিং হিসাবে বিবেচিত হবে?
জোয়ে অ্যাডামস 21

@ জোয়ে অ্যাডামস: এটি শেষ উদাহরণে ঘটে।
লোজ্যাকার

@ জোয়ে অ্যাডামস @ লাউজ্যাকার হ্যাঁ, শেষ উদাহরণের মতোই।
গ্যারেথ

আমি 3x3 ফেস রিয়েলিস্টিক এবং 7x7 ফেস ডার্প খুঁজে পাই। শুধুমাত্র আমার অভিমত. দুঃখের বিষয় যে আমি বাউন্টিজ অর্জনের জন্য সময় পাইনি ... :)
২৩:৩6

2
@ টমসমিডিং যদি আপনি 3x3 মুখটি বাস্তবসম্মত দেখতে পান তবে আমি আপনার সাথে যুক্ত লোকদের দেখতে ঘৃণা করব। : - \
গ্যারেথ

উত্তর:


19

রুবি, 304 298 295 টি অক্ষর

I=$<.read
q=(O=I*s=1).size
k=??+O=~/$/
o=->m,n{n.chars{|c|(m+=1)*(m%k)>0&&m<q&&O[m-1]=c}}
q.times{f=[[?\\+?_*s+?/,k*s+=1],[?O,0],[?O,s],[?O,(s+=1)/2*(1+k)]]
q.times{|x|f.all?{|a,b|I[x+b,a.size]==a}&&(o[x+k*s-1,o[x-k-1,?++?-*s+?+]]
s.times{|a|o[x+k*a-1,?|+' '*s+?|]}
f.map{|a,b|o[x+b,a]})}}
$><<O

মুখগুলি অভিন্ন আকারের হলে ওভারল্যাপে নীচের ডানদিকে অগ্রাধিকার দেওয়া হয়। ইনপুট জন্য যেমন

O.OO.O
.O..O.
\_/\_/
O.OO.O
.O..O.
\_/\_/

এটি চারটি মুখ এবং ফলন সনাক্ত করে

O |O O
 O| O
--+---
O |O O
 O| O
\_|\_/

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

সম্পাদনা করুন 2: উভয় প্রতিস্থাপন দ্বারা সংরক্ষিত আরেকটি দুটি অক্ষর ifদিয়ে &&এবং অন্য এক সম্পূর্ণরূপে পরিসীমা সরিয়ে ফেলা হয়।


আপনি তৃতীয় লাইনে (O=~/$/)পরিবর্তে ব্যবহার করতে পারেন O.index($/)(3 টি অক্ষর সংরক্ষণ করে)।
লোজ্যাকার

@ লাউজ্যাকার আপনাকে ধন্যবাদ এমনকি আমি আপনার কৌশলটি দিয়ে আরও একটিকে বাঁচাতে পারি (আমার সম্পাদনা দেখুন)।
হাওয়ার্ড

আমি মনে করি আপনি ifবিবৃতিগুলি প্রতিস্থাপন করে 2 টি অক্ষরও সংরক্ষণ করতে পারেন &&
লোজ্যাকার

4

পাইথন - 1199 941

আমি সমস্যাটি বেশ আকর্ষণীয় পেয়েছি তাই পাইথনে সমাধান করেছি। সংক্ষিপ্ত কোডটি এখানে।

#!/usr/bin/env python
import fileinput,sys
m=[[c for c in l if c!='\n'] for l in fileinput.input()]
X=len(m[0])
Y=len(m)
t=[]
for n in range(3,min(X,Y)+1,2):
  for x in range(X-n+1):
    for y in range(Y-n+1):
      if m[y][x]=='O' and m[y][x+n-1]=='O' and m[y+(n//2)][x+(n//2)]=='O' and m[y+n-1][x]=='\\' and m[y+n-1][x+n-1]=='/' and "".join(m[y+n-1][x+1:x+n-1])=='_'*(n-2):
        t.append((x,y,n))
for x,y,n in t:
  def a(v,h,c):
    w=x+h; z=y+v;
    if z>=0 and z<len(m):
      if w>=0 and w<len(m[y]):
        m[z][w]=c
  for v in range(n):
    for h in range(n): 
      a(v,h,' ')
  a(0,0,'O')
  a(0,n-1,'O')
  a(n/2,n/2,'O')
  a(n-1,0,'\\')
  a(n-1,n-1,'/')
  for w in range(1,n-1):
    a(n-1,w,'_')
  for v in [-1,n]:
    for h in range(n):
      a(v,h,'-')
  for h in [-1,n]:
    for v in range(n):
      a(v,h,'|')
  a(-1,-1,'+')
  a(-1,n,'+')
  a(n,-1,'+')
  a(n,n,'+')
for l in m:
  for c in l:
    sys.stdout.write(c)
  print

এখানে আরও পঠনযোগ্য কোড:

#!/usr/bin/env python

import fileinput, sys

matrix = [[c for c in l if c != '\n'] for l in fileinput.input()]

max_X = len(matrix[0])
max_Y = len(matrix)

tuples = []
for n in range(3, min(max_X, max_Y)+1, 2):
  for x in range(max_X-n+1):
    for y in range(max_Y-n+1):
      # if is_face(matrix, x, y, n):
      if matrix[y][x] == 'O' and matrix[y][x+n-1] == 'O' and matrix[y+(n//2)][x+(n//2)] == 'O' and matrix[y+n-1][x] == '\\' and matrix[y+n-1][x+n-1] == '/' and "".join(matrix[y+n-1][x+1:x+n-1]) == '_'*(n-2) :
        tuples.append((x, y, n))

for x,y,n in tuples:
  # blank_and_border(matrix,x,y,n)
  def assign(dy, dx, c):
    xx = x + dx; yy = y + dy;
    if yy >= 0 and yy < len(matrix) :
      if xx >= 0 and xx < len(matrix[y]) :
        matrix[yy][xx] = c

  # blank
  for dy in range(n):
    for dx in range(n): 
      assign(dy, dx, ' ')

  # face
  assign(0, 0, 'O')
  assign(0, n-1, 'O')
  assign(n/2, n/2, 'O')
  assign(n-1, 0, '\\')
  assign(n-1, n-1, '/')
  for w in range(1,n-1):
    assign(n-1, w, '_')

  # border
  for dy in [-1,n]:
    for dx in range(n):
      assign(dy, dx, '-')

  for dx in [-1,n]:
    for dy in range(n):
      assign(dy, dx, '|')

  assign(-1, -1, '+')
  assign(-1,  n, '+')
  assign( n, -1, '+')
  assign( n,  n, '+')

for l in matrix:
  for c in l:
    sys.stdout.write(c)
  print

2
আপনার উত্তরে দয়া করে এই সংস্করণটির উপরে আপনার গল্ফ সংস্করণ যুক্ত করুন। এটি একটি কোড-গল্ফ প্রশ্ন এবং যদি আপনি কমপক্ষে এটি গল্ফ করার চেষ্টা না করেন তবে আপনার ভোট নেমে যাওয়ার ঝুঁকি। আপনি এখানে আপনার পাঠযোগ্য সংস্করণটি ছেড়ে দিতে পারেন।
গ্যারেথ

1
ডানদিকে, @ গ্যারেথ আমি প্রায়শই জাভাতে সমাধানগুলি লিখি, যা মারাত্মকভাবে গল্ফ-বান্ধব নয়, তবে অনুশীলনের জন্য আমি উভয় ক্ষেত্রেই আমার সমাধানটি গল্ফ করার জন্য সময় নিই (চরিত্রগুলি ছাঁটাই করার উপায় এবং সামগ্রিক দৈর্ঘ্য হ্রাস করার উপায়গুলি সম্পর্কে মজাদার চিন্তা) এবং এর মনোভাবকে সন্তুষ্ট করার জন্য কোড-গল্ফ (যা আপনার সমাধানটি যথাসম্ভব সংক্ষিপ্ত আকারে পাচ্ছে)। সুতরাং, আপনার গল্ফযুক্ত সমাধানটি দেখার অপেক্ষায় রয়েছি, সাগরিয়া!
প্রোগ্রামারডান

ধন্যবাদ গ্যারেথ এবং @ প্রোগ্রামারড্যান! এটি ভাল পরামর্শ - আমি কোডগল্ফে বেশ নতুন। আমি দীর্ঘ সমাধান ছাড়াও উপরে আমার গল্ফযুক্ত সমাধান যুক্ত করেছি।
সগৌরিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.