আনাস্তাসিয়ার পৃথিবীতে গণিত কীভাবে কাজ করে?


44

পটভূমি:

বাস্তব জগতে মৌলিক সংযোজন এবং গুণনের মতো স্ট্যান্ডার্ড অপারেশন গণিত এর মতো কাজ করে:

12 + 123 = 135

এবং

12 * 123 = 1476

এটি আকর্ষণীয় এবং বিরক্তিকর নয়! অনেক স্কুল ইতিমধ্যে অনুশীলন, অনুশীলন, আনুষ্ঠানিক অ্যালগরিদমের অনুশীলন হিসাবে ব্যাখ্যা দিচ্ছে। এটি একটি কঠোর এবং বিরক্তিকর গাণিতিক ডায়েটকে বোঝায় এবং এই চ্যালেঞ্জের উদ্দেশ্যটি নয়। আমাদের প্রিয় সাইটে কিছু মজা খেলতে প্রস্তুত হন।

দুটি ধনাত্মক পূর্ণসংখ্যার সংখ্যা যুক্ত করার প্রক্রিয়াটি বিবেচনা করুন এবং তার ফলাফলের সমস্ত অঙ্ক আবার যুক্ত করুন। কেবলমাত্র একটি একক অঙ্ক না পাওয়া পর্যন্ত সংযোজনটির সাথে পুনরাবৃত্তি করা। উদাহরণ স্বরূপ:

  1. ফলাফল 12 + 123135।
  2. আমরা প্রাপ্ত 135 এর সমস্ত অঙ্ক যুক্ত করছি 1 + 3 + 5 = 9

এই পুনরাবৃত্ত সংযোজনে একক ডিজিটের মান 9 পেতে প্রয়োজনীয় পদক্ষেপের সংখ্যা 2 is

সংযোজন পূর্ববর্তী প্রক্রিয়া হিসাবে, দুটি ধনাত্মক পূর্ণসংখ্যার সংখ্যা একই গুণ অনুসরণ করে। এর ফলাফলের সমস্ত অঙ্কগুলিকে গুণিত করুন এবং তারপরে কেবল একটি একক সংখ্যা অবধি অবধি এই প্রক্রিয়াটি পুনরাবৃত্তি করুন। উপরের উদাহরণটি ধরুন:

  1. ফলাফল 12 * 1231476।
  2. আমরা প্রাপ্ত 1476 এর সমস্ত অঙ্ককে গুণিত করুন 1 * 4 * 7 * 6 = 168
  3. আমরা প্রাপ্ত 168 এর সমস্ত সংখ্যাকে আবার গুণ করি 1 * 6 * 8 = 48
  4. আমরা প্রাপ্ত 48 টির সমস্ত সংখ্যাকে আবার গুণ করি 4 * 8 = 32
  5. আমরা প্রাপ্ত 32 টির সমস্ত সংখ্যার আবার একবারে গুণ করি 3 * 2 = 6

একক ডিজিটের মান 6 পেতে প্রয়োজনীয় পদক্ষেপের সংখ্যা এই পুনরাবৃত্তিটির গুণক 5।

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

  1. একক মান পাওয়ার জন্য বারবার সংযোজন প্রক্রিয়াটির অপারেশন 12 (+) 123 = 9
  2. একক মান পাওয়ার জন্য বারবার গুণিতকরণের ক্রিয়াকলাপটি হ'ল 12 (*) 123 = 6

চ্যালেঞ্জ:

চ্যালেঞ্জটি হ'ল হয় এমন একটি প্রোগ্রাম বা একটি ফাংশন লিখুন যা ব্যাকগ্রাউন্ড বিভাগে বর্ণিত হিসাবে উভয় ক্রিয়াকলাপ সম্পাদন করতে পারে : (+)এবং (*)

ইনপুট:

প্রোগ্রাম বা ফাংশনের ইনপুটগুলি দুটি ধনাত্মক পূর্ণসংখ্যা এবং একটি অপারেশন হয় (+)এবং হয় (*)ইনপুট ফর্ম্যাট প্রোগ্রামার একটি স্বেচ্ছাসেবী পছন্দ । আপনি ইনপুট ফর্ম্যাট করতে পারেন, উদাহরণস্বরূপ, a (+) bবা F(a, (+), b)আপনার ইচ্ছামত যে কোনও বিন্যাস করতে পারেন।

আউটপুট:

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

পরীক্ষার কেসগুলি (ইনপুট এবং আউটপুট ফর্ম্যাটটিকে উপেক্ষা করুন):

    81 (+) 31       -->   (4 ; 2)
    351 (+) 14568   -->   (6 ; 3)
    21 (*) 111      -->   (8 ; 3)
    136 (*) 2356    -->   (0 ; 2)

সাধারণ নিয়ম:

  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তরটি চ্যালেঞ্জটি জেতে।
    এসোলেংগুলি আপনাকে নিয়মিত ভাষার সাথে উত্তর পোস্ট করতে নিরুৎসাহিত করবেন না। আপনার প্রোগ্রামিং ভাষার সাথে যতটা সম্ভব সংক্ষিপ্ত উত্তর সরবরাহ করে এই চ্যালেঞ্জটি উপভোগ করুন। আপনি যদি কোনও চৌকস উত্তর এবং স্পষ্ট ব্যাখ্যা পোস্ট করেন তবে আপনি যে প্রোগ্রামিং ভাষা ব্যবহার করেন না কেন আপনার উত্তর প্রশংসা করা হবে (অতএব উন্নতিগুলি)।
  • স্ট্যান্ডার্ড বিধিগুলি আপনার উত্তরের জন্য প্রযোজ্য , সুতরাং আপনাকে STDIN / STDOUT, ফাংশন / সঠিক প্যারামিটারগুলি সহ, সম্পূর্ণ প্রোগ্রামগুলি, ইত্যাদি ব্যবহার করার অনুমতি দেওয়া হবে The পছন্দটি আপনার is
  • যদি সম্ভব হয় তবে আপনার প্রোগ্রামটি সঠিকভাবে বড় সংখ্যক পরিচালনা করতে পারে। যদি তা না হয় তবে তা ঠিক হয়ে যাবে।

চল খেলা শুরু করি!!


পুনরাবৃত্তি উপরন্তু অংশ ( ডিজিটাল রুট ) মূলত অনুরূপ codegolf.stackexchange.com/q/1128/194
পিটার টেলর

4
দুর্দান্ত প্রথম প্রশ্ন! এবং আমি আমার নিজস্ব প্রশ্নাবলীর সাধারণ নিয়ম বিন্যাস এবং বাক্যগুলি স্বীকার করি। ;)
কেভিন ক্রুইজসেন

4
@ কেভিন ক্রুজসেন ইউপ সেটা ঠিক. যেহেতু এর কোনও কপিরাইট নেই তাই আমি এটি আপনার অনুমতি ব্যতীত নকল করি। হিহেহে: ডি
আনস্তাসিয়া-রোমানোভা 秀

4
@ আনাস্তাসিয়া-রোমানোভা 秀 "কোনও কপিরাইট নেই"? XXI শতাব্দীতে? নাঃ; এখানে সবকিছু সিসি-বাই-এসএ 3.0 রয়েছে। বিষয়বস্তু জমা দেওয়া হলে অনুমতি দেওয়া হয়। সাইট পাদলেখ দেখুন।
মাইন্ডউইন

1
@ ব্র্যাডগিলবার্টব 2 গিল অবশ্যই, হ্যাঁ এটা পোস্টে বিবৃত। উক্তি: " ইনপুটটির ফর্ম্যাটটি প্রোগ্রামারের একটি স্বেচ্ছাসেবী পছন্দ"।
আনাস্তাসিয়া-রোমানোভা 秀

উত্তর:


11

ডায়ালগ এপিএল , 33 32 30 29 বাইট

এটি প্রিফিক্স স্বরলিপি অন্তর্ভুক্ত করতে +/A n₁ n₂এবং এপিএল প্রসারিত করে ×/A n₁ n₂। (আসলে, আপনি যে কোনও ক্রিয়াকলাপ বামদিকে ব্যবহার করতে পারেন /A)) {ফলাফল, পুনরাবৃত্তি গণনা} এর একটি তালিকা ফেরত দেয়}

A←{(⊃,≢)⍺⍺{∪⍵,⍨⍺⍺⍎¨⍕⊃⍵}⍣≡⍺⍺⍵}

A←{বাম-হাত ফাংশন এবং ডান-হাত আর্গুমেন্টের ক্ষেত্রে একটি উচ্চ-অর্ডার ফাংশন সংজ্ঞায়িত করুন⍺⍺

(⊃,≢) এর প্রথম উপাদান, তার পরে গণনা করা হয়

⍺⍺{সরবরাহিত ফাংশন ( +/যোগফলের জন্য বা ×/পণ্যের জন্য) উচ্চ-ক্রমের ক্রিয়াকলাপকে খাওয়ানো হয়

এর অনন্য উপাদান

⍵,⍨ যুক্তি যুক্ত

⍺⍺ খাওয়ানো ফাংশন প্রয়োগ

⍎¨ প্রতিটি চরিত্রের মূল্যায়ন

চরিত্র উপস্থাপনা

⊃⍵ তর্কটির প্রথম উপাদান

}⍣≡ ফলাফলটি যুক্তির অনুরূপ না হওয়া পর্যন্ত বারবার প্রয়োগ করা হবে applied

⍺⍺⍵আসলভাবে খাওয়ানো ফাংশন ( +/বা ×/) আসল আর্গুমেন্টে প্রয়োগ করা হয়

} [উচ্চতর ক্রমের সংজ্ঞাটির শেষ]

অনলাইনে চেষ্টা করুন! ( সুরক্ষার কারণে এটিকে অনুকরণ করা হয়েছে e))

বাইট সংরক্ষণ করার জন্য @ জিএনএকে ধন্যবাদ


0 বাইট (ঠাট্টায়)

ডায়ালগ এপিএল আসলে ইতিমধ্যে আনাস্তাসিয়ান গণিতের সম্পূর্ণ সমর্থন রয়েছে; পরিবর্তে (+)এবং (×), এটি ব্যবহার করে +{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}এবং ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}

চেষ্টা করুন 81 +{(⊃,≢)⍺⍺{∪⍵,⍨⍺⍺e¨⍕⊃⍵}⍣≡⍺⍺/⍺⍵} 31এবং 21 ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/e¨⍕⍵}⍣=⍵⍺⍺⍨⍺} 111


উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

1
আপনি সেট করেন তাহলে ⎕FR←1287(অর্থাত আইইইই 754-2008 128-বিট দশমিক ব্যবহার এফ loating দফা আর এবং epresentation) ⎕PP←34(অর্থাত ব্যবহার 34 অক্ষর ' পি দ্রণ পি recision), আপনি 10³⁴ নিচে পূর্ণসংখ্যার ব্যবহার করতে পারেন।
অ্যাডম

হুম, যদিও এর পূর্ণ সমর্থন রয়েছে, +{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}এবং ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}এখনও বেশ কয়েকটি বাইট নেই? এটি কীভাবে 0 বাইট হয় তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি ..: এস
কেভিন ক্রুইজসেন

3
@ কেভিন ক্রুইজসেন ওপি কোনও ইনপুট স্বরলিপি দেয়। সুতরাং, যদি কোনও ভাষা বাক্সের বাইরে ডিফল্ট-স্বীকৃতি আনাস্তাসিয়ান গণিতকে সমর্থন করে, তবে মাল্টি-চার গ্লাইফ (+)আনাস্তাসিয়ান + হবে। ডায়ালগ এপিএল আনাস্তাসিয়ান গণিতকে সমর্থন করে তবে এটি একটি ভিন্ন মাল্টি-চার গ্লিফ ব্যবহার করে ঠিক যেমন *শক্তি এবং আপনার ×গুণনের প্রয়োজন হয়, অন্যদিকে /প্রতিরূপ এবং আপনার বিভাগ প্রয়োজন ÷
অ্যাডম

1
@ অ্যাডাম আহ ঠিক আছে, তা বোঝা যায়। এটি ওপির নিয়মগুলি নমনীয়, তবে সেগুলি ভঙ্গ করছে না। এটা এখনও বেশ অদ্ভুত যে পরিবর্তে এর (+)আপনি +{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}ইনপুট হিসাবে, কিন্তু যেহেতু ওপি প্রকৃতপক্ষে বিবৃত কোনো ইনপুট বিন্যাস কি করতে হবে, আপনি প্যারামিটার হিসাবে ফাংশন ব্যবহার করতে পারেন। হুম, আমি আশ্চর্য হই যে এটি অন্যান্য প্রোগ্রামিং ভাষায়ও সম্ভব কিনা যা ইনপুট হিসাবে ফাংশন সমর্থন করে।
কেভিন ক্রুইজসেন

8

হাস্কেল, 108 বাইট

f=map(read.pure).show
g h=(\x->(h.f$last x,length x+1)).takeWhile(>10).iterate(h.f)
(a#b)o=g(foldr1 o)$o a b

ফাংশন নির্ধারণ #যা প্রথম নেয় aএবং bঅপারেটর এবং তারপর o। মজাদার ঘটনা: এটি আপনার যে কোনও অপারেটরের সাথে (আসলে, কোনও ফাংশন) কাজ করে!


উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

4
@ আনাস্তাসিয়া-রোমানোভা 秀 হ্যাঁ, এটি আপনার র্যামের মতো বৃহত সংখ্যাগুলি পরিচালনা করতে পারে যেহেতু হাস্কেলের Integerপ্রকারটি সীমাহীন।
থ্রিএফএক্স

8

পাইকে, 16 বাইট

RE`DltImbRoKr)oh

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

RE               - evaluate the input as Pyke code
                 -  (`B` is product and `s` is sum, the second line is a tuple)
  `              - i = str(^)
    ltI      )   - if len(i) != 1:
       mb        -   map(i, int)
         R       -   get the `B` or `s` from input
          oK     -   o++
            r    -   goto_start()
              oh - o++ + 1

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


1
নিস! আমরা কি একটি ব্যাখ্যা পেতে পারি?
এমিগানা

উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

@ আনাস্তাসিয়া-রোমানোভা - এটি নির্বিচার সংখ্যা পরিচালনা করতে সক্ষম হওয়া উচিত
নীল

আমি আপনার কোডটি পরীক্ষা করতে পারছি না কারণ ওয়েবটি আমার পিতামাতার ইন্টারনেট ব্যবহার নীতি লঙ্ঘন করার কারণে এটি অবরুদ্ধ। টিটিটি
আনস্তাসিয়া-রোমানোভা 秀

এরকম কিছু: ওয়েব পৃষ্ঠা অবরুদ্ধ! আপনি কোনও ওয়েব পৃষ্ঠা অ্যাক্সেস করার চেষ্টা করেছেন যা আপনার ইন্টারনেট ব্যবহারের নীতি লঙ্ঘন করছে। ইউআরএল: pyke.catbus.co.uk/?code=RE%60DltImbRoKr%29oh&input=B%0A21%2C+111&warnings=0 বিভাগ: নিরীক্ষণ
আনস্টাসিয়া-রোমানোভা

8

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

রিকার্সিভ ফাংশন, ইনপুট ফর্ম্যাটটি পুনরাবৃত্ত কলটি সহজ করার জন্য তৈরি করা হয়েছে:

  • অপারেটর: '+' বা '*'
  • অপারেশনস: দুটি মানের অ্যারে
f=(o,v,s=1,t=eval(v.join(o)))=>t>9?f(o,[...t+''],s+1):[t,s]

পরীক্ষা

f=(o,v,s=1,t=eval(v.join(o)))=>t>9?f(o,[...t+''],s+1):[t,s]

;[
  [81,'+',31,     /* -> */ 4, 2]
, [351,'+',14568, /* -> */ 6, 3]
, [21,'*',111,    /* -> */ 8, 3]
, [136,'*',2356,  /* -> */ 0, 2]
].forEach(t=>{
  var [a,o,b,k1,k2] = t,
      [r,s]=f(o,[a,b]);
  console.log(k1==r && k2==s ? 'OK':'KO',a,o,b,'->',r,s)
})  
  


উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

1
@ আনাস্তাসিয়া-রোমানোভা
j

8

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

f=lambda s,c=0:s[1:]and f(min(s).join(`eval(s)`),c+1)or(s,c)

ইনপুট একটি স্ট্রিং এর মতো 81+31, আউটপুটটি একটি সিঙ্গলটন স্ট্রিং এবং একটি কাউন্টারের উদাহরণ (যেমন ('4', 2),।

আইডিয়নে এটি পরীক্ষা করুন ।


যদি স্ট্রিংগুলির অ্যারে হিসাবে ইনপুট গ্রহণ এবং একক স্ট্রিংকে অনুমতি দেওয়া হয়, উদাহরণস্বরূপ, f(['81', '31'],'+')আরও একটি বাইট সংরক্ষণ করা যায় তবে এটি নিয়মগুলি কিছুটা প্রসারিত করার মতো মনে হয় ...
ডেনিস


... এই ক্ষেত্রে আমি এমনকি যতদূর যেতে পেরেছি এবং যথাক্রমে operator.addoperator.mul
উত্তরণ

7

পাইথ, 16

eJ.uvjhQ`N.vQ)lJ

"+ 123 12"সংযোজন এবং "* 123 12"গুণনের জন্য যেমন ইনপুট নেয় । আউটপুট পছন্দ result<linefeed>steps

এখানে এটি ব্যবহার করে দেখুন , বা একটি টেস্ট স্যুট চালান , তবে নোট করুন যে এটি নির্ভর করে। গুণ অফলাইন দোভাষী সাথে সঠিকভাবে কাজ করে।

এটি মধ্যবর্তী ফলাফলের একটি তালিকা তৈরি করতে ক্রমহ্রাসমান হ্রাস ফাংশনটি ব্যবহার করে, তাই "+ 351 14568"আমরা পাই [14919, 24, 6]। এটি কাজ করে কারণ একক অঙ্কের সংখ্যাগুলি আনাস্তাসিয়া সংযোজন এবং গুণনের একটি নির্দিষ্ট বিন্দু। তারপরে আমরা অ্যারের শেষ উপাদানটি পাশাপাশি অ্যারের দৈর্ঘ্য পাই।

কমপক্ষে আপনার স্মৃতিশক্তি শেষ না হওয়া অবধি এটি নির্বিচারে বড় সংখ্যার জন্য কাজ করবে।


7

আর, 175 167 164 140 134 127 126 119 বাইট

function(G,S,D){i=1;O=switch(S,"+"=sum,prod);x=O(G,D);while(x>9){i=i+1;x=O(strtoi(strsplit(paste(x),"")[[1]]))};c(x,i)}

অসমাপ্ত:

f=function(G,S,D) #The function takes : the left operand, the operation symbol (between quote marks)
                  #and then the right operand
i=1               #That's the counter

O=switch(S,"+"=sum,prod)     #`O` takes the value `sum` if `S` matches `+`, `prod` 
                             #(which is the next agument) if not. 

x=O(G,D)                     #Does the first operation

while(nchar(x)>1)                 #While the number of character of the result 
                                  #of the operation is not of length 1, i.e., an integer :

    i=i+1                                    #Increase the counter
    x=O(strtoi(strsplit(paste(x),"")[[1]]))  #Apply the operation `O` to the first operation and 
                                             #the eventual subsequent ones

c(x,i)                                 #Outputs the result and the counter

ifelseফিরে এসেছে! হ্যাঁ!
Nop

ব্যবহার:

Special addition
> f(31,"+",81)
[1] 4 2

Special multiplication
> f(136,"*",2356)
[1] 0 2

24 বাইট আউট করার জন্য @ প্লানাপাসকে অনেক ধন্যবাদ ! -ভালো থেকে একটি ভাল ধারণা -7 বাইট ধন্যবাদ !


হ্যাঁ, আমি আর ভালবাসি যেহেতু ব্যাখ্যা যোগ করুন! এটি ভিবিএর পরে আমার দ্বিতীয় ভাষা। (+1)
আনাস্তাসিয়া-রোমানোভা 秀

1
@ আনাস্তাসিয়া-রোমানোভা 秀: হয়ে গেল!
ফ্রেডেরিক

@ প্ল্যানাপাস: সত্যিই দুর্দান্ত! অনেক ধন্যবাদ !
ফ্রেডেরিক

1
@ ফ্রেডেরিক এর দুর্দান্ত ব্যবহার strtoi! আরও 4 টি বাইট আপনি আমাকে মারধর করেছেন।
প্ল্যানাপাস

1
দেখে মনে হচ্ছে আপনি প্রথম ক্রিয়াকলাপে এক্স এর অ্যাসাইনমেন্টের মধ্যে ও এর সংজ্ঞা অন্তর্ভুক্ত করে আরও বাইট বন্ধ করতে পারেন: x = (ও = সুইচ (এস, যোগ, `*`)) (জি, ডি);।
rturnbull

6

05 এ বি 1 ই , 20 15 বাইট

[¼¹iOëP}Dg#S]¾‚

ব্যাখ্যা

[       Dg# ]    # loop until number is single digit
 ¼               # increase counter
  ¹iO            # if operation is addition, sum list
     ëP}         # else take product of list
           S     # split into a list of digits
             ¾‚  # pair final number with counter and output

অপারেটর যোগের জন্য 1, গুণনের জন্য 0।

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


উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

@ আনাস্তাসিয়া-রোমানোভা 秀 আমি না করার কারণ দেখছি না। আপনার কি উদাহরণ আছে?
এমিগানা

আপনার প্রোগ্রামটি সেই ধরণের ইনপুটগুলির জন্য পরীক্ষা করা হয়েছে, সুতরাং এটি পারফেক্ট করে :)
আনাস্তাসিয়া-রোমানোভা 秀

6

জেলি , 11 10 বাইট

Dj⁹VµÐĿḊĖṪ

ইনপুট হ'ল এক সংখ্যার এবং হয় +বা হয় ×

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

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

Dj⁹VµÐĿḊĖṪ  Main link. Left argument: [x, y] (integers). Right argument: + or ×

    µÐĿ     Repeatedly execute the chain to the left, initially with argument
            [x, y], then with the previous return value. Stop when the results are
            no longer unique, and return the array of all intermediate results.
D           Decimal; convert the integers [x, y] or the return value z to base 10.
 j⁹         Join, separating by the link's right argument, i.e., '+' or '×'.
   V        Evaluate the result. This casts the previous return value to string,
            so, e.g., [8, 1, '+', 3, 1] becomes "81+31" before evaluation.
       Ḋ    Dequeue; discard the first intermediate result, i.e., [x, y].
        Ė   Enumerate; prefix each integer in the array with its 1-based index.
         Ṫ  Tail; extract the last index-value pair.

6

এআরএম মেশিন কোড, 48 বাইট

হেক্স ডাম্প:

b570 2a00 bf0c 1840 4348 2101 230a e00c 3101 0015 fbb0 f6f3 fb06 0413 2a00 bf0c 192d 4365 0030 d1f5 0028 280a d2f0 bd70

এই ফাংশনটি কোনও সিস্টেম কল বা লাইব্রেরি ফাংশন নির্ভর করে না। এটি হল থাম্ব -২ কোড, যা 32-বিট এআরএমের জন্য একটি পরিবর্তনশীল দৈর্ঘ্যের নির্দেশিকা এনকোডিং (2 বা 4 বাইট)। সুতরাং, এটি প্রক্রিয়া করতে পারে সর্বোচ্চ মান 2 ^ 32-1। এটিপিএসের ( 46 বাইট ) সাথে সামঞ্জস্য না হলে 2 বাইট বাদ দেওয়া যেতে পারে , যেহেতু শুরুতে আমাদের রেজিস্টারগুলি স্ট্যাক করতে হবে না।

অবহেলিত সমাবেশ (জিএনইউ সিনট্যাক্স):

.syntax unified
.text
.global anastasiya
.thumb_func
anastasiya:
    @Input:
    @r0 - First number
    @r1 - Second number
    @r2 - 0 for add, 1 for multiply
    @Output:
    @r0 - Resultant value
    @r1 - Number of steps
    push {r4,r5,r6,lr}
    cmp r2,#0
    ite eq @if r2==0
    addeq r0,r0,r1 @r0+=r1
    mulne r0,r0,r1 @else r0*=r1
    movs r1,#1 @r1 is the number of steps
    movs r3,#10
    b endloop
    loop:
        adds r1,r1,#1 @Increment number of steps
        movs r5,r2 @r5=1 if multiply, 0 if add
        parseDigits:
            udiv r6,r0,r3 @r6=r0/r3
            mls r4,r6,r3,r0 @r4=r0 - r6*r3
            @Last two operations were r4=r0%r3 (r3==10)
            cmp r2,#0
            ite eq @if r2==0
            addeq r5,r5,r4 @r5+=r4
            mulne r5,r5,r4 @else r5*=r4
            movs r0,r6 @r0=r6 (Set r0 to r0/10)
            bne parseDigits @while (r0!=0)
        @Now our new total is in r5
        movs r0,r5 @Put it in r0
    endloop:
        cmp r0,#10
        bhs loop @while (r0 >=10)
    pop {r4,r5,r6,pc} @Return

সি স্ক্রিপ্ট পরীক্ষা:

#include <stdio.h>
unsigned long long anastasiya(unsigned,unsigned,unsigned);

int main(void) {
    unsigned x,y,op;
    printf("Enter first operand, second operand, and 0 for addition or 1 for multiplication.\n");
    scanf("%u%u%u",&x,&y,&op);
    unsigned long long res = anastasiya(x,y,op);
    printf("Result = %u, steps = %u\n",(unsigned)res ,(unsigned)(res >> 32));
}

4

আর, 130 124 অক্ষর

@ ফ্রেডেরিকের থেকে কিছুটা আলাদা পদ্ধতির :

f=function(a,f,b){b=c(a,b);n=1;while((m<-nchar(d<-switch(f,'(+)'=sum,prod)(b)))>1){b=d%%10^(1:m)%/%10^(1:m-1);n=n+1};c(d,n)}

নতুন লাইনের সাথে ইন্ডেন্ট করা:

f=function(a,f,b){
    b=c(a,b) # Take both numbers
    n=1 #Counter
    while((m<-nchar(d<-switch(f,'(+)'=sum,prod)(b)))>1){
#My own special digit splitter! (d is the result and m is the nb of char of d)
        b=d%%10^(1:m)%/%10^(1:m-1)
        n=n+1
    }
    c(d,n) #Print results
    }

লাইন 4 সম্ভবত আরও ব্যাখ্যা প্রয়োজন:

switch(f,'(+)'=sum,prod) #pick which operator to use
switch(f,'(+)'=sum,prod)(b) # apply it to b
d<-switch(f,'(+)'=sum,prod)(b) #Saves the result in d
nchar(d<-switch(f,'(+)'=sum,prod)(b))#Measures the number of character of d
m<-nchar(d<-switch(f,'(+)'=sum,prod)(b)) #Saves it in m
(m<-nchar(d<-switch(f,'(+)'=sum,prod)(b)))>1 #Checks if it is more than 1

পরীক্ষার কেস:

> f(12,"(+)",123)
[1] 9 2
> f(12,"(*)",123)
[1] 6 5
> f(351,"(+)",14568)
[1] 6 3

দুর্ভাগ্যক্রমে আপনি এই উত্তরটি নিয়ে দেরি করে এসেছিলেন, তবে আপনি আমার উত্সাহ দিয়েছেন। আর এ তৈরি করার জন্য ধন্যবাদ
আনাস্তাসিয়া-রোমানোভা 秀

দুর্ভাগ্য কেন?
প্ল্যানাপাস

কারণ আপনি যদি আগে এসেছিলেন, তবে আপনি আরও উত্সাহ পেয়েছিলেন
আনাস্তাসিয়া-রোমানোভা 秀

@ আনাস্তাসিয়া-রোমানোভা 秀 যথেষ্ট মেলা :)
প্ল্যানাপাস

fফাংশনটির নাম এবং এর একটি আর্গুমেন্ট উভয়ই থাকার জন্য বোনাস পয়েন্ট :)
জেডিএল ২

4

অক্টাভা, 85 বাইট ম্যাটল্যাব, 123, 114, 105, 94 বাইট

ডাইরেক্ট ইনডেক্সিংয়ের সুবিধা গ্রহণ এবং ক্যাপিবিলাইটগুলি বাড়ানোর জন্য এটি অক্টাসে অনুবাদ করার সিদ্ধান্ত নিয়েছে। ফর্মটিতে ইনপুট নেয়: f(a,operator)যেখানে a = [number1, number2], এবং operator==1পণ্যটি operator==2দেয় এবং যোগফল দেয়।

function[x,i]=f(a,o)
g={@prod,@sum}{o};x=g(a);i=1;while(x=g(num2str(x)-48))>9;i++;end

ব্যাখ্যা:

g={@prod,@sum}{o} : উপযুক্ত ফাংশন, পণ্য বা যোগফল এবং এটি নির্ধারণ করে g

x=g(a) ইনপুটগুলির যোগফল বা পণ্য গ্রহণ করে

i=1; ... i++ : পদক্ষেপের সংখ্যা গণনা করার জন্য বৃদ্ধিকারী

while(x=g(num2str(x)-48))>9;
          num2str(x)-48)     % turns a number 123 into an array [1 2 3].
        g(num2str(x)-48))    % Takes the sum or product of the array
      x=g(num2str(x)-48))    % Assign that value to the variable x
      x=g(num2str(x)-48))>9  % Checks if x > 9, continue looping if yes

দুটি নতুনলাইন, একটি স্থান সরানো হয়েছে এবং পৃথক যুক্তির পরিবর্তে উভয় ইনপুট নম্বর ভেক্টরে রাখে। এটি 9 বাইট সংরক্ষণ করেছে, পাজঙ্ককে ধন্যবাদ! বেকারকে k=@(x)...ধন্যবাদ দিয়ে আরও 11 বাইট সংরক্ষণ করতে অপসারণ করা হয়েছে =) অবশেষে, আরও 9 টি বাইট সংরক্ষণের জন্য পুরো জিনিসটি অক্টাভে অনুবাদ করে ...


4

জাভা, 164 159 146 বাইট

int[]p(int t,int m,String[]d){int r=m;for(String i:d){int x=Integer.decode(i);r=m<1?r+x:r*x;}return r>9?p(++t,m,(r+"").split("")):new int[]{r,t};}

প্রথম যুক্তি হ'ল কাউন্টার, সর্বদা 0

দ্বিতীয় যুক্তিটি হল পদ্ধতি, 0 সংযোজনের জন্য এবং 1 বহুবিধের জন্য।

তৃতীয় আর্গুমেন্ট স্ট্রিংগুলির একটি অ্যারে, এতে যুক্ত / গুণনের মান রয়েছে।

Ungolfed

public static int[] p(int t, int m, String[] d) {
    int r = m;
    for (String i : d) {
        int x = Integer.decode(i);
        r = m < 1 ? r + x : r * x;
    }
    return (r + "").length() > 1 ? p(++t, m, (r + "").split("")) : new int[]{r, t};
}

কয়েকটি বাইট কাটানোর জন্য কেভিন ক্রুইজসেনকে ধন্যবাদ জানাই।

5 মিলকে শেভ করার জন্য @ মিল্ককে ধন্যবাদ

পরীক্ষা প্রোগ্রাম

public static final int ADD = 0;
public static final int MULTIPLY = 1;

public static void main(String[] args) {
    System.out.println(Arrays.toString(p(0, ADD, new String[]{"12", "123"}))); //9
    System.out.println(Arrays.toString(p(0, MULTIPLY, new String[]{"12", "123"}))); //6
}

public static int[] p(int t, int m, String[] d) {
    int r = m;
    for (String i : d) {
        int x = Integer.decode(i);
        r = m < 1 ? r + x : r * x;
    }
    return (r + "").length() > 1 ? p(++t, m, (r + "").split("")) : new int[]{r, t};
}

ভাল, আমার জাভা উত্তর চেয়ে ছোট । তবে আপনার পদক্ষেপগুলি এবং সেই সাথে যে উত্তরটি বর্তমানে আপনার উত্তর থেকে অনুপস্থিত তা মুদ্রণ করার কথাও ..
কেভিন ক্রুইজসেন

পুনঃটুইট এটা বিরক্তিকর .. আমি এখন এটি ঠিক করার চেষ্টা করব।
শান ওয়াইল্ড

বিটিডব্লিউ, আপনি আপনার বর্তমান উত্তরটি কিছুটা গল্ফ করতে পারেন। m==0হতে পারে m<1, এবং Integer.parseIntহতে পারে Integer.decode
কেভিন ক্রুজসেন

আমি জাভা বেশি ব্যবহার করি না, তবে jশেষে কি আপনার এই ভেরি দরকার ? (r+"")দু'বার ইনলাইন করা দেখে মনে হচ্ছে এটি কয়েক বাইট শেভ করবে।
দুধ

1
আমরা কি ভবিষ্যতে আমার পোস্টগুলি পরিবর্তন করতে পারি না? আপনি যদি কোনও সম্পাদনার পরামর্শ দিতে চান তবে মন্তব্যগুলিতে এটি করুন।
শন ওয়াইল্ড

3

জেলি , 17 বাইট

+×⁵?µDSP⁵?$ÐĿµL;Ṫ

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

যুক্তি দেওয়া যেমন x y 1, এটি আনস্তাসিয়ার যোগফলকে গণনা করে x (+) y

যুক্তি দেওয়া যেমন x y 0, এটি আনাস্তাসিয়া পণ্যটি গণনা করে x (*) y

আউটপুট হিসাবে দেওয়া হয় [number of steps, result]


উত্তরের জন্য ধন্যবাদ, তবে আপনার প্রোগ্রামের আউটপুটে প্রয়োজনীয় পদক্ষেপের সংখ্যাটি নেই? আমি কি এখানে কিছু মিস করছি?
আনাস্তাসিয়া-রোমানোভা 秀

3

পাইথন, 160 146 129 বাইট

def r(s):
 n=str(eval(s));c=0
 while n[1:]:exec("n=str(reduce(lambda a,b:a%sb,map(int,list(n))))"%"*+"["+"in s]);c+=1
 return n,c

শিগগিরই একটি পোস্ট পোস্ট করবে।

ইনপুট ফর্মটিতে 12+12বা 5*35(সাধারণ +এবং *চিহ্ন সহ) রয়েছে এবং ধরে নেওয়া হয় যে কেবলমাত্র দুটি অপারেটর।

এটি আপনার কম্পিউটারের মেমরির যতটা বড় সংখ্যার ইনপুটগুলি পরিচালনা করতে পারে।

আমি প্রায় নিশ্চিতভাবেই আত্মবিশ্বাসী যে এটি আরও হতে পারে।

সম্পাদনা করুন: 16 31 বাইটস সংরক্ষণ করেছেন @ কপারকে ধন্যবাদ।


উত্তরের জন্য ধন্যবাদ, (+1)। এটি কি বিশাল সংখ্যক ইনপুট পরিচালনা করতে পারে?
আনাস্তাসিয়া-রোমানোভা 秀

@ আনাস্তাসিয়া-রোমানোভা 秀 উম্ম্ম্ম ... আমি তাদের পক্ষে যথেষ্ট নিশ্চিত। আপনি কি আমাকে বড় ইনপুট উদাহরণ দিতে পারেন? আমি তাদের থেকে চেষ্টা করব এবং গণনা করব।
ক্লিস্টিক

হতে পারে: 3218753647208435810122106 * 29349566754?
আনাস্তাসিয়া-রোমানোভা 秀

1
@ আনাস্তাসিয়া-রোমানোভা 秀 হ্যাঁ, এটি ~ 0.5 সেকেন্ডে কাজ করেছে, সঠিকভাবে সময় দেয়নি।
ক্লিস্টিক

আপনি এতে পরিবর্তন "+" if "+" in s else "*"করতে পারেন "*+"["+"in s]এবং তারপরে এটিকে বরাদ্দ করার পরিবর্তে tকেবলমাত্র execকলটিতে এটি ইনলাইন যুক্ত করুন ।
তামা

3

আর, 110 বাইট

@ প্ল্যানাপাসের স্প্লিটার ব্যবহার করে।

function(A,F,B){r=Reduce;x=r(F,A,B);y=1;while(x>9){m=nchar(x);x=r(F,x%%10^(1:m)%/%10^(1:m-1));y=y+1};cat(x,y)}

f=function(A,F,B){
  r=Reduce                                  # Shortcut for Reduce
  x=r(F,A,B)                                # A operator B
  y=1                                       # Initiate counter
  while(x>9)                                # If number of digits > 2, or number > 9
  {m=nchar(x)                               # Count number of digits
    x=r(F,x%%10^(1:m)%/%10^(1:m-1))         # @plannapus's splitter, then feed into the A operator B operator C, etc while condition true
    y=y+1}                                  # Increment counter
  cat(x,y)}                                 # Print

আউটপুট

> f(136,"*",2356)
0 2
> f(31,"+",81)
4 2
> f(2,"+",3)
5 1
> (function(A,F,B){r=Reduce;x=r(F,A,B);y=1;while(x>9){m=nchar(x);x=r(F,x%%10^(1:m)%/%10^(1:m-1));y=y+1};cat(x,y)})(21,"*",111)
8 3

সম্পাদনা: আমি গণনা করতে পারি না।


আর চমত্কার কারণ কারণ আমাদের এটির কার্যকারিতা সংক্ষিপ্ত করার অনুমতি দেয়, যা গল্ফের জন্য মূল্যবান। (+1)
আনস্তাসিয়া-রোমানোভা 秀

3

ক্লোজার 126 বাইট

(defn f [o a b] (loop [n (o a b) c 1] (if (< n 10) [n c] (recur (reduce #(o %1 %2) (map #(- (int %) 48) (str n))) (inc c)))))

ফাংশনটিকে এভাবে বলা হয়:

(f + 81 31)

এখানে কোডটি নিখরচায় দেওয়া হয়েছে:

(defn f [o a b]
  (loop [n (o a b) c 1]
    (if (< n 10)
      [n c]
      (recur (reduce #(o %1 %2)
                     (map #(- (int %) 48) (str n)))
             (inc c)))))

(def test-cases [[+ 81 31]
                 [+ 351 14568]
                 [* 21 111]
                 [* 136 2356]])

(map #(apply f %) test-cases)
;;=> ([4 2] [6 3] [8 3] [0 2])

মনে রাখবেন যে ক্লোজুরে এখনও আমার কাছে নতুন, তাই সম্ভবত এটি সেরা সমাধান নয়। চ্যালেঞ্জটি মজাদার ছিল একই রকম। অতিরিক্তভাবে, কোডটি কোনও অসুবিধা ছাড়াই খুব বড় সংখ্যা নিয়ে চলেছিল।


এটি খুব দেরি হয়ে গেছে তবে আপনি সেখানে থাকা বেশিরভাগ স্পেস হ্রাস করতে পারবেন।
ক্লিশিক

2

পার্ল 6 53 বাইট

{$/=(&^b($^a,$^c),{[[&b]] .comb}...10>*);$/[*-1],+$/}

যেহেতু ( 12, &[+], 123 )ইনপুটটির জন্য গ্রহণযোগ্য, তাই আমি এটি 53 বাইটে নামিয়ে আনতে পারি।
( &[+]সংক্ষিপ্ত &infix:<+>যার জন্য সংখ্যার ইনফিক্স সংযোজন অপারেটরের প্রতি "শ্রদ্ধা")

দ্বিতীয় আর্গুমেন্টটির যদি স্ট্রিং (+)হতে হয় তবে এটি 87 বাইট হবে

{my&b=::("&infix:<$^b.substr(1,1)>");$/=(b($^a,$^c),{[[&b]] .comb}...10>*);$/[*-1],+$/}

ব্যাখ্যা:

# bare block lambda with 3 parameters declared using placeholder syntax
{
  # store list into 「$/」
  # ( used 「$/」 so that I don't have to declare a variable )
  $/ = (

    # declare second placeholder parameter, and call it
    &^b(
      # with the first and third placeholder parameters
      $^a, $^c
    ),

    # bare block lambda with implicit parameter 「$_」
    {
      # list reduce using the second parameter from outer block
      [[&b]]

      # a list of the digits of 「$_」 (implicit method call)
      .comb
    }

    # keep doing that until
    ...

    # it produces something smaller than 10
    # ( Whatever lambda )
    10 > *
  );

  # returns

  # final result ( last value from list )
  $/[ * - 1 ],
  # and count of values in list
  +$/
}

টেস্ট:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &anastasiya-math = {$/=(&^b($^a,$^c),{[[&b]] .comb}...10>*);$/[*-1],+$/}

my @test = (
  (  81, &[+], 31    ) => (4, 2),
  ( 351, &[+], 14568 ) => (6, 3),
  (  21, &[*], 111   ) => (8, 3),
  ( 136, &[*], 2356  ) => (0, 2),
);

plan +@test;

for @test -> $_ ( :key(@input), :value(@expected) ) {
  cmp-ok anastasiya-math(|@input), &[»==«], @expected;
}

সাধারণ ব্যবহার:

# override built-in Bag operator 「(+)」 in current lexical scope
my &infix:<(+)> = &anastasiya-math.assuming: *, &[+], *;

# add a new operator
my &infix:<(*)> = &anastasiya-math.assuming: *, &[*], *;

say 12 (+) 123; # (9 2)
say 12 (*) 123; # (6 5)

2

পাইথন 2, 107 97 বাইট

g=lambda x,o,i=1:x<10and[x,i]or g(eval(o.join(`x`)),o,i+1)
lambda a,o,b:g(eval('%s'*3%(a,o,b)),o)

একটি অনামী ফাংশন যা প্রথম অপারেন্ড a, অপারেটর o( '+'বা '*') এবং দ্বিতীয় অপারেন্ডের যুক্তির মাধ্যমে ইনপুট নেয় bএবং ফর্মের একটি তালিকা ফেরত দেয় [result, steps]

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

বেনামে ফাংশন তাদের মধ্যে অপারেটরের সাথে অপারেন্ডগুলিকে একত্রে যুক্ত করে একটি স্ট্রিং তৈরি করে এবং তারপরে এটি মূল্যায়ন করে; এটি প্রশ্নে বর্ণিত প্রথম পদক্ষেপ। তারপরে, এই মানটি এবং অপারেটরটি পুনরাবৃত্তির ফাংশনে পাঠানো হয় g। এখানে, একটি কাউন্টার i, যা প্রতিটি পুনরাবৃত্তি কলের জন্য বাড়ানো হয়, ব্যবহৃত হয়। যদি ইনপুট এর চেয়ে কম হয় তবে 10একটি একক অঙ্ক অবশ্যই পৌঁছে গেছে, সুতরাং এটি এবং iফিরে আসবে। যদি তা না হয় তবে ইনপুটটি একটি স্ট্রিতে রূপান্তরিত হয় এবং এই স্ট্রিংয়ের প্রতিটি অক্ষর অপারেটরের সাথে যুক্ত হয়ে কাঙ্ক্ষিত গণনা দেয়, যা পরে মূল্যায়ন করা হয় এবং পুনরাবৃত্তভাবে ফাংশনে প্রেরণ করা হয়।

আইডিয়নে চেষ্টা করে দেখুন


(+1) ব্যাখ্যার অপেক্ষার সময় :)
আনাস্তাসিয়া-রোমানোভা 秀

2

গ্রোভি, ১০২ বাইট

def p,e,r;p={t,m,d->e=d*.toInteger();r=m<1?e.sum():e.inject{a,b->a*b};r>9?p(++t,m,""+r as List):[r,t]}

Degolfed

def p,e,r
p = { t, m, d ->
    e = d*.toInteger()
    r = (
            m<1
                ? e.sum()
                : e.inject { a, b -> a * b }
        )
    r > 9
        ? p(++t, m, "" + r as List)
        : [r,t]
}

ব্যাখ্যা

জাভা জন্য @ শিয়ান বিন এর দুর্দান্ত সমাধানের ভিত্তিতে।

  • p: ক্লোজার (ফাংশন, ল্যাম্বদা, যাই হোক না কেন) যা সমাধানটি কার্যকর করে
  • t: বর্তমান কল গভীরতা (পুনরাবৃত্তির সংখ্যা), pসর্বদা সাথে ডাকা উচিতt=1
  • m: 0"যোগ" 1জন্য, "গুণ"
  • d: অপারেন্ডগুলির তালিকা, প্রতিটি অপারেন্ড একটি স্ট্রিং অবজেক্ট
  • e: এর উপাদানসমূহ d, প্রত্যেকে একটি পূর্ণসংখ্যায় রূপান্তরিত হয়
  • r: eক্রমের উপর নির্ভর করে এর যোগফল বা পণ্যm
  • ফলাফল বিবৃতি, দিয়ে শুরু r > 9:
    • যদি মাল্টি-ডিজিট ( r > 9), পুনরায় প্রত্যাহার করা হয়, গভীরতা বাড়ানো হয় tএবং rঅঙ্কের স্ট্রিংগুলির তালিকায় রূপান্তর করা হয় (এবং ফলাফলের ফলাফল)।
    • যদি একক-সংখ্যা হয়, ফিরে আসুন rএবং tতালিকা হিসাবে।

পরীক্ষা প্রোগ্রাম

final ADD = 0
final MULTIPLY = 1
println p(1, ADD, ["12", "123"]) //9, 2
println p(1, MULTIPLY, ["12", "123"]) //6, 5
println p(1, ADD, ["2", "3"]) //5, 1

ফলাফল

[9, 2]
[6, 5]
[5, 1]

2

হাস্কেল, 76 70 বাইট

 (x#y)f=until(<[10])(\[s,i]->[foldr(f.read.pure)0$show s,i+1])[f x y,1]

ফলাফল এবং পদক্ষেপের সংখ্যা সহ একটি দুটি উপাদান তালিকা ফেরত দেয়। নির্বিচারে সংখ্যক জন্য কাজ করে। ব্যবহারের উদাহরণ: (351#14568)(+)-> [6,3]

সম্পাদনা: 6 বাইটের জন্য ব্ল্যাকক্যাপকে ধন্যবাদ


আপনি প্রতিস্থাপন করতে পারেন (-48+).fromEnumসঙ্গেread.pure
BlackCap

2

আর, 91 বাইট

@ ভ্লো এর কোড ব্যবহার করে যা @ প্লানাপাসের স্প্লিটটার ব্যবহার করে এবং @ ফ্রেডেরিকের উত্তর গল্ফ করার সময় আমি কিছু ধারণা তৈরি করেছি, এটি এখনও সংক্ষিপ্ত আর উত্তর। (আজ এখানে এখানে একটি অস্বাভাবিক সংখ্যক আর উত্তর ...)

function(A,F,B){x=F(A,B);while(x>9){m=nchar(x);x=F(x%%10^(1:m)%/%10^(1:m-1));T=T+1};c(x,T)}

গুরুতরভাবে, এর জন্য অপারেটরের ইনপুটটি sum(+) বা prod(*) এর জন্য হওয়া দরকার। চ্যালেঞ্জের নিয়মের অধীনে, এটি ঠিক আছে বলে মনে হচ্ছে।

ইন্ডেন্টেশন সহ:

function(A,F,B){
  x=F(A,B);
  while(x>9){
    m=nchar(x);
    x=F(x%%10^(1:m)%/%10^(1:m-1));
    T=T+1
  };
  c(x,T)
}

@ ভ্লো এর উত্তর থেকে প্রধান পার্থক্যগুলি হ'ল:

  1. ব্যবহারের পরিবর্তে Reduce, আমরা ইনপুট আর্গুমেন্টটি একটি ফাংশন হিসাবে নির্ভর করি এবং কেবল এটি স্পষ্টভাবে কল করি। (প্রথম শ্রেণীর অবজেক্ট থাকার জন্য হ্যাঁ!)
  2. আমাদের কাউন্টার হিসাবে নতুন ভেরিয়েবলকে আরম্ভ করার পরিবর্তে আমরা আর-এর বিল্টিনগুলি এবং ব্যবহারের অপব্যবহার করি Tযা এটি TRUE(ওরফে 1) এর মূল্যায়ন করে তবে এটি কোনও সংরক্ষিত পরিবর্তনশীল নয় বলে আমরা এটি পরিবর্তন করতে পারি। এভাবে T+Tহয় 2। সুতরাং আমরা আমাদের কাউন্টার হিসাবে এটি ব্যবহার।
  3. catআউটপুটটি ইনগ করার পরিবর্তে , আমরা কেবল এটির সাথে ভেক্টর হিসাবে ফিরিয়ে দেব c। পাশাপাশি দুটি বাইট সংরক্ষণ করার পরেও যে আউটপুটটি ভেক্টরে বাধ্য করা Tহয় তা নিশ্চিত করে যে এটি শ্রেণীর numeric। যদি আমরা ব্যবহার করি cat, এবং Tবাড়ানো হয় না, তবে আমরা ভ্রান্ত আউটপুট পছন্দ করি 1 TRUE

আপনি পুনর্বিন্যাস করতে whileনিম্নরূপ লুপ পরিবর্তন Fএড়ানোর নাম দ্বন্দ্ব অন্য কিছু হতে হবে: function(A,O,B){x=O(A,B);while({F=F+1;x>9})x=O(x%/%10^(1:nchar(x)-1)%%10;c(x,F)}}। বিস্ময়কর যে আমরা গত কয়েক বছরে কতগুলি গল্ফিং কৌশল নিয়ে এসেছি :)
জিউসেপ

@ জিউজ্পে সুন্দর পুনর্গঠন! আমি এই মুহুর্তে মেটা sensক্যমত্যটি খুঁজে পাচ্ছি না, তবে আমি দৃ confident়ভাবে আত্মবিশ্বাসী যে কোনও ফাংশনের মধ্যে থাকা Tএবং Fকাউন্টার ট্রিকটি ব্যবহার করা আসলে অবৈধ, কারণ এর অর্থ হ'ল ফাংশনটি কেবল একবার ডাকা যেতে পারে। সুতরাং এই উত্তরটি (এবং আমার বেশ কয়েকটি অন্যান্য!) অবৈধ, যদি না rm(T)শেষে থাকে। আমি সেই মেটা পোস্টটি সন্ধান করতে যাচ্ছি যাতে আমি নিশ্চিত হতে পারি যে আমি কেবল এটি স্বপ্ন দেখিনি।
rturnbull

আমি বিশ্বাস করি যে Tএবং Fকৌতুক দীর্ঘ পরিবর্তন করবেন না যত পুরোপুরি বৈধ Tবা Fবৈশ্বিক পরিবেশে। উদাহরণস্বরূপ, f=function(){T=T+1;T}ধারাবাহিকভাবে ফিরে আসে 2। আমি মনে করি এই মেটা পোস্টে যা কাছে পাঠাতে হয়।
জিউসেপ

@ জিউস্পেপ হ্যাঁ, আপনি উভয়ই গুণে রয়েছেন। ধন্যবাদ!
rturnbull

1

রুবি, 55 বাইট

পুনরাবৃত্তি কল। @ এডসি 65 এর জাভাস্ক্রিপ্ট উত্তরের থেকে খুব আলাদা ব্যবহার করা হয়েছিল তবে আমি আশাবাদী যেহেতু এটি শেষ পর্যন্ত তাদের উত্তর থেকে প্রায় স্বতন্ত্রভাবে বিকাশিত একটি সরাসরি বন্দর হয়ে উঠল, অপারেটরগুলির তালিকার দৈর্ঘ্যের পরিবর্তে বিস্মৃত ফলাফলটি পরীক্ষা করে জড়িত একটি চূড়ান্ত অপ্টিমাইজেশন , যা আমাকে তাদের বাইট গণনা ছাড়িয়ে যাওয়ার অনুমতি দেয়।

ইনপুটটি একটি অপারেটর প্রতিনিধিত্ব করে এমন একটি স্ট্রিং এবং অপেরাগুলি সমন্বিত একটি অ্যারে।

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

f=->o,x,i=1{y=eval x*o;y>9?f[o,y.to_s.chars,i+1]:[y,i]}

ফলাফলটি সঠিক, তবে একক অঙ্কের মান পেতে প্রয়োজনীয় পদক্ষেপের সংখ্যাটি ভুল। আপনি কি আপনার কোডটি সংশোধন করতে পারবেন?
আনাস্তাসিয়া-রোমানোভা 秀

@ আনস্তাসিয়া-রোমানোভা h আহ, আপনি ঠিক বলেছেন। আমার পুরানো যুক্তিটির এটি থেকে শুরু হওয়া দরকার i=0এবং পুনরায় সংশোধন করার সময় আমি বাছাই করেছি।
মূল্য কালি

1

পার্ল, 38 বাইট

জন্য +2 অন্তর্ভুক্ত -ap

এসটিডিআইএন এবং অপারেটরের চারপাশের স্পেসগুলিতে ইনপুট দিয়ে চালান:

amath.pl <<< "12 + 123"
amath.pl <<< "12 * 123"

আউটপুটটি অঙ্ক এবং ধাপগুলি দ্বারা পৃথক করা হয় +A

amath.pl:

#!/usr/bin/perl -ap
1while++$\,$_=eval."+A",s/\B/$F[1]/g

যদি অ্যানারিতে পদক্ষেপগুলি আউটপুট করা ঠিক হয় তবে এই 35 বাইট সংস্করণটি আরও ভাল কাজ করে:

#!/usr/bin/perl -lap
1while$\.=1,$_=eval,s/\B/$F[1]/g

1

গণিত, 105 94 বাইট

কোড।

{x,y}=(c=0;f//.a_:>(c++;t=o@@IntegerDigits@a);{t,c})&/.{{f->#1+#2,o->Plus},{f->#1#2,o->Times}}

ব্যবহারের।

x[81, 31]
(* {4, 2} *)

x[351, 14568]
(* {6, 3} *)

y[21, 111]
(* {8, 3} *)

y[136, 2356]
(* {0, 2} *)

ব্যাখ্যা।

দুটি ফাংশন x(জন্য (+)) এবং y(এর জন্য (*)) প্যারামিটারগুলি প্রতিস্থাপন করে fএবং একই সময়ে তৈরি করা oহয়

(c = 0;
 f //. a_ :> (c++; t = o@@ IntegerDigits@a);
 {t, c}
)&

তাদের উপযুক্ত মান সহ। জন্য x, fহয়ে #1 + #2এবং oহয়ে Plus; জন্য y, তারা যথাক্রমে পরিণত #1 #2এবং Timesxব্যাখ্যার শেষ অংশটির জন্য ফাংশনটি পুনরায় লেখা :

x = (
  c = 0;
  #1 + #2 //. a_ :> (c++; t = Plus@@IntegerDigits@a); 
  {t, c}
) &;

(* The symbol //. stands for ReplaceRepeated. 
   The rule a_ :> (c++; t = Plus@@IntegerDigits@a) is applied until the result no longer 
changed. Specifically, the rule increments the counter of 1 at each step (this is c++), 
then takes the sum of the digits of the previous result (this is Plus@@IntegerDigits@a). 
The rule stops to apply when the variable t is less than 10. We return the final result and 
the number of steps with {t, c}. *)

1

জাভা 7, 203 195 192 বাইট

int c=1;String c(long a,long b,int o){return p(((o<1?a+b:a*b)+"",o)+","+c;}long p(String n,int o){long x=o,q;for(String s:n.split("")){q=new Long(s);x=o<1?x+q:x*q}c++;return x<10?x:p(x+"",o);}

এটি ব্যবহার করে long(সর্বোচ্চ মূল্য 2 63 -1)। intপরিবর্তে এটি ব্যবহার করা হলে (সর্বোচ্চ মান ২১ -১১-এর) এটি কেবলমাত্র 1 বাইট কম ( 191 বাইট ) হবে:

int c=1;String c(int a,int b,int o){return p(((o<1?a+b:a*b)+"",o)+","+c;}int p(String n,int o){int x=o,q;for(String s:n.split("")){q=new Integer(s);x=o<1?x+q:x*q}c++;return x<10?x:p(x+"",o);}

এটি সম্ভবত আরও কিছুটা গল্ফ করা যেতে পারে। পদক্ষেপগুলি মুদ্রণের পাশাপাশি উভয় অপারেটরের জন্য উত্তর কিছু বাইট নেয় যদিও ..
0 (for (+)) এবং 1 (for (*)) ব্যবহার করে।

অবরুদ্ধ এবং পরীক্ষার কোড:

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

class Main{
  static int c = 1;
  static String c(long a, long b, int o){
    return p((o < 1 ? a+b : a*b) + "", o) + "," + c;
  }

  static long p(String n, int o){
    long x = o,
         q;
    for(String s : n.split("")){
      q = new Long(s);
      x = o < 1
           ? x + q
           : x * q;
    }
    c++;
    return x < 10
            ? x
            : p(x+"", o);
  }

  public static void main(String[] a){
    System.out.println(c(81, 31, true));
    c = 1;
    System.out.println(c(351, 14568, true));
    c = 1;
    System.out.println(c(21, 111, false));
    c = 1;
    System.out.println(c(136, 2356, false));
  }
}

আউটপুট:

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