একটি বিপরীতমুখী প্রদর্শন পড়ুন


22

আর্ট চুরি কি আকার থেকে অঙ্ক?


7-বিভাগের অঙ্কগুলি _|অক্ষর ব্যবহার করে ASCII তে উপস্থাপন করা যেতে পারে । এখানে অঙ্কগুলি 0-9:

 _     _  _       _   _  _   _   _ 
| | |  _| _| |_| |_  |_   | |_| |_|
|_| | |_  _|   |  _| |_|  | |_|  _|

আপনার কাজ হ'ল শিল্পকে সাধারণ সংখ্যায় পার্স করা।

সংখ্যার উপর নোট

  • প্রতিটি অঙ্কের আলাদা প্রস্থ থাকে।
    • 1 এর প্রস্থ রয়েছে 1
    • 3এবং 7হয় 2ওয়াইড
    • 245689এবং 0সমস্ত 3প্রশস্ত

এছাড়াও প্রতিটি অঙ্কের মধ্যে প্যাডিংয়ের একটি চর থাকে। এখানে পুরো চর সেট:

 // <- এক স্থান হওয়া উচিত, তবে এসই ফর্ম্যাটিংটি এতে গোলযোগ পেয়েছিল
|
|
-------------
 : _ 
 : _ |
|: _ 
-------------
: _ 
: _ |
: _ |
-------------

|: _ |
  |
-------------
 : _ 
|: _ 
 : _ |
-------------
 : _ 
|: _ 
|: _ |
-------------
: _ 
 |
 |
-------------
 : _ 
|: _ |
|: _ |
-------------
 : _ 
|: _ |
 : _ |
-------------
 : _ 
| |
|: _ |

ইনপুট

ইনপুট হয় কনসোল থেকে বা কোনও ফাংশনে স্ট্রিং আর্গ হিসাবে হতে পারে।

আউটপুট

আউটপুট হয় কনসোলে রাখা হয় বা ফাংশন থেকে ফিরে আসে।

উদাহরণ:

  _  _   _ 
|  |  | |_ 
|  |  | |_|
1776

 _   _     _ 
 _| | | | |_ 
|_  |_| | |_|
2016

   _       _ 
| |_| |_| |_ 
|  _|   |  _|
1945

   _   _   _   _   _   _ 
| | | | | | | | | | | | |
| |_| |_| |_| |_| |_| |_|
1000000

 _     _  _       _   _  _   _   _ 
| | |  _| _| |_| |_  |_   | |_| |_|
|_| | |_  _|   |  _| |_|  | |_|  _|
0123456789

এটি কোড-গল্ফ তাই সংক্ষিপ্ততম বাইট গণনা জয়!



এই ধরণের সমস্যা সমাধানের জন্য আমি সেরা অ্যালগরিদমগুলি সম্পর্কে জানতে আগ্রহী এবং উত্তরগুলি এখানে শিখতে আমার অসুবিধা হচ্ছে (তারা ভাল, কেবল খুব সংক্ষিপ্ত)। পছন্দ মতো ছবি সহ আপনি আরও দীর্ঘ ব্যাখ্যা দেখতে আমাকে উল্লেখ করতে পারেন এমন কোনও জায়গা কি আছে?

ঠিক আছে, আমার কাজ করার পদ্ধতিটি মোটামুটি সহজ। এটি তালিকাটি স্থানান্তর করে এবং এটির উপরে লুপ করে। এটি খালি লাইনে বিভক্ত হয়। প্রতিটি সংখ্যা প্রতিটি ফিঙ্গারপ্রিন্ট টেবিলের বিপরীতে পরীক্ষা করা হয়। অন্যরা আমার মতো কিছুটা কাজ করে, ফিংগারপ্রিন্ট টেবিলের পরিবর্তে তাদের কাছে মূলত তারা ব্যবহার করে একটি হ্যাশ টেবিল থাকে।
জে আতকিন

কম্পিউটার বিজ্ঞানে এই ধরণের সমস্যার আরও সাধারণ নাম আছে কি?

আমার কোনও ধারণা নেই;)
জে আতকিন

উত্তর:


4

পাইথ, 33 30 বাইট

sm@."/9Àøw"%%Csd409hTcC.z*3d

এই ধারণাটি এখানে: একবার আমরা ইনপুট স্থানান্তর করি এবং অঙ্কগুলিতে বিভক্ত হয়ে আমরা পৃথক অঙ্কের স্ট্রিংগুলিকে বাছাই করতে পারি এবং তাদের মানগুলিতে নির্ধারণ করতে পারি।

sm@."/9Àøw"%%Csd409hTcC.z*3d     Implicit: z=input
                      C.z        Transpose input.
                     c   *3d     Split that on "   ", a space between digits.
 m@."/9Àøw"%%Csd409hT            Map the following lambda d over that. d is a digit string.
             Csd                   Flatten the digit string, and convert from base 256.
            %   409                Modulo that by 409
           %       hT              and then by 11. All digits go to a distinct num mod 11.
   ."/9Àøw"                        The compressed string "03924785/61".
  @                                Index into that string.
s                                Flatten and implicitly output.

এখানে চেষ্টা করুন


শীতল, মূলত আমার পদ্ধতির মতো দেখতে তবে এটি আরও খাটো!
লিন

@ লিন এ সম্পর্কে দুঃখিত! পাইথটিতে এটি করার একটি সংক্ষিপ্ততম উপায় আছে।
lirtosiast

4

রুবি, 184 বাইট

a=0
l=$<.map{|x|x.bytes.map{|y|y==32?0:1}+[0]*2}
(0..l[0].count-1).map{|i|l[0][i]+2*l[1][i]+4*l[2][i]}.each{|x|
x>0?(a=x+2*a):(p Hash[[40,6,32,20,18,26,42,8,44,64].zip(0..9)][a];a=0)}

ব্যাখ্যা

  • স্টিডিনের কাছ থেকে ইনপুট নেয়
  • স্ট্রিংগুলিকে বাইনারি সিকোয়েন্সগুলিতে রূপান্তর করে, 1/0 / বিভাগটি বিভাগে অন / অফের জন্য
  • কলামগুলি 3 বিট বাইনারি সংখ্যায় এনকোড করে
  • 3 বিট সংখ্যার 9 বিট সংখ্যার এনকোড সিকোয়েন্স, স্টপ চিহ্ন হিসাবে '0' কলাম ব্যবহার করুন
  • 9 বিটের সংখ্যাগুলিকে অঙ্কগুলিতে রূপান্তর করতে একটি সন্ধানের টেবিল ব্যবহার করুন

এটি আমার প্রথম কোড-গল্ফ। মজা করার জন্য ধন্যবাদ!


2
পিপিসিজিতে আপনাকে স্বাগতম! আপনার প্রথম পোস্টে খুব সুন্দর কাজ!
জে আতকিন


2

জাপট, 119 বাইট

Ur"[|_]"1 z r" +
"R x1 qR² £"11
1 1
1151151
111
 15111
115 1
 1
115 1
111
1511
111
15  1
11511
111
115 1
111
11"q5 bXÃq

Try it here!

ওহ গীজ, এটি আসলেই দীর্ঘ। আমি মনে করি না যে আমি গল্ফ শেষ করেছি।

ব্যাখ্যা

প্রস্তুতি

আমরা ইনপুট নিই এবং যে কোনওতে রূপান্তর |_করি 1। তারপরে আমরা স্থানান্তরিত করি, শেষের স্থানগুলি সরিয়ে ফেলি এবং ডাবল নিউলাইনগুলিতে বিভক্ত হয়ে যাই।

অনুবাদ

আমরা ফলাফলের অ্যারেতে ম্যাপ করি এবং সূচিটি পাই যেখানে ফর্মটি একটি রেফারেন্স অ্যারেতে উপস্থিত হয়। সহায়তা করার জন্য এখানে একটি চিত্র রয়েছে:

MAPITEM
  11
  1 1 --> This same form appears at index 0 in the reference array
  11                            |
                                |
                                V
                        change the mapitem to 0!

এর পরে, আমরা সংখ্যা এবং আউটপুট অ্যারে যোগদান!

দ্রষ্টব্য : আপনি ভাবছেন যে কেন আমাদের প্রতিটি শিল্প চরিত্রকে 1 এর সিরিজে পরিবর্তন করতে হবে? এটি কারণ এমন একটি বাগ (বা এর মতো কিছু) বলে মনে হচ্ছে যা আমাকে অক্ষরগুলি যেমন আছে তেমন সংরক্ষণ করতে দেয় না |_


আমি _বাগটি লক্ষ্য করেছি , তবে কী কারণে এটি হয়েছিল তা আমি জানি না।
ETH প্রোডাকশন

ঠিক আছে, এর "\n\n"সাথে এবং "\\||_"সাথে প্রতিস্থাপন করা যেতে পারে "%||_"। আমি মনে করি আপনার কাছে পারা বেস 4 (4 disinctive অক্ষর প্রতিটি পরিবর্তন দীর্ঘ স্ট্রিং এনকোডিং করে কিছু বাইট সংরক্ষণের জন্য 0, 1, 2, অথবা3 , 4 এর গুণিতক একটি দৈর্ঘ্যের প্যাডিং, তারপর চলমান r"...."_n4 d}এটি উপর), কিন্তু কোনো কারণে , আমি এখনও এটি কাজ করতে পারেন না।
ETH প্রোডাকশনগুলি

2

পাইথন 2, 299 261 244 বাইট

s=lambda a,i=0:[a]if i==len(a[0])else[[j[:i]for j in a]]+s([j[i+1:]for j in a])if all(j[i]==' 'for j in a)else s(a,i=i+1)
p=lambda l:['95572431508448853268'.find(`sum(ord(c)**i for i,c in enumerate("".join(n)))%108`)/2for n in s(l.split('\n'))]

আমি সত্যিই এই চ্যালেঞ্জ পছন্দ, ভাল কাজ!

ব্যাখ্যা

ফাংশনটি sতিনটি লাইন ইনপুট হিসাবে নেয়, এটি একটি পৃথক পৃথকীকরণের চেষ্টা করে (সমস্ত অক্ষর শূন্যস্থান হয়)। এই জাতীয় বিচ্ছেদ পাওয়া গেলে এটি কল করেs তিনটি লাইনের বাকী অংশের সাথে করে এবং কলটি যে তিনটি লাইনে অঙ্ক করে তা যুক্ত করে যা অঙ্কটি রচনা করে। কোনও বিচ্ছেদ না হলে এর অর্থ একটি মাত্র সংখ্যা।

ফাংশনটি pএন্ট্রি পয়েন্ট তাই এটি একটি স্ট্রিং নেয় যা অঙ্কগুলি উপস্থাপন করে। অঙ্কগুলি sum(ord(c)**i for i,c in enumerate("".join(n)))%108স্থান বাঁচানোর জন্য গণনা করা "হ্যাশ" হিসাবে সংরক্ষণ করা হয় (অন্যান্য উত্তরগুলির জন্য ধন্যবাদ!)।

উদাহরণস্বরূপ

digits="""
 _     _ 
| | |  _|
|_| | |_ """[1:]  # remove the '\n' at the beginning

p(digits)  # [0, 1, 2]

অন্যান্য সংস্করণ

261 বাইট (পাই 3):

s=lambda a,i=0:[a]if i==len(a[0])else[[j[:i]for j in a]]+s([j[i+1:]for j in a])if all(j[i]==' 'for j in a)else s(a,i=i+1)
def p(l):[print([91,21,84,31,58,76,88,41,80,68].index(sum(ord(c)**i%20 for i,c in enumerate("".join(n)))),end="")for n in s(l.split('\n'))]

249 বাইট, এটি একটি লাইনগুলি স্থানান্তর করে (পাই 2):

f="".join
s=lambda a,i=0:[a]if i==len(a)else[a[:i]]+s(a[i+1:])if all(c==' 'for c in a[i])else s(a,i=i+1)
h=lambda s:ord(s[0])**len(s)+h(s[1:])if s else 0
p=lambda l:["10220907112527153129".index(`h(f(map(f,n)))%34`)/2for n in s(zip(*l.split('\n')))]

2

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

a=>[...(a=a.split`
`)[0]].map((b,c)=>(d={' ':0,'|':1,'_':2})[b]+d[a[1][c]]*2+d[a[2][c]]).join``.split(0).map(b=>[343,3,182,83,243,281,381,23,383,283].indexOf(+b)).join``

তিনটি লাইনে বিভক্ত হয়ে প্রতিটি কলামকে একটি মান হিসাবে পুনরায় তৈরি করে এবং সেই মানগুলি থেকে প্রতিটি কলামের জন্য একটি অনন্য পরিচয় তৈরি করে শুরু হয়। এরপরে এটি পৃথক হয়ে যায় 0(কলামগুলির মধ্যে স্থানের জন্য পরিচয়) এবং অবশেষে প্রতিটি পরিচয়টিকে তার সংখ্যার মানগুলিতে মানচিত্র করে, যা এটি একত্রিত করে এবং ফলাফলগুলি দেয় uts


খুব সুন্দর! আমি আশা করি পাইথনের একটি তালিকা বিভক্ত ফাংশন ছিল ...
জে আতকিন

@ জেআটকিন আমি joinএকটি স্ট্রিংয়ে এডি করলাম যাতে আমি এটি বিভক্ত করতে পারি। আমি বিশ্বাস করি আপনি পাইথনেও তা করতে পারতেন?
Mwr247

0

পাইথন 3, 281 254 বাইট

সম্পাদন করা

আমি অন্যান্য অজগর উত্তরটির জন্য কোডটি সন্ধান করেছি এবং লক্ষ্য করেছি যে কোডের বেশিরভাগ সাদৃশ্য। এটি স্বাধীনভাবে এসেছিল।

("পাঠযোগ্যতা" এর জন্য নতুন লাইন যুক্ত হয়েছে)

def p(i):
 n=[[]]
 for l in zip(*i.split('\n')):
  if all(i==" "for i in l):n+=[[]]
  else:n[-1]+=l
 return''.join(map(lambda l:str([''.join(l[2:])==x for x in
             "|_ _ ||,|,|___ | ,_ ||,  _  ||, ___  |,|___  |,  ||,|___ ||, ___ ||"
                     .split(',')].index(1)),n))

Ungolfed:

def parse(input):
    lines = list(input.split('\n'))
    numbers = [[]]
    for lst in zip(*lines):
        if all(i==" " for i in lst):
            numbers += [[]]
        else:
            numbers[-1] += lst
    return ''.join(map(digit, numbers))

def digit(num):
    fingerprint = 
        "|_ _ ||,|,|___ | ,_ ||,  _  ||, ___  |,|___  |,  ||,|___ ||, ___ ||".split(',')
    return str([''.join(num[2:]) == y for y in fingerprint].index(True))

পরীক্ষা:

assert (parse("   _   _   _   _   _   _ \n| | | | | | | | | | | | |\n| |_| |_| |_| |_| |_| |_|") == '1000000')
assert (parse("   _       _ \n| |_| |_| |_ \n|  _|   |  _|") == '1945')
assert (parse(" _   _     _ \n _| | | | |_ \n|_  |_| | |_|") == '2016')
assert (parse(" _     _  _       _   _  _   _   _ \n| | |  _| _| |_| |_  |_   | |_| |_|\n|_| | |_  _|   |  _| |_|  | |_|  _|") == '0123456789')
assert (parse("  _  _   _ \n|  |  | |_ \n|  |  | |_|") == '1776')

কিভাবে এটা কাজ করে

(দ্রষ্টব্য: আমি এখানে অসম্পূর্ণ প্রোগ্রামটি ব্যাখ্যা করছি যেহেতু এটি আরও পাঠযোগ্য এবং এতে সঠিক একই কোড রয়েছে, ব্যতিক্রমটি digitল্যাম্বডায় যুক্ত রয়েছে)

def parse(input):
    lines = list(input.split('\n'))
    numbers = [[]]

মূল কাজটি হ'ল parse। এটি প্রথমে ইনপুটটিকে লাইনগুলিতে বিভক্ত করে এবং numbersঅ্যারে তৈরি করে ।

    for lst in zip(*lines):
        if all(i==" " for i in lst):
            numbers += [[]]
        else:
            numbers[-1] += lst

এটি আমার প্রিয় অংশ (যেহেতু এটি বের করতে এত দিন লেগেছে)। এখানে আমরাzip লাইনগুলি তাই আমরা মূলত উল্লম্বভাবে ইনপুটটি ট্র্যাভার করতে পারি। যখন লাইনে অক্ষর রয়েছে তখন আমরা এটিকে শেষ সংখ্যায় যুক্ত করব numbers। এতে যদি কোনও অক্ষর না থাকে তবে আমরা অ্যারেতে একটি নতুন সংখ্যা যুক্ত করি।

    return ''.join(map(digit, numbers))

সত্যিই সহজ, numbersdigit ফাংশনটির সাথে ম্যাপযুক্ত এবং স্ট্রিংয়ে রূপান্তরিত হয়।

def digit(num):
    fingerprint = 
        "|_ _ ||,|,|___ | ,_ ||,  _  ||, ___  |,|___  |,  ||,|___ ||, ___ ||".split(',')
    return str([''.join(x[2:]) == y for x, y in zip([num]*10, fingerprint)].index(True))

এটি (মোটামুটি) সহজ। fingerprintবিয়োগের উপরের প্রথম দুটি অক্ষরের উপরে তৈরি অঙ্কগুলির স্ট্রিং প্রতিনিধিত্ব (এটি আমি খুঁজে পেতে পারি এমন ক্ষুদ্রতম আঙুলের ছাপ ছিল)। আমরা প্রথম ম্যাচের সূচকটি ফিরিয়ে দিই।


0

Haskell,, 270 207 বাইট

খুব শক্ত হবেন না, এটি আমার প্রথম হ্যাশেল প্রোগ্রাম;) আমি প্রায় নিশ্চিত এটি আরও গল্ফ করা যেতে পারে, তবে আমি জানি না কীভাবে ভাষা সম্পর্কে আমার সীমাবদ্ধ জ্ঞান দেওয়া হয়েছিল।

import Data.Lists
b n=map c$splitOn["   "]$transpose$lines n
c n|e<-drop 2$concat n,Just r<-elemIndex True[e==f|f<-splitOn",""|_ _ ||,|,|___ | ,_ ||,  _  ||, ___  |,|___  |,  ||,|___ ||, ___ ||"]=(show r)!!0

Ungolfed:

module Main where
import Data.Lists

main :: IO ()
main = print $ parse " _     _  _       _   _  _   _   _ \n| | |  _| _| |_| |_  |_   | |_| |_|\n|_| | |_  _|   |  _| |_|  | |_|  _|"

parse :: String -> String
parse n = let lst = transpose $ lines n
              numbers = splitOn ["   "] lst --"   " lst
              number = map digit numbers
          in number

digit :: [String] -> Char
digit n | e <- drop 2 $ intercalate "" n
        , fingerprint <- ["|_ _ ||","|","|___ | ","_ ||","  _  ||"," ___  |","|___  |","  ||","|___ ||"," ___ ||"]
        , Just res <- elemIndex True [e == finger | finger <- fingerprint]
        = head $ show res

টিপসটির জন্য @ নিমিকে ধন্যবাদ জানাই!


খারাপ খবর প্রথমে: আমি ভয় করি যে আপনাকে import Data.Listআপনার বাইট গণনায় অন্তর্ভুক্ত করতে হবে । ভালো খবর: ক) যদি আপনি আছে Data.Listsইনস্টল আপনি এটা পরিবর্তে আমদানি করতে পারেন এবং প্রতিস্থাপন aসঙ্গে splitOn: ...map c$splitOn[" "]$transpose...এবং ...f<-splitOn",""|_...। খ) intercalate "" nহয় concat nবা id=<<n। গ) resএকক বর্ণের নামের সাথে প্রতিস্থাপন করুন । ঘ) ব্যবহার প্যাটার্ন পরিবর্তে গার্ড let ... in: c n|e<-drop 2$id=<<n,Just r<-elemIndex ... ]=(show r)!!0
নিমি

হিহেহে, উফফফফ! আমদানিটি অনুলিপি / পেস্টে হারিয়ে গেছে;) সমস্ত টিপসের জন্য ধন্যবাদ!
জে আতকিন

@ নিমিমি আপনাকে এ সম্পর্কে বিরক্ত করার জন্য দুঃখিত, তবে আপনি কী =<<করবেন তা বোঝাতে কি আপত্তি আছে? Hoogle ডক্স বা প্রকারের স্বাক্ষর উভয়ই আমার পক্ষে খুব সহায়ক নয় are
জে আতকিন

=<<তালিকার প্রেক্ষাপটে হ'ল concatMapএটি প্রদত্ত ফাংশনটিকে তালিকার উপরে মানচিত্র করে এবং ফলাফলগুলিকে একক তালিকায় একত্রিত করে। >>=একই কাজ কিন্তু যুক্তি উল্টানো সঙ্গে। id =<< n(বা n >>= id) তালিকার উপরের পরিচয় ফাংশনকে (তালিকার) মানচিত্র দেয়, অর্থাত্ সাবলিস্টগুলি এবং তাদের সাথে সম্মিলিত কিছু করে না। সুতরাং এটি হিসাবে একই concat
নিমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.