সোমবার মিনি-গল্ফ # 4: জার্ভিস (পূর্ণসংখ্যার সিকোয়েন্সগুলির ঠিক আরও একটি বিস্তৃত সেট)


22

সোমবার মিনি-গল্ফ: সংক্ষিপ্ত প্রশ্নের একটি সিরিজ , পোস্ট করা (আশাবাদী!) প্রতি সোমবার।
(দুঃখিত আমি আবার দেরি করেছি; আমি গতকাল এবং আজকের মূলত আমার কম্পিউটার থেকে দূরে ছিলাম))

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

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও পূর্ণসংখ্যার এন গ্রহণ করে এবং বেস 10 পূর্ণসংখ্যার ক্রম আউটপুট দেয়, যেখানে প্রতিটি পরবর্তী পূর্ণসংখ্যা এইভাবে নির্ধারিত হয়:

  • 1 এ শুরু করুন।
  • পূর্বের পূর্ণসংখ্যার বেস 10 উপস্থাপনায় প্রতিটি ডিজিট ডি এর জন্য:

    • যদি ডি 0 হয় তবে বর্তমান সংখ্যায় একটি যুক্ত করুন।
    • অন্যথায়, বর্তমান সংখ্যাকে ডি দ্বারা গুণান

বিস্তারিত

  • আপনি ধরে নিতে পারেন 0 < এন <2 31
  • 10 এর চেয়ে কম সংখ্যক সংখ্যক না হওয়া পর্যন্ত আপনাকে প্রতিটি সংখ্যার ক্রমটি ইনপুট নম্বর দিয়ে শুরু করতে হবে।
  • আউটপুট একটি অ্যারে বা স্পেস, কমা, নিউলাইনস বা এগুলির সংমিশ্রণ দ্বারা পৃথক একটি স্ট্রিং হতে পারে।
  • একটি trailing স্থান এবং / অথবা সম্পর্কে newline অনুমতি নয়, তবে না একটি trailing কমা।
  • কোনও শীর্ষস্থানীয় জিরো হওয়া উচিত নয়।

উদাহরণ

উদাহরণ 1: 77

এই উদাহরণটি মোটামুটি সহজবোধ্য:

77 = 1*7*7 = 49
49 = 1*4*9 = 36
36 = 1*3*6 = 18
18 = 1*1*8 = 8

সুতরাং, সঠিক আউটপুট হয় 77 49 36 18 8

উদাহরণ 2: 90

আমাদের এখানে আছে:

90 = 1*9+1 = 10
10 = 1*1+1 = 2

সুতরাং আউটপুট হবে 90 10 2

উদাহরণ 3: 806

বাম থেকে ডান সমীকরণগুলি পড়ুন:

806 = 1*8+1*6 = 54 (((1*8)+1)*6)
 54 = 1*5*4   = 20
 20 = 1*2+1   = 3

আউটপুট হওয়া উচিত 806 54 20 3

টেস্ট-মামলা

প্রতিটি লাইনের প্রথম সংখ্যাটি হ'ল ইনপুট এবং সম্পূর্ণ লাইনটি প্রত্যাশিত আউটপুট।

77 49 36 18 8
90 10 2
249 72 14 4
806 54 20 3
1337 63 18 8
9999 6561 180 9
10000 5
8675309 45369 3240 25 10 2
9999999 4782969 217728 1568 240 9
1234567890 362881 2304 28 16 6

একটি রেফারেন্স হিসাবে, এখানে 10 থেকে 100 পর্যন্ত যথাযথ পরবর্তী পূর্ণসংখ্যা রয়েছে:

Current | Next
--------+-----
     10 |  2
     11 |  1
     12 |  2
     13 |  3
     14 |  4
     15 |  5
     16 |  6
     17 |  7
     18 |  8
     19 |  9
     20 |  3
     21 |  2
     22 |  4
     23 |  6
     24 |  8
     25 | 10
     26 | 12
     27 | 14
     28 | 16
     29 | 18
     30 |  4
     31 |  3
     32 |  6
     33 |  9
     34 | 12
     35 | 15
     36 | 18
     37 | 21
     38 | 24
     39 | 27
     40 |  5
     41 |  4
     42 |  8
     43 | 12
     44 | 16
     45 | 20
     46 | 24
     47 | 28
     48 | 32
     49 | 36
     50 |  6
     51 |  5
     52 | 10
     53 | 15
     54 | 20
     55 | 25
     56 | 30
     57 | 35
     58 | 40
     59 | 45
     60 |  7
     61 |  6
     62 | 12
     63 | 18
     64 | 24
     65 | 30
     66 | 36
     67 | 42
     68 | 48
     69 | 54
     70 |  8
     71 |  7
     72 | 14
     73 | 21
     74 | 28
     75 | 35
     76 | 42
     77 | 49
     78 | 56
     79 | 63
     80 |  9
     81 |  8
     82 | 16
     83 | 24
     84 | 32
     85 | 40
     86 | 48
     87 | 56
     88 | 64
     89 | 72
     90 | 10
     91 |  9
     92 | 18
     93 | 27
     94 | 36
     95 | 45
     96 | 54
     97 | 63
     98 | 72
     99 | 81
    100 |  3

আপনি এই তালিকাটি এখানে 10000 এ প্রসারিত খুঁজে পেতে পারেন ।

স্কোরিং

এটি , তাই বাইট জেতে সংক্ষিপ্ততম বৈধ কোড। টাইব্রেকার সাবমিশনে যায় যা তার চূড়ান্ত বাইট গণনাটি প্রথম পৌঁছেছিল। বিজয়ী আগামী সোমবার 19 অক্টোবর নির্বাচন করা হবে। শুভকামনা!

সম্পাদনা: আপনার বিজয়ীকে অভিনন্দন, @ আইস্যাক , আবার 14 টি বাইটের জন্য পাইথটি ব্যবহার করে !

উত্তর:


10

পাইথ, 15 14 বাইট

.uu|*GHhGjNT1Q

ডেনিসকে 1 বাইট ধন্যবাদ

পরীক্ষা স্যুট

এই চ্যালেঞ্জটি মনে হচ্ছে এটি পাইথের হ্রাস কার্যের জন্য তৈরি হয়েছিল। একটি ডিজিটের ওপরে হ্রাস করুন, মান পরিবর্তন হওয়া বন্ধ হওয়া পর্যন্ত একটি হ্রাস করুন এবং আমরা ভাল।


2
|*GHhGএকটি বাইট ওভার সাশ্রয় ?H*GHhG
ডেনিস

4

পাওয়ারশেল, 92 91 90 88 87 বাইট

($n=$args);while($n-gt9){$x=1;[char[]]"$n"|%{$x=if($y=$_-48){$x*$y}else{$x+1}};($n=$x)}

1
(...)স্বয়ংক্রিয় আউটপুটটি উত্তোলনের জন্য এটি বেশ চতুর ... ভবিষ্যতে আমার এটি মনে রাখা দরকার।
অ্যাডমবর্কবার্ক

3

পিপ , 28 25 23 বাইট

Tt>Pa{Y1FdaYy*d|y+1a:y}

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

ব্যাখ্যা:

                         a is cmdline arg; t is 10 (implicit)
Tt>Pa{                }  Loop till a<10, printing it each time the test is made:
      Y1                   Yank 1 into variable y
        Fda                For each digit d in a:
           Yy*d|y+1          If y*d is truthy (nonzero), yank it; otherwise, yank y+1
                   a:y     Assign value of y back to a

এখন আমি আনন্দিত যে আমি Pএকটি বিবৃতি থেকে অপারেটরের পরিবর্তে বেশ কয়েকটি সংশোধন করেছি। Paএটি একটি অভিব্যক্তি যা aএর মানকে মূল্যায়ণ করে তবে এটির ফলস্বরূপ হয়, তাই আমি প্রিন্ট করতে aএবং একই সাথে এটি ব্যবহার করে দশটি কম ব্যবহার করা যায় কিনা তা পরীক্ষা করতে পারি t>Pa


3

সিজেম, 26 25 24 22 বাইট

riA,{_pAb{_2$*@)?}*j}j

অথবা

ri{_pAb{_2$*@)?}*_9>}g

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

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

উভয় প্রোগ্রামই মূলত একই কাজ করে; প্রথমটি একটি পুনরাবৃত্তির পদ্ধতির, দ্বিতীয়টি পুনরাবৃত্ত একটি। আমি প্রথমটি ব্যাখ্যা করব, যা আমি আরও আকর্ষণীয় বলে বিবেচনা করি।

ri                     Read an integer from STDIN and push it on the stack.
  A,{               }j Initialize a memoized, recursive function j with the array
                       [0 ... 9] as "base cases". If j is called on an integer
                       below 10, it returns the element at that index of the base
                       cases (which is same integer) and does not execute the code
                       block. The base case array is filled with new values as j is
                       called again and again, but we do not use this feature.
     _p                Copy and print the integer on the stack.
       Ab              Convert it into its base-10 digits.
         {       }*    Fold; push the first digit, for each remaining digit:
          _2$*         Multiply copies of the accumulator and the current digit.
              @)       Increment the original accumulator.
                ?      Select the product if the digit is non-zero, else the sum.
                   j   Call j on the result.
                       If the result was less than 10, it is retrieved from the
                       base cases and pushed on the stack. CJam prints it before
                       exiting the program.

2

মিনকোলাং 0.7 , 52 46 বাইট

ndN((d25*%1R25*:)r11(x2~gd4&x1+!*I1-)dNd9`,?).

ওহু নেস্ট লুপ!

ব্যাখ্যা

ndN     Takes integer input and outputs it
(       Starts overall loop

 (        Starts loop that separates top of stack into digits
  d25*%   Modulus by 10
  1R      Rotates stack 1 unit to the right
  25*:    Divides by 10
 )

 r11   Reverses stack and pushes two 1s; 1 for the dump and 1 for the multiply
 (     Starts the multiply/add loop
  x    Dumps top value

      -This top-of-stack dump is because
       while loops end when the stack is
       empty or the top of stack is 0. The
       top of stack is *not* popped for
       this conditional check, so if the loop
       continues, I need to dump the left-over
       from the previous iteration.

  2~gd    Gets next-to-last stack value and duplicates for the conditional
  4&      Jumps 4 spaces if top of stack is positive
   x1+!   Dumps the 0 leftover, adds 1 to top of stack, and jumps the multiply
   *      Multiplies the top two elements of stack
  I1-     Pushes length of stack - 1
 )        Exits the loop if top of stack is 0 (i.e., len(stack)=1)
 dN       Outputs as integer
 d9`,?    Jumps out of the loop if top of stack <=9
)
.    Stop.


2

পাইথন 3, 74, 76 বাইট

হ্রাস সহ এখানে ইতিমধ্যে একটি পাইথন উত্তর ছিল, তাই আমি এটি না করেই একটি করতে চাই। এটি একটি int সঙ্গে কল করা উচিত।

def j(n,m=1):
 print(n)
 if n>9:
  for d in str(n):m=m*int(d)or m+1
  j(m)

2

পাইথন, 85 80 বাইট

def g(n):y=reduce(lambda i,x:i*int(x)or i+1,`n`,1);return[n]+(g(y)if n>9else[])

এটি এখন ঠিক প্রথম মানটির পরিবর্তে পুরো তালিকাটি সঠিকভাবে মুদ্রণ করে।


নামবিহীন ল্যাম্বদা ব্যবহার করে বাদ দিয়ে আপনি দুটি বাইট সংরক্ষণ করতে পারেন g=
অ্যালেক্স এ।

1

কে 5 , 24 বাইট

(1{(x*y;x+1)@~y}/.:'$:)\

নির্দিষ্ট পয়েন্টে পুনরাবৃত্তি করার সময় আইটেমগুলির একটি তালিকা সংগ্রহ করা স্ক্যান অপারেটর কী করবে তা অবিকল \। প্রতিটি পুনরাবৃত্তির উপরে আমি প্রথমে একটি স্ট্রিংয়ের জন্য নম্বরটি কাস্ট করি এবং তারপরে প্রতিটি অক্ষরকে ( .:'$:) মূল্যায়ন করে , সংখ্যাটিকে তার অঙ্কগুলিতে বিস্ফোরিত করে। তারপরে আমি /1 দিয়ে আর ল্যাম্বডা ব্যবহার করে একটি হ্রাস ( ) সম্পাদন করব {(x*y;x+1)@~y}। এই ক্ষেত্রে xহ্রাসকারী মান এবং yক্রমের প্রতিটি ক্রমাগত শব্দ।

কর্মে:

  f: (1{(x*y;x+1)@~y}/.:'$:)\

  f'77 90 249 806 1337 9999 10000 8685309 9999999 1234567890
(77 49 36 18 8
 90 10 2
 249 72 14 4
 806 54 20 3
 1337 63 18 8
 9999 6561 180 9
 10000 5
 8685309 51849 1440 17 7
 9999999 4782969 217728 1568 240 9
 1234567890 362881 2304 28 16 6)

1

জুলিয়া, 93 89 88 86 83 77 বাইট

f(n)=(println(n);if(d=n>9)for i=reverse(digits(n)) i<1?d+=1:d*=i end;f(d)end)

এটি একটি পুনরাবৃত্ত ফাংশন তৈরি করে fযা পৃথক লাইনে ক্রম উপাদানগুলি মুদ্রণ করে।

Ungolfed:

function f(n::Int)
    println(n)
    if (d = n > 9)
        for i in reverse(digits(n))
            i < 1 ? d += 1 : d *= i
        end
        f(d)
    end
end

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

ডেনিসকে 6 বাইট সংরক্ষণ করে!


এটি n>9দ্বিতীয় উদাহরণ মেনে চলতে হবে । এছাড়াও, f(n)=(println(n);if(d=n>9)for i=reverse(digits(n)) i<1?d+=1:d*=i end;f(d)end)কিছুটা খাটো হয়।
ডেনিস

@ ডেনিস দুর্দান্ত ধারণা, ধন্যবাদ!
অ্যালেক্স এ।

1

রুবি 83 , 72 বাইট

মূল হিসাবে একটি ফাংশন হিসাবে ঘোষণা:

def f(d)loop{p d;break if d<10;d=d.to_s.bytes.inject(1){|r,i|i>48?r*(i-48):r+1}}end

আমি ব্যবহার করার চেষ্টা করেছি Enumerator.newতবে এটি অনেকগুলি বাইট ব্যবহার করে :-(

পুনরাবৃত্তি ব্যবহার করে উন্নত :

def f(d)p d;f(d.to_s.bytes.inject(1){|r,i|i>48?r*(i-48):r+1})if d>10 end

0

সি # ও লিনিকিউ, 165 146 বাইট

void j(int a){r.Add(a);var l=a.ToString().Select(d=>int.Parse(d.ToString()));int n=1;foreach(int i in l)n=i==0?n+1:n*i;if(n>9)j(n);else r.Add(n);}

j (জার্ভিসের জন্য) পুনরাবৃত্তি ফাংশন। r ফলাফল ফলাফলের তালিকা।

লিনকপ্যাডে পরীক্ষিত:

void Main()
{
    j(806);
    r.Dump();
}
List<int> r = new List<int>();

void j(int a){r.Add(a);var l=a.ToString().Select(d=>int.Parse(d.ToString()));int n=1;foreach(int i in l)n=i==0?n+1:n*i;if(n>9)j(n);else r.Add(n);}

অপারেটরগুলির আশেপাশের স্পেসগুলি সরিয়ে আপনি কিছু বাইট সংরক্ষণ করতে পারেন, যেমন , ইত্যাদি int n = 1হতে পারেint n=1
অ্যালেক্স এ।

অ্যালেক্সা ভাল ক্যামেরা। 146 এ কমেছে
noisyass2

আপনি a.tostring () :) এর পরিবর্তে একটি "" "করেও কিছুটা সাশ্রয় করতে পারেন
অ্যালেক্স কার্লসেন

0

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

x!'0'=x+1
x!c=x*read[c]
g x|h>9=x:g h|1<2=[x,h]where h=foldl(!)1$show x

ব্যবহার: g 8675309-> [8675309,45369,3240,25,10,2]



0

জাভা 8, 148 বাইট

String f(int j){String s="";Function r=i->(""+i).chars().map(x->x-48).reduce(1,(x,y)->y>0?x*y:x+1);while((j=(int)r.apply(j))>9)s+=j+" ";return s+j;}

ফরম্যাট করা

String f(int j) {
    String s = "";
    Function r = i -> ("" + i).chars().map(x -> x - 48).reduce(1, (x, y) -> y>0 ? x*y : x+1);
    while ((j = (int)r.apply(j)) > 9) s += j+" ";
    return s+j;
}

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