জিপার গুণ


20

ভূমিকা

আসুন একটি নতুন গাণিতিক ক্রিয়াকলাপ সংজ্ঞায়িত করি, যাকে আমি জিপার গুণকে কল করি । দুটি নন-অ্যান্টিজেটিভ পূর্ণসংখ্যার জিপারকে গুন করার জন্য, আপনি দৈর্ঘ্যের সাথে মিল তৈরির জন্য নেতৃস্থানীয় শূন্যগুলি যুক্ত করুন, সংখ্যার সাথে বেস -10 সংখ্যাকে গুণিত করুন, 2-সংখ্যার সংখ্যা পেতে ফলাফলগুলিতে নেতৃস্থানীয় শূন্যগুলি যুক্ত করুন, সেগুলি সংমিশ্রণ করুন এবং অবশেষে শীর্ষস্থানীয় শূন্যগুলি বাদ দিন।

এখানে এ = 1276 এবং বি = 933024 সহ একটি উদাহরণ রয়েছে :

1. Add leading zeros
 A = 001276
 B = 933024

2. Multiply digit-wise
 A = 0  0  1  2  7  6
 B = 9  9  3  0  2  4
 ->  0  0  3  0 14 24

3. Pad to 2 digits
 -> 00 00 03 00 14 24

4. Concatenate
 -> 000003001424

5. Drop leading zeros
 -> 3001424

অপারেশনটি সাধারণ চিহ্নের নিয়মের সাথে সমস্ত পূর্ণসংখ্যায় প্রসারিত হয়: ইতিবাচক সময়গুলি নেতিবাচক হয়, নেতিবাচক বার নেতিবাচক হয় ধনাত্মক এবং এই জাতীয়।

কাজটি

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

বিধি এবং স্কোরিং

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং সর্বনিম্ন বাইট গণনা জিততে পারে।

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

0 0 -> 0
302 40 -> 0
302 -40 -> 0
-4352 448 -> -122016
0 6623 -> 0
0 -6623 -> 0
20643 -56721 -> -1000420803
63196 21220 -> 1203021800
1276 933024 -> 3001424
-1276 933024 -> -3001424
-1276 -933024 -> 3001424
5007204555 350073039 -> 12001545
-612137119 -8088606033 -> 816060042000327
3389903661 -6619166963 -> -18180881090018543603
-23082746128560880381 1116941217 -> -8050600723200060807
-668336881543038127783364011867 896431401738330915057436190556 -> -485448120906320001351224000900090235004021121824000900403042
402878826066336701417493206805490000415 312487283677673237790517973105761463808 -> 120004325656161618004242182118140007280900200921180018080025285400000000320040

উত্তর:


8

জেলি , 11 10 বাইট

ƓDUz0P€Uḅ³

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

আমি এটি নিজের দ্বারা 10 বাইটে নামতে পারিনি, তবে @ পিটু 1998 আমাকে যে একটি পরমাণু মিস করলাম তা আমাকে ইঙ্গিত করেছিল, এটি এই 10-বাইট সমাধান দেয়। জেলির পক্ষে অস্বাভাবিকভাবে, 1276,933024এটি কমান্ড লাইন থেকে নয়, স্ট্যান্ডার্ড ইনপুট (আকারে ) থেকে ইনপুট নেয় ( এটি কমান্ডের ব্যবহার সক্ষম করে ³, যা কমান্ড লাইন আর্গুমেন্টটি ফিরিয়ে দেয়, ডিফল্ট 100 করে)।

ব্যাখ্যা:

ƓDUz0P€Uḅ³
Ɠ           read standard input
 D          convert to base 10
  U         reverse elements
   z0       transpose, padding the end with zeroes
     P€     take the product of each (€) inner list
       U    reverse elements back
        b³  convert from base 100

বেস 100 এর ব্যবহার "প্যাড থেকে 2 অঙ্কগুলিতে প্রয়োগের, তারপরে বেস 10 তে রূপান্তর" করার সহজ উপায়। এখানে কেবলমাত্র অন্য সূক্ষ্ম জিনিসগুলি বিপরীত হয়; আমরা সংখ্যার শুরুতে শূন্যগুলির সাথে প্যাড করতে চাই, তবে জেলি zকমান্ডের শেষে প্যাডগুলি, সুতরাং তালিকাগুলি বিপরীত করা মানে zসঠিকভাবে প্যাড হবে।


3
আপনি 10 বাইট পেতে b⁵সাথে প্রতিস্থাপন করতে পারেন D। : পি
পূর্কাকাডুড়ি

4

পাইথন 2, 99 বাইট

a,b=input();o=0;p=1-2*(a*b<0);a,b=abs(a),abs(b)
while a:o+=a%10*(b%10)*p;p*=100;a/=10;b/=10
print o

নেগেটিভ ইনপুট ক্ষেত্রে সাইন ইন করতে অনেকগুলি বাইট রয়েছে। পাইথনে, ইতিবাচক 1n%d হলে সর্বদা অ-নেতিবাচক থাকে । আমার মতে এটি সাধারণত কাম্য, তবে এখানে এটি অসুবিধাজনক বলে মনে হচ্ছে: কলগুলি সরিয়ে ফেললে উপরের কোডটি ভঙ্গ হবে। এদিকে "স্থানের মান" (যেগুলি, কয়েকশ ইত্যাদি) ট্র্যাক করে এবং আউটপুটটির পছন্দসই চিহ্নটি মনে রাখে।dabsp

কোডটি মূলত শর্তের মধ্যে aএবং bব্যতীত একসম্মত while: আমরা aশূন্য না হওয়া অবধি চলতে থাকি এবং সেই সময়টি সমাপ্ত করি। অবশ্যই যদি bপ্রথম শূন্য হয়, তবে আমরা শূণ্য না হওয়া পর্যন্ত কিছুক্ষণের জন্য শূন্যগুলি যোগ করব a


1 উদাহরণস্বরূপ, (-33)%10ফেরত দেয় 7এবং এর পূর্ণসংখ্যার ভাগ (-33)/10হয় -4। এটি সঠিক কারণ (-4)*10 + 7 = -33। যাইহোক, এর জিপার পণ্যের (-33)সঙ্গে 33এ শেষ হওয়া আবশ্যক 3*3 = 09বদলে 7*3 = 21


3

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

f=(x,y)=>x&&f(x/10|0,y/10|0)*100+x%10*(y%10)

সুবিধাজনকভাবে এটি স্বয়ংক্রিয়ভাবে নেতিবাচক সংখ্যার জন্য কাজ করে।


@ জাকুব আমি সর্বদা এটি করে যাচ্ছি, যদিও কমপক্ষে আমি f=বাইট গণনায় অন্তর্ভুক্ত করেছি । এছাড়াও, |0কারণ আমার পূর্ণসংখ্যা বিভাগ প্রয়োজন, আপনি কীভাবে ভাবেন যে আপনি এটি ছাড়া সঠিক উত্তর পাচ্ছেন তা আমি জানি না।
নীল

আহ, এটা বোঝা যায়। সরানোর সময় আমিও ভুল উত্তর পেয়েছি |0। হয়তো নতুন ফাংশনটির পুনরায় নিয়োগের কাজটি কার্যকর হয়নি এবং আমি এখনও এর সাথে পুরানো সংস্করণটি পরীক্ষা করেছি |0
জাকুব

2

সি, 77 বাইট

অপ্রয়োজনীয় ধনুর্বন্ধনী অপসারণের জন্য -2 বাইট (সহজাত *)।

r,t;f(a,b){t=1;r=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100;return r;}

t= 1,100,10000, ... প্যাডিংয়ের জন্য ব্যবহৃত হয়। যতদিন aবা bশূন্য শেষের ডিজিটটি multiplicating রাখা নয় %10সঙ্গে tএবং বাড়তে থাকে। তারপরে aএবং b( /=10) এর শেষ অঙ্কটি তৈরি করুন এবং t2 অঙ্ক ( *=100) দ্বারা শিফ্ট করুন ।

অবহেলিত এবং ব্যবহার:

r,t;
f(a,b){
 t=1;
 r=0;
 while(a|b)
  r+=t*(a%10)*(b%10),
  a/=10,
  b/=10,
  t*=100;
 return r;
}

main(){
 printf("%d\n", f(1276,933024));
}

এর for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10পরিবর্তে প্রস্তাব দিনr=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
সিলিংক্যাট

1

আসলে , 23 19 বাইট

ইনপুট দুটি স্ট্রিং হিসাবে নেওয়া হয়। এছাড়াও, স্পষ্টতই বেস 100 থেকে রূপান্তরিত করার চেষ্টা করা হচ্ছে, যেমন আইস 523 তাদের জেলি উত্তরগুলিতে করে, আসলে তেমন ভাল কাজ করে না। এটি কাজ করলে 9 বাইটও বাঁচাতে পারত: / গল্ফিংয়ের পরামর্শগুলি স্বাগত! এটি অনলাইন চেষ্টা করুন!

সম্পাদনা করুন: -4 বাইটগুলি কীভাবে ফলাফলটিকে একটি নতুন সংখ্যায় তৈরি করা হয় তা পরিবর্তন করে।

k`♂≈R`M┬ñ`iτ╤@π*`MΣ

Ungolfing

          Implicit input a and b.
k         Wrap a and b into a list.
`...`M    Map over the list of strings.
  ♂≈        Convert each digit to its own int.
  R         Reverse for later.
┬         Transpose to get pairs of digits from a and b.
ñ         enumerate(transpose) to get all of the indices as well.
`...`M    Map over the transpose.
  i         Flatten (index, pair) onto the stack.
  τ╤        Push 10**(2*index) == 100**index to the stack.
  @π        Swap and get the product of the pair of integers.
  *         Multiply the product by 100**index.
Σ         Sum everything into one number.
          Implicit return.

1

গণিত 66 বাইট

i=IntegerDigits;p=PadLeft;FromDigits@Flatten@p[i/@Times@@p[i/@#]]&

Ungolfed:

IntegerDigits/@{1276,933024}
PadLeft[%]
Times@@%
IntegerDigits/@%
PadLeft[%]
Flatten@%
FromDigits@%

যেখানে% এর অর্থ পূর্ববর্তী আউটপুট ফলন

{{1,2,7,6},{9,3,3,0,2,4}}
{{0,0,1,2,7,6},{9,3,3,0,2,4}}
{0,0,3,0,14,24}
{{0},{0},{3},{0},{1,4},{2,4}}
{{0,0},{0,0},{0,3},{0,0},{1,4},{2,4}}
{0,0,0,0,0,3,0,0,1,4,2,4}
3001424

1

আর, 182 110 107 86 বাইট

আর দীর্ঘতম উত্তর (ধন্যবাদ, র‌্যাকেট) নেই, এবং আসলে পাইথন সলিউশন (একটি বিরল ট্রিট) এর চেয়ে সংক্ষিপ্ত! একটি অনামী ফাংশন যা ইনপুট হিসাবে দুটি পূর্ণসংখ্যার গ্রহণ করে।

function(a,b)sum((s=function(x)abs(x)%%10^(99:1)%/%(e=10^(98:0))*e)(a)*s(b))*sign(a*b)

এখানে কিভাবে এটা কাজ করে.

জিপার গুণটি ইনপুট সংখ্যাগুলিকে তাদের উপাদানগুলিতে বিভক্ত করার সাথে জড়িত। আমরা সংখ্যার পরম মূল্য গ্রহণ করি এবং 10 এর নিম্নোক্ত ক্ষমতার জন্য মডুলো পরিচালনা করি:

abs(x) %% 10^(99:1)

সুতরাং এখানে আমরা একটি সংখ্যা নিচ্ছি x, এবং 99 টি অন্যান্য সংখ্যার ( 10^99মাধ্যমে 10^1) মডুলো প্রয়োগ করছি applying আর স্পষ্টতই x99 বার পুনরাবৃত্তি করে 99 টি উপাদান সহ ভেক্টর (তালিকা) ফেরত। ( x %% 10^99, x %% 10^98, x %% 10^97, ইত্যাদি)

আমরা 10^99মাধ্যমে ব্যবহার 10^1। আরও কার্যকর প্রয়োগটি দীর্ঘতম সংখ্যার সংখ্যার মান ব্যবহার করবে (এই পোস্টের সম্পাদনার ইতিহাসটি পরীক্ষা করুন; পূর্ববর্তী সংস্করণগুলি এটি করেছে), তবে কেবল 99..1কম বাইট ব্যবহার করা সম্ভব।

জন্য x = 1276এই আমাদের দেয়

1276 1276 1276 ... 1276 276 76 6

এর পরে, আমরা সংখ্যার বৃত্তাকারে 10 এর উত্থানের ক্ষমতা দ্বারা পূর্ণসংখ্যা বিভাগ ব্যবহার করি:

abs(x) %% 10^(99:1) %/% 10^(98:0)

এই ফলন

0 0 0 ... 1 2 7 6

যা হ'ল আমরা চাই প্রতিনিধিত্ব। কোডটিতে, আমরা 10^(98:0)পরে আবার ব্যবহার করতে চাই, তাই আমরা এটি একটি ভেরিয়েবলের জন্য নির্ধারণ করি:

abs(x) %% 10^(99:1) %/% (e = 10^(98:0))

(রাঃ মধ্যে বন্ধনীর মধ্যে একটি অভিব্যক্তি মোড়ানো সাধারণত অভিব্যক্তি (এই ক্ষেত্রে মূল্যায়ণ এর মান বরাদ্দ 10^(98:0)করতে e), এবং তারপর আরো অভিব্যক্তি আউটপুট ফেরৎ রেখে আসুন অন্যান্য গণনার মধ্যে এম্বেড পরিবর্তনশীল বরাদ্দকরণ করতে সক্ষম হবেন।)

এরপরে, আমরা ইনপুটটিতে অঙ্কগুলির জোড় গুণ করি perform আউটপুটটি তখন দুটি সংখ্যায় প্যাড করা হয় এবং সংক্ষিপ্ত হয়। দুটি সংখ্যায় প্যাডিং এবং সংক্ষিপ্তকরণ প্রতিটি সংখ্যাকে 10^n, যেখানে nডান প্রান্ত থেকে দূরত্ব এবং তারপরে সমস্ত সংখ্যার সংমিশ্রনের সমান ।

 A = 0         0         1         2         7         6
 B = 9         9         3         0         2         4
 ->  0         0         3         0        14        24
 -> 00        00        03        00        14        24
 ->  0*10^6 +  0*10^5 +  3*10^4 +  0*10^3 + 14*10^2 + 24*10^1
 =  000003001424

উল্লেখযোগ্যরূপে, কারণ গুণটি পরিবর্তনীয়, তাই আমরা বি দ্বারা A কে গুণ 10^n করার আগে আমরা গুণটি সম্পাদন করতে পারি । সুতরাং, আমরা আমাদের আগের গণনাটি গ্রহণ করি এবং এর দ্বারা গুণ করি :10^(98:0)

abs(x) %% 10^(99:1) %/% 10^(98:0) * 10^(98:0)

যা সমান

abs(x) %% 10^(99:1) %/% (e = 10^(98:0)) * e

এই প্রযুক্ত হবার পর একজন , আমরা তারপর এই পুরো অপারেশন পুনরাবৃত্তি চাই বি । তবে এটি মূল্যবান বাইট লাগে, সুতরাং আমরা একটি ফাংশন সংজ্ঞায়িত করি যাতে আমাদের কেবল এটি একবার লিখতে হবে:

s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e

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

(s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)

এবং আমরা এই সমস্তগুলির যোগফল নিয়েছি এবং আমরা প্রায় শেষ করেছি:

sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b))

এখন বিবেচনা করা একমাত্র জিনিস ইনপুট এর চিহ্ন। আমরা নিয়মিত গুণনের নিয়ম অনুসরণ করতে চাই, সুতরাং A এবং B এর মধ্যে একটি এবং নেতিবাচক হলে আউটপুট negativeণাত্মক হয়। আমরা কোনও ফাংশনটি ব্যবহার করি signযা 1কোনও ইতিবাচক সংখ্যা -1দেওয়া হলে এবং যখন একটি নেতিবাচক নম্বর দেওয়া হয়, একটি সহগের আউটপুট দিতে যা আমরা আমাদের সম্পূর্ণ গণনাটি এর দ্বারা গুণিত করি:

sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)

অবশেষে, পুরো জিনিসটি একটি বেনামী ফাংশনে আবৃত হয় যা গ্রহণ করে aএবং bইনপুট হিসাবে:

function(a, b) sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)

সাদা স্থানটি সরান এবং এটি 86 বাইট।


আপনি যদি সবার উপকারের জন্য একটি অব্যক্ত, ব্যাখ্যা করা সংস্করণ সরবরাহ করতে পারেন তবে এটি দুর্দান্ত হবে।
rnso

আমি একটি ব্যাখ্যা সহ পোস্টটি আপডেট করেছি।
rturnbull

দারূন কাজ. খুব চতুর পদ্ধতি ব্যবহৃত।
rnso

1

পাইথন 3 , 92 বাইট , 119 বাইট

lambda m,n:(1-(n*m<0)*2)*int(''.join([f"{int(a)*int(b):02}"for a,b in zip(str(abs(n))[::-1],str(abs(m))[::-1])][::-1]))

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

নেতিবাচক সংখ্যাগুলি 29 বাইট ব্যয় পরিচালনা করার জন্য ঠিক করুন: /


চমৎকার উত্তর! আমি মনে করি আপনি lstripভিতরে সমস্ত কিছু মোড়ানো int()এবং একটি নম্বর ফিরিয়ে অংশটি প্রতিস্থাপন করতে পারেন ।
আরবো

তুমি ঠিক বলছো. তারপরে আমি অনুভব করেছি যেন ধারাবাহিক ইন্টারফেস রাখি। ইন্টের পরিবর্তে আর্গুমেন্ট হিসাবে স্ট্রিং নেওয়া, তারপরে কোনও ইনট ফিরিয়ে দেওয়া আমার কাছে অদ্ভুত লাগে;) আমি বরং ম্যাপের কলের জন্য লুপের জন্য
জিপটি

কোড গল্ফের ধারাবাহিকতা সম্পর্কে আমি খুব বেশি চিন্তা করব না, তবে এটি আপনার উপর :)। পাইথনে ম্যাপিংটি সাধারণত খুব লোভনীয় হয় না যদি এটি করার জন্য আপনার অতিরিক্ত ল্যাম্বডা তৈরি করতে হয়।
আরবো

এই ফাংশনটি নেতিবাচক ইনপুটগুলির জন্য ব্যর্থ বলে মনে হচ্ছে
আরবো

আপনি ঠিক বলেছেন: / ফিক্সটি বেশ ব্যয়বহুল, সম্ভবত এটি গল্ফ করার আরও সম্ভাবনা রয়েছে।
মুভাতিকা


0

পিএইচপি, 84 বাইট

for(list(,$a,$b)=$argv,$f=1;$a>=1;$a/=10,$b/=10,$f*=100)$r+=$a%10*($b%10)*$f;echo$r;

স্ট্রিং কনটেনটেশন (86 বাইট) সহ কিছুটা দীর্ঘ:

for(list(,$a,$b)=$argv;$a>=1;$a/=10,$b/=10)$r=sprintf("%02d$r",$a%10*($b%10));echo+$r;

0

র‌্যাকেট 325 বাইট

(let*((g string-append)(q quotient/remainder)(l(let p((a(abs a))(b(abs b))(ol'()))(define-values(x y)(q a 10))
(define-values(j k)(q b 10))(if(not(= 0 x j))(p x j(cons(* y k)ol))(cons(* y k)ol)))))(*(string->number
(apply g(map(λ(x)(let((s(number->string x)))(if(= 2(string-length s)) s (g "0" s))))l)))(if(<(* a b)0)-1 1)))

Ungolfed:

(define (f a b)
  (let* ((sa string-append)
         (q quotient/remainder)
         (ll (let loop ((a (abs a))
                        (b (abs b))
                        (ol '()))
               (define-values (x y) (q a 10))
               (define-values (j k) (q b 10))
               (if (not(= 0 x j))
                   (loop x j (cons (* y k) ol))
                   (cons (* y k) ol)))))
    (*(string->number (apply sa
                             (map (λ (x)
                                    (let ((s (number->string x)))
                                      (if (= 2 (string-length s))
                                          s
                                          (sa "0" s))))
                                  ll)))
      (if (< (* a b) 0) -1 1))))

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

(f 1276 933024)
(f 302 40)
(f 0 6623)
(f 63196 21220)
(f 20643 -56721)

আউটপুট:

3001424
0
0
1203021800
-1000420803

0

পাওয়ারশেল , 153 151 বাইট

param($a,$b)do{$x,$y=$a[--$i],$b[$i]|%{if($_-eq45){$s+=$_;$_=0}$_}
$r=(+"$x"*"$y"|% t*g "00")+$r}while($x+$y)$s+$r-replace'(?<!\d)0+(?=\d)|--|-(?=0+$)'

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

কম গল্ফড:

param($a,$b)
do{
    $x,$y=$a[--$i],$b[$i]|%{
        if($_-eq45){                                # [char]45 is '-'
            $signs+=$_
            $_=0
        }
        $_                                          # a digit or $null
    }
    $res=(+"$x"*"$y"|% toString "00")+$res          # "00" is the custom format to get 2-digit number
}
while($x+$y)
$signs+$res-replace'(?<!\d)0+(?=\d)|--|-(?=0+$)'    # cleanup and return

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.