ভিজ্যুয়াল দীর্ঘ গুণ


28

গণনা ব্যতীত কিছুই না করে দুটি পূর্ণসংখ্যার জন্য দীর্ঘ গুণ করার একটি দুর্দান্ত উপায় রয়েছে, যা মাঝে মধ্যে ইন্টারনেটে ভাগ হয়ে যায়। আপনি প্রতিটি সংখ্যার অঙ্কগুলি 90 টি ডিগ্রি কোণে দুটি সংখ্যার স্ল্যাটেড লাইনের একটি গুচ্ছ হিসাবে লিখবেন। তারপরে আপনি উত্থাপিত পৃথক কলামগুলিতে কেবল ছেদগুলি গণনা করতে পারেন। একটি চিত্র সম্ভবত এটি পরিষ্কার করে দেবে। এখানে গণনার জন্য একটি উদাহরণ 21 * 32:

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

যদি আপনি "ভিজ্যুয়াল / গ্রাফিকাল দীর্ঘ গুণ" জন্য গুগল করেন তবে আপনি আরও অনেক উদাহরণ পাবেন।

এই চ্যালেঞ্জে আপনাকে ASCII আর্ট ব্যবহার করে এই চিত্রগুলি তৈরি করতে হবে। একই উদাহরণের জন্য, আউটপুটটি দেখতে এই রকম হবে:

   \ /
    X /
 \ / X /
\ X / X
 X X / \ /
/ X X   X /
 / X \ / X
  / \ X / \
     X X
    / X \
     / \

কিছু উদাহরণ (নীচে দেখুন) থেকে এগুলির জন্য নির্মাণের নিয়মগুলি খুঁজে পাওয়া সম্ভবত সবচেয়ে সহজ তবে এখানে কিছু বিশদ:

  • ছেদ করা রাস্তা রয়েছে X, লাইন অ-ছেদ করা রাস্তা রয়েছে /বা \
  • বাহ্যিকতম ছেদগুলির পরে ঠিক একটি বিভাগ থাকা উচিত।
  • বিভিন্ন অঙ্কের অন্তর্ভুক্ত ছেদগুলির মধ্যে ঠিক একটি বিভাগ থাকতে হবে। যদি শূন্য-অঙ্ক থাকে তবে এর ফলস্বরূপ ধারাবাহিক /বা \বিভাগগুলি হবে।
  • আপনি (অন্তত 2 মত কিছু যুক্তিসঙ্গত সীমা পর্যন্ত কোনো ইতিবাচক ইনপুট সমর্থন করার জন্য আছে 16 বা 2 32 ), এবং থেকে কোন ডিজিট 0থেকে 9। যাইহোক, আপনি ধরে নিতে পারেন যে সেখানে নেতৃত্ব দেবে না অনুসরণ করবে না 0
  • আপনার অবশ্যই বহিরাগত নেতৃস্থানীয় সাদা স্থান বা শীর্ষস্থানীয় বা ফাঁকা লাইনগুলি অনুসরণ করতে হবে না print
  • আপনি ট্রেলিং হোয়াইটস্পেস মুদ্রণ করতে পারেন তবে এটি ডায়াগ্রামের অক্ষ-বিন্যস্ত বাউন্ডিং বাক্সের বেশি হওয়া উচিত নয়।
  • আপনি allyচ্ছিকভাবে একটি একক পেছনের নতুন লাইন মুদ্রণ করতে পারেন।
  • আপনি দুটি ইনপুট নম্বর কোন ক্রমে গ্রহণ করতে পারেন তা চয়ন করতে পারেন। যাইহোক, এটি অবশ্যই উভয় দিকনির্দেশের জন্য আপনাকে স্বেচ্ছাচারিত সংখ্যাগুলি সমর্থন করতে হবে, যাতে আপনি "বৃহত্তর সংখ্যাটি প্রথম দেওয়া হয়" এর মতো কিছু চয়ন করতে পারবেন না।
  • আপনি যদি স্ট্রিং হিসাবে ইনপুট নিচ্ছেন তবে আপনি দুটি সংখ্যার মধ্যে যে কোনও অ-অঙ্ক বিভাজক ব্যবহার করতে পারেন।

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

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর (বাইটে) জিতেছে।

উদাহরণ

1*1
\ /
 X
/ \

2*61
 \ /
\ X /
 X X /
/ X X /
 / X X /
  / X X /
   / X X
    / X \ /
     / \ X
        X \
       / \

 45*1
         \ /
        \ X
       \ X \
      \ X \
     \ X \
      X \
   \ / \
  \ X
 \ X \
\ X \
 X \
/ \

21001*209
       \ /
        X /
       / X
      / / \
   \ / /   \ /
    X /     X /
 \ / X     / X /
\ X / \   / / X /
 X X   \ / / / X /
/ X \   X / / / X /
 / \ \ / X / / / X /
    \ X / X / / / X /
     X X / X / / / X /
    / X X / X / / / X
     / X X / X / / / \
      / X X / X / /
       / X X / X /
        / X X / X
         / X X / \
          / X X
           / X \
            / \

2 স্ট্রিং প্যারামিটার বা একটি মাত্র একক স্ট্রিং সহ একটি ফাংশন এবং আমাকে এটি আমার কোডে বিভক্ত করতে হবে?
edc65

@ edc65 দুটি স্ট্রিং বা দুটি পূর্ণসংখ্যা পরামিতি ভাল।
মার্টিন ইন্ডার

উত্তর:


1

পাইথ - 79 বাইট

@ অ্যালেক্সিবার্ডিনের উত্তরের একটি অনুবাদ। সম্ভবত আরও অনেক গল্ফ করা যেতে পারে।

AzHmu++Gm1sH]Zd]Z,_zwK+lzlHJmm\ KK .e.eX@J+kY+-Yklz@" \/x"+byZHzjbmjk:d2_1:J1_2

দুটি সংখ্যা হিসাবে ইনপুট নেয়, নতুন লাইন পৃথক। ব্যাখ্যা শীঘ্রই আসছে।

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


4

অজগর, 303

def f(s):
    a,b=s.split('*')
    a,b=map(lambda l:reduce(lambda x,y:x+[1]*int(y)+[0],l,[0]),[reversed(a),b])
    n=sum(map(len,[a,b]))
    l=[[' ']*n for i in xrange(n)]
    for i,x in enumerate(a):
        for j,y in enumerate(b):
            l[i+j][j-i+len(a)]=r' \/x'[x+2*y]
    return '\n'.join(''.join(x[2:-1]) for x in l[1:-2])

আমি মনে করি এটি যথেষ্ট পরিমাণে মানব-পঠনযোগ্য।
প্রতিপাদন:

print '---'
print '\n'.join('"%s"'%x for x in f('21001*209').split('\n'))
print '---'
---
"       \ /            "
"        x /           "
"       / x            "
"      / / \           "
"   \ / /   \ /        "
"    x /     x /       "
" \ / x     / x /      "
"\ x / \   / / x /     "
" x x   \ / / / x /    "
"/ x \   x / / / x /   "
" / \ \ / x / / / x /  "
"    \ x / x / / / x / "
"     x x / x / / / x /"
"    / x x / x / / / x "
"     / x x / x / / / \"
"      / x x / x / /   "
"       / x x / x /    "
"        / x x / x     "
"         / x x / \    "
"          / x x       "
"           / x \      "
"            / \       "
---

1
মাত্র কয়েকটি দ্রুত গল্ফ: reversedএকই রকম [::-1], আপনি ইনডেন্টেশন সংরক্ষণের জন্য লুপের বিষয়বস্তুগুলিকে এক লাইনে রেখে দিতে পারেন, এর len(a)+len(b)চেয়ে ছোট হয় sum(map(len,[a,b])), xrangeগল্ফিংয়ে ব্যবহার করবেন না , এর মধ্যে স্থানটি ) forসরানো যেতে পারে এবং যেহেতু আপনি রয়েছেন পাইথন 2 ব্যবহার করে, আপনি ফাঁকা স্থানগুলিতে ফাঁকা স্থান এবং ট্যাবগুলি একত্রিত করতে পারেন।
মাল্টেসেন

অনেক ধন্যবাদ. এটি 22 বাইট দেয়। তবে আমার মনে হয় না এটি সবচেয়ে কম হবে। আমি পাইথ কোড করি না তবে আমি 31-বাইট প্রোগ্রাম দেখেছি ... বিটিডব্লিউ, 303 হল এমন একটি গণনা যখন প্রতিটি 4-স্পেস আসলে একটি ট্যাব দ্বারা প্রতিস্থাপিত হয়।
আলেক্সি বার্ডিন

এখানে, আমি 276সাধারণ সিনট্যাকটিক গল্ফিং থেকে পেতে পেরেছি
মালটিসেন

এছাড়াও, যদি আমি আপনার প্রোগ্রামটি পাইথের কাছে অনুবাদ করি এবং এটি একটি পৃথক উত্তর হিসাবে পোস্ট করি তবে আপনি কি আপত্তি করেন?
মাল্টেসেন

1
আপনি e=enumerateগল্ফ 4 টি চর শুরুতে সেট করতে পারেন
sagiksp

2

পাইথন 3, 205 বাইট

L=a,b=[eval("+[0]+[1]*".join("0%s0"%x)[2:])for x in input().split()]
A,B=map(len,L)
for c in range(2,A+B-1):print((" "*abs(c-A)+" ".join(" \/X"[a[i-c]+2*b[i]]for i in range(max(0,c-A),min(c,B))))[1:A+B-2])

এক্সপ্রেশনগুলি বেশ দীর্ঘ তাই আমি মনে করি উন্নতির জন্য যথেষ্ট পরিমাণে জায়গা আছে তবে যাইহোক ...

STDIN- এর মাধ্যমে স্থান-পৃথক করে ইনপুট নেয়

21 32
   \ /
    X /
 \ / X /
\ X / X  
 X X / \ /
/ X X   X /
 / X \ / X 
  / \ X / \
     X X  
    / X \
     / \

কিছু লাইনে একটি সম্ভাব্য ট্রেলিং স্পেস রয়েছে তবে এটি A+B-2নিশ্চিত করে যে সমস্ত চলমান স্থানগুলি সীমানা বাক্সের মধ্যে রয়েছে।


1

সি #, 451 বাইট

void d(string s){var S=s.Split('*');int X=S[1].Select(c=>c-47).Sum(),Y=S[0].Select(c=>c-47).Sum(),L=9*(X+Y),A=1,B=L/3,i,j;var a=Range(0,L).Select(_=>new int[L]).ToArray();foreach(var c in S[1]){for(i=48;i<c;++i){for(j=-1;j<Y;++j)a[B-j][A+j]=1;A++;B++;}A++;B++;}A=1;B=L/3;foreach(var c in S[0]){for(i=48;i<c;++i){for(j=-1;j<X;++j)a[B+j][A+j]|=2;A++;B--;}A++;B--;}Write(Join("\n",a.Select(r=>Concat(r.Select(n=>@" /\X"[n]))).Where(r=>r.Trim().Any())));}

পাঠযোগ্যতার জন্য ফর্ম্যাট করা হয়েছে, প্রসঙ্গে ফাংশন:

using System.Linq;
using static System.Console;
using static System.Linq.Enumerable;
using static System.String;

class VisualMultiply
{
    static void Main(string[] args)
    {
        new VisualMultiply().d("21001*209");

        WriteLine();
    }

    void d(string s)
    {
        var S = s.Split('*');

        int X = S[1].Select(c => c - 47).Sum(), 
            Y = S[0].Select(c => c - 47).Sum(),
            L = 9 * (X + Y),
            A = 1,
            B = L / 3,
            i,
            j;

        var a = Range(0, L).Select(_ => new int[L]).ToArray();

        foreach (var c in S[1])
        {
            for (i = 48; i < c; ++i)
            {
                for (j = -1; j < Y; ++j)
                    a[B - j][A + j] = 1;
                A++;
                B++;
            }
            A++;
            B++;
        }

        A = 1;
        B = L / 3;
        foreach (var c in S[0])
        {
            for (i = 48; i < c; ++i)
            {
                for (j = -1; j < X; ++j)
                    a[B + j][A + j] |= 2;
                A++;
                B--;
            }
            A++;
            B--;
        }

        Write(Join("\n", a.Select(r => Concat(r.Select(n => @" /\X"[n]))).Where(r => r.Trim().Any())));
    }
}

বিটওয়াইজ OR কেবল মজা করার জন্য ছিল, তবে সংযোজনটিও কার্যকর হবে।


1

জাভাস্ক্রিপ্ট ( ES6 ) 271

আমি নিশ্চিত যে এমন একটি সমাধান রয়েছে যা আউটপুট সারি সারি তৈরি করে, গণিত এবং x, y স্থানাঙ্ক (x + y == কে, xy == কে ...) দিয়ে সজ্জিত করে। তবে আমি এখনও পেরেক করতে পারি না।

সুতরাং এখানে একটি সমাধান যা কেবল একের পর এক লাইন আঁকবে।

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

F=(a,b)=>( // string parameters
  t=u=0,[for(v of a)t-=~v],[for(v of b)u-=~v],
  r=t+u,o=[...' '.repeat(r*r-r)],
  L=(x,y,n,z,m,c)=>{
    for(i=0;d=n[i++];)
      for(j=0;++x,y+=z,j++<d;)
        for(l=m+1,p=x+y*r-1-r;l--;p+=r-z,o[p-p%r-1]='\n')
          o[p]=o[p]>' '&&o[p]!=c?'X':c
  },
  L(u,0,a,1,u,'/'),
  L(0,u,b,-1,t,'\\'),
  o.join('')
)

// TEST

function test()
{
  O.innerHTML= F(A.value, B.value);
}

test();
<input id=A value=21001> * <input id=B value=209> <button onclick='test()'>-></button>
<pre id=O></pre>


1

ভিসি ++, (289)280

t(char*a){int i,j,k,r,c=1,e,A=0,B=0,*C,G[99],f,u;for(C=&A;c+48|(k=(c=(*(a+=c<1))---48)>0);G[2**(C=!(c+6)?&(B+=A):&(++*C))]=k**C);for(i=0;i<B*B;printf("\n%c"+!!j,32+15*((k=(c<(f=G[(c=i/B)+(j=i%B)+A+2]))*(j<f)*(f>A))+4*(r=(!!e*B>c+(e=G[A+j-c]))*(!!e*c>A-e-2)*(e<A)))+13*k*r),i++);

ব্যবহার

#include  <stdio.h>
#include  <conio.h>

int t(char*);

int main(void)
{   char a[]="123*45";
    t((char*)a);
    getch();
    return 0;
}

int 
//-------- padded code ------
t(char*a){int i,j,k,r,c=1,e,A=0,B=0,*C,G[99],f,u;memset(G,0,396);for(C=&A;c+48|(k=(c=(*(a+=c<1))---48)>0);G[2**(C=!(c+6)?&(B+=A):&(++*C))]=k**C);for(i=0;i<B*B;printf("\n%c"+!!j,32+15*((k=(c<(f=G[(c=i/B)+(j=i%B)+A+2]))*(j<f)*(f>A))+4*(r=(!!e*B>c+(e=G[A+j-c]))*(!!e*c>A-e-2)*(e<A)))+13*k*r),i++);

//---------------------------
return 0;}

ফলাফল

       \ /
      \ x /
     \ x x /
      x x x /
   \ / x x x
  \ x / x x \ /
   x x / x \ x /
\ / x x / \ x x /
 x / x x   x x x /
/ x / x \ / x x x /
 / x / \ x / x x x
  / x   x x / x x \
   / \ / x x / x \
      x / x x / \
     / x / x x
      / x / x \
       / x / \
        / x
         / \
  • ফাংশনটি একটি একক লুপকে পুনরাবৃত্তি করে এবং কিছু জ্যামিতিক এবং এসকিআই ট্রাইফ্লিং ব্যবহার করে।

কিসের ---48জন্য?
LegionMammal978

@ লিজিওনম্যামাল ৯৮৮ আমি মাঝে মাঝে জিনিস লিখি তখন আমি ভুলে যাই কেন আমি সেখানে এটি রেখেছিলাম কেন: ডি যাই হোক অন্য কিছু করতে ব্যস্ত, যখন আমি শেষ করি, অসুস্থ আপনার জন্য মনে রাখবেন না; (এই কোডটি কি আপনার সংকলকটিতে ভাল যায়)?
Abr001am

@ লিজিওনম্যামাল ৯78৮ এখানে, নির্দিষ্ট (প্রকৃত) সূচকে অ্যারের সামগ্রীটি হ্রাস হওয়ার আগে ৪৮ এ বিয়োগ করা হবে, আসন্ন শূন্য চরিত্রের জন্য অপেক্ষা করার জন্য ৪৮ টি বিয়োগ করে লুপে ধাপে ধাপে ধাপে ধীরে ধীরে হ্রাস করুন (বা পিছনের দিকে আসকি)
২০০১

48 "0"
Abr001am

1
আমি এখন দেখছি, এটি মত কাজ করে ...)-- - 48)...
লিজিয়নম্যামাল978


0

সি (329 খ)

int f(char*a){int i,j,r,k,c,h,o,e=15,m=99,A=0,B=0,*C,L[m][m],G[m],*g=G;for(C=&A;(c=*a-48)+48;C=!(c+6)?&B:&(*C+=(*g++=c+1)),a++);for(i=B-1,j=0;j<(r=A+B-1);i--,j++)for(k=0,o=4*!!((*(g-=!*g))---1);k<=*(C=(h=i<0)?&B:&A);k++)L[abs(i)+k][j+k-2*k*h]+=o/(3*h+1)*e;for(i=0;i<r*r;i++)printf("\n%c"+!!(i%r),((h=L[i/r][i%r])>e*4)?120:h+32);}

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


মনে হচ্ছে প্রতিটি অক্ষরের পরে ফাঁকা জায়গাগুলির কলাম রয়েছে এবং নীচের প্রান্তে চূড়ান্ত অ-ছেদযুক্ত অংশগুলি অনুপস্থিত। আপনি বিপরীত ক্রমে অঙ্কগুলিও ব্যবহার করছেন।
মার্টিন ইন্ডার

@ মার্টিনব্যাটনার কল্পনা করুন যে কেউ চাঁদে এটি করছেন এবং আপনি এটি টেলিস্কোপ দ্বারা দেখছেন, আপনার চিত্রটি কীভাবে বোঝা উচিত (-জকিং-আমি পরে এটি সামঞ্জস্য করব)
আবর 001am


0

জেলি , 58 বাইট

ŒDṙLN‘ƊṚị“\/X ”K€
L‘0xż1xⱮ$F
DÇ€Ḥ2¦+þ/µZJUṖ;J’⁶xⱮżÑṖḊẎḊ$€Y

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

ব্যাখ্যা

একটি পূর্ণ প্রোগ্রাম যা দুটি সংখ্যার দুটি পূর্ণসংখ্যার তালিকা হিসাবে নেয় এবং একটি স্ট্রিং প্রদান করে।

সহায়ক লিঙ্ক 1: ম্যাট্রিক্স ঘোরান

ŒD                        | get the diagonals
  ṙ                       | rotate left by
   LN‘Ɗ                   | minus num columns +1
       Ṛ                  | reverse order
        ị“\/X ”           | index into \/X
               K€         | join each with spaces

সহায়ক লিঙ্ক 2: সারি এবং কলামের টেম্পলেট তৈরি করুন

L‘0x                      | 0 copied (num digits + 1) times
    ż                     | interleaved with
     1xⱮ$                 | 1 copied as specified by the digits
         F                | flattened

প্রধান লিঙ্ক

D                         | convert to decimal digits
 ǀ                       | call above link for each number
   Ḥ2¦                    | double the second one
      +þ/                 | outer product using +
         µ                | start a new monadic chain
          ZJUṖ;J’         | reversed range counting down
                          | the columns, followed by range
                            counting up the rows (without
                            duplicating 0 in the middle)
                   ⁶xⱮ    | that many spaces (to provide indents)
                      ż   | interleaved with
                       Ñ  | rotated matrix
                        ṖḊẎḊ$€ Y | remove blank rows and columns and join with newlines
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.