পিরামিডে গণনা করা


17

আপনার এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা ইনপুট এবং আউটপুট হিসাবে স্বতন্ত্র পূর্ণসংখ্যার একটি তালিকা গ্রহণ করে বা নিম্নলিখিত আপসাইড ডাউন পিরামিডের ইনপুট সংখ্যার সংখ্যার সংখ্যা প্রদান করে।

প্রতিটি পদক্ষেপে আসল তালিকা থেকে শুরু করে আমরা সংযুক্ত সংখ্যার প্রতিটি জোড়ার সর্বাধিক মান (যেমন, 5 1 2 6হয়ে ওঠে 5 2 6) সহ একটি নতুন তৈরি করি । তালিকায় কেবলমাত্র একটি নম্বর থাকলে আমরা থামি।

জন্য পূর্ণ পিরামিড 5 1 2 6হয়

5 1 2 6
 5 2 6 
  5 6  
   6   

সংঘটনগুলির ফলাফলগুলি হ'ল 3 1 2 4( 5 1 2 6যথাক্রমে)।

ইনপুট

  • কোনও পুনরাবৃত্তি না করে এক বা একাধিক পূর্ণসংখ্যার একটি তালিকা। (যেমন 1 5 1 6অবৈধ)

আউটপুট

  • ধনাত্মক পূর্ণসংখ্যার একটি তালিকা। iতালিকার তম উপাদান ঘটনার সংখ্যা iপিরামিড তম ইনপুট সংখ্যা।

উদাহরণ

ইনপুট => আউটপুট

-5 => 1

8 4 => 2 1

5 9 7 => 1 4 1

1 2 3 9 8 6 7 => 1 2 3 16 3 1 2

6 4 2 1 3 5 => 6 4 2 1 3 5

5 2 9 1 6 0 => 2 1 12 1 4 1

120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9

68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12

এটি কোড-গল্ফ তাই সংক্ষিপ্ত এন্ট্রি জিততে পারে।

বোনাস ধাঁধা: আপনি কি O(n*log n)সময় মতো সমস্যার সমাধান করতে পারবেন ?


কোনও ফাংশন জমা দেওয়ার জন্য, আমি কি সেগুলি মুদ্রণ করতে পারি বা কেবল আউটপুট আউট করব?
অপ্টিমাইজার

উত্তর:


4

পাইথ, 19 17 বাইট

m/smmeSb.:QhkUQdQ

পরীক্ষা করে দেখুন অনলাইন বিক্ষোভের অথবা সম্পূর্ণ টেস্ট সুইট (প্রথম 4 বাইট উদাহরণ পুনরুক্তি উপর)।

এই একটি নিষ্পাপ পদ্ধতির চেয়ে একটু বেশি চালাক। ত্রিভুজের প্রতিটি সংখ্যা একটি সংযুক্ত সাবসেটের সর্বাধিক মান হিসাবে উপস্থাপিত হতে পারে Q। প্রথম লাইনে এটি দৈর্ঘ্যের 1 উপগ্রহগুলি ব্যবহার করে, ত্রিভুজের দ্বিতীয় লাইন 2 দৈর্ঘ্যের উপসর্গগুলি ব্যবহার করে ...

ব্যাখ্যা

m/smmeSb.:QhkUQdQ    implicit: Q = input()
   m         UQ         map each k in [0, 1, 2, ..., len(Q)-1] to:
        .:Qhk              all subsets of Q of length (k + 1)
    meSb                   mapped to their maximum
  s                     join these lists together
m               Q    map each d of Q to:
 /             d        its count in the computed list

এটিকে কিছুটা দেখার জন্য। m.:QhdUQএবং ইনপুট [5, 1, 2, 6]আমাকে সমস্ত সম্ভাব্য সাবসেট দেয়:

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

এবং mmeSk.:QhdUQআমাকে তাদের প্রতিটি ম্যাক্সিমা দেয় (যা পিরামিডের সারিগুলির সাথে সামঞ্জস্যপূর্ণ):

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

পাইথ, 23 22 বাইট

|u&aYGmeSd.:G2QQm/sYdQ

এটি কেবল সহজ "পদ্ধতির মাধ্যমে আপনি যা বলছেন তা করুন" approach

পরীক্ষা করে দেখুন অনলাইন বিক্ষোভের বা সম্পূর্ণ টেস্ট সুইট (প্রথম 4 বাইট উদাহরণ পুনরুক্তি উপর)।

ব্যাখ্যা

meSd.:G2[(G[0], G[1]), (G[1], G[2]), ...]সর্বাধিক উপাদান প্রতিটি জোড় মানচিত্র ।

Yএকটি খালি তালিকা তাই হয়, aYGappends Gকরতে Y

u...QQবারবার এই দুটি ফাংশন প্রয়োগ করা হয় ( len(Q)সময়) প্রতিটি রান পরে শুরু G = Qএবং আপডেট G

m/sYdQসমতল তালিকায় ইনপুট তালিকার প্রতিটি উপাদানকে তাদের গণনায় ম্যাপ করুন Y


আপনার 17 বাইট সংস্করণটি আমার মতো একই অ্যালগরিদম ব্যবহার করে, আমার ধারণা এখন এটিও নিষ্পাপ: পি
অনুকূলকরণকারী

13

পাইথন, 81

def f(L):
 if L:i=L.index(max(L));L=f(L[:i])+[~i*(i-len(L))]+f(L[i+1:])
 return L

একটি বিভাজন এবং বিজয়ী সমাধান। সর্বাধিক উপাদানটি Mপিরামিডের নীচে সমস্ত দিকে Mepুকে যায় এবং এটিকে দুটি এবং দুটি সাবপ্রাইমিডের একটি আয়তক্ষেত্রে বিভক্ত করে ।

* * * M * *
 * * M M *
  * M M M
   M M M
    M M
     M

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

ইনপুট ভেরিয়েবলটি Lফলাফল সংরক্ষণের জন্য পুনরায় ব্যবহার করা হয় যাতে খালি তালিকার খালি তালিকায় ম্যাপ করা হয়।

দ্রবণে রচনাগুলি পাইথনে শব্দযুক্ত। প্যাটার্ন-মিলের সাথে কিছু ভাষা নীচের সিউডোকোড প্রয়োগ করতে পারে?

def f(L):
 [] -> []
 A+[max(L)]+B -> f(A)+[(len(A)+1)*(len(B)+1)]+f(B)

আমি ম্যাথমেটিকার প্যাটার্ন ম্যাচিংয়ের সাথে একটি বাইট সংক্ষিপ্ত করতে পারি, তবে এটি বিদ্যমান ম্যাথমেটিক f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
জমাতেও

6

সিজেম, 23 22 বাইট

এখনও গল্ফিং বিকল্প খুঁজছেন।

{]_,{)W$ew::e>~}%fe=~}

এটি একটি সিজেএম ফাংশন (সাজানো)। এটি স্ট্যাকের ইনপুট সংখ্যাগুলি প্রত্যাশা করে এবং স্ট্যাকের সাথেও সম্পর্কিত আউটপুট গণনা প্রদান করে। একটি উদাহরণ:

5 1 2 6 {]_,{)W$ew::e>~}%fe=~}~

পাতার

3 1 2 4

স্ট্যাক উপর

খুব নিশ্চিত যে এটি O(n log n)সময়ে নয়।

কোড সম্প্রসারণ :

]_                     e# Wrap the input numbers on stack in an array and take a copy
  ,{          }%       e# Take length of the copy and run the loop from 0 to length - 1
    )W$                e# Increment the iterating index and copy the parsed input array
       ew              e# Get overlapping slices of iterating index + 1 size
         ::e>          e# Get maximum from each slice
             ~         e# Unwrap so that there can be finally only 1 level array
                fe=    e# For each of the original array, get the occurrence in this
                       e# final array created by the { ... }%
                   ~   e# Unwrap the count array and leave it on stack

এর উদাহরণ তৈরি করে কীভাবে এটি কাজ করে তা একবার দেখে নেওয়া যাক 5 1 2 6

দ্বিতীয় সারিতে, কারণ যথাক্রমে সর্বাধিক হয় 5 1 2 6becomes তৃতীয় সারিতে এটি হয়ে যায় কারণ যথাক্রমে সর্বোচ্চ because এটি যথাক্রমে সর্বোচ্চ হিসাবেও লেখা যেতে পারে written একইভাবে শেষ সারি জন্য, সর্বোচ্চ হয় ।5 2 65, 2 and 6[5 1], [1 2] and [2 6]5 65 and 6[5 2] and [2 6][5 1 2] and [1 2 6]6[5 1 2 6]

সুতরাং আমরা মূলত দৈর্ঘ্যের স্লাইস থেকে শুরু করে যথাযথ দৈর্ঘ্যের টুকরোগুলি তৈরি করি 1, যা মূলত আসল সংখ্যা, প্রতিটি অ্যারেতে আবৃত, অবশেষে Nশেষ সারির দৈর্ঘ্যের এক টুকরো যেখানে Nইনপুট পূর্ণসংখ্যার সংখ্যা।

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


3

গণিত, 72 বাইট

Last/@Tally[Join@@NestList[MapThread[Max,{Most@#,Rest@#}]&,#,Length@#]]&

3

পাইথন, 81

lambda L:[sum(x==max(L[i:j])for j in range(len(L)+1)for i in range(j))for x in L]

পিরামিডের প্রতিটি এন্ট্রি তার wardর্ধ্বমুখী শঙ্কুর উপরে সাবলিস্টের সর্বাধিক। সুতরাং, আমরা এই সমস্ত সাবলিস্টগুলি উত্পন্ন করি, অন্তরগুলির [i,j]সাথে সূচিযুক্ত 0 < i < j <= len(L)এবং প্রতিটি উপাদান সর্বাধিক হিসাবে প্রদর্শিত হয় কতবার তা গণনা করি।

সাবিনটার্ভালগুলি গণনার একটি ছোট উপায় সম্ভবত অক্ষরগুলি সংরক্ষণ করবে। জোড়গুলির একটি একক-সূচক প্যারামিট্রাইজেশন [i,j]একটি প্রশংসনীয় পন্থা হবে।


1

পিপ , 56 + 1 = 57 বাইট

সিজেএম ভুডোর সাথে বেশি প্রতিযোগিতা করছি না, আমি ভয় পাচ্ছি। দেখে মনে হচ্ছে আমার আরও ভাল অ্যালগরিদম দরকার। -sস্পেস-সীমাবদ্ধ আউটপুট পেতে পতাকা সহ চালান ।

l:gr:0*,#gg:0*g+1WrFir:{c:r@[a--a]c@($<l@c)}M1,#r++(gi)g

মতামত সহ উদগঠিত:

l:g                              l = input from cmdline args
r:0*,#g                          r = current row as a list of indices into l
g:0*g+1                          Repurpose g to store the frequencies
Wr                               Loop until r becomes empty
 Fir:{c:r@[a--a]c@($<l@c)}M1,#r  Redefine r (see below) and loop over each i in it
  ++(gi)                         Increment g[i]
g                                Output g

rনিম্নলিখিত সময়ের সাথে কাজের মাধ্যমে প্রতিটি সময় পুনঃনির্ধারণ :

{c:r@[a--a]c@($<l@c)}M1,#r
{                   }M1,#r       Map this function to each a from 1 to len(r) - 1:
 c:r@[a--a]                      c is a two-item list containing r[a] and r[a-1]
                l@c              The values of l at the indices contained in c
              $<                 Fold/less-than: true iff l[c[0]] < l[c[1]]
           c@(     )             Return c[0] if the former is greater, c[1] otherwise

1

এপিএল (24)

{+/⍵∘.={⍵≡⍬:⍵⋄⍵,∇2⌈/⍵}⍵}

এটি এমন একটি ফাংশন যা একটি তালিকা গ্রহণ করে;

      {+/⍵∘.={⍵≡⍬:⍵⋄⍵,∇2⌈/⍵}⍵}68 61 92 58 19 84 75 71 46 69 25 56 78 10 89
2 1 39 2 1 27 6 5 1 6 1 2 14 1 12

ব্যাখ্যা:

  • {... }⍵: নিম্নলিখিত ফাংশনটি ⍵ এ প্রয়োগ করুন:
    • ⍵≡⍬:⍵: যদি empty ফাঁকা থাকে তবে ফিরে ⍵ ⍵
    • 2⌈/⍵: পরবর্তী তালিকা তৈরি করুন
    • ⍵,∇: ফিরুন ⍵, পরবর্তী তালিকায় এই ফাংশনটি প্রয়োগের ফলাফলের পরে
  • ⍵∘.=: ফাংশনের ফলাফলের সাথে প্রতিটি উপাদানকে প্রতিটি উপাদানের সাথে তুলনা করুন
  • +/: সারিগুলির যোগফল (elements এ উপাদান উপস্থাপন করে)

1

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

l=length
f x=[l[b|b<-concat$take(l x)$iterate(zipWith max=<<tail)x,a==b]|a<-x]

ব্যবহার: f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]-> [2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]

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

zipWith max=<<tail   -- apply 'max' on neighbor elements of a list
iterate (...) x      -- repeatedly apply the above max-thing on the
                     -- input list and build a list of the intermediate
                     -- results
take (l x) ...       -- take the first n elements of the above list
                     -- where n is the length of the input list
concat               -- concatenate into a single list. Now we have
                     -- all elements of the pyramid in a single list.
[ [b|b<-...,a==b] | a<-x]
                     -- for all elements 'a' of the input list make a 
                     -- list of 'b's from the pyramid-list where a==b.
 l                   -- take the length of each of these lists    

1

জাভাস্ক্রিপ্ট, 109 বাইট

আমি মনে করি এটি সম্পর্কে একটি আকর্ষণীয় উপায় খুঁজে পেয়েছি তবে আমি বুঝতে পেরেছি কোডটি প্রতিযোগিতা করার পক্ষে অনেক দীর্ঘ was ওহ ভাল, কেউ যদি আরও গল্ফিংয়ের সম্ভাবনা দেখে তবে পোস্ট করুন।

f=s=>{t=[];for(i=-1;s.length>++i;){j=k=i;l=r=1;for(;s[--j]<s[i];l++);for(;s[++k]<s[i];r++);t[i]=l*r}return t}

আমি এখানে নিম্নলিখিত সূত্রটি ব্যবহার করছি:

আই = এর উপস্থিতি (তার বাম +1 এর চেয়ে কম ধারাবাহিক সংখ্যার পরিমাণ) * (আমি তার ডান + 1 এর চেয়ে ছোট ধারাবাহিক সংখ্যার পরিমাণ)

এইভাবে কোনওটিকে পুরো পিরামিড বা এর সাবসেটগুলি উত্পন্ন করার দরকার নেই। (এ কারণেই আমি প্রথমে ভেবেছিলাম এটি ও (এন) এ চলবে, তবে শক্ত ভাগ্য, আমাদের এখনও অভ্যন্তরীণ লুপগুলি দরকার))


1

ম্যাটল্যাব: (২66 খ)

  • কোডের সংশোধন করতে আরও বাইট খরচ হয়, আমি কীভাবে পরে এটি হ্রাস করতে পারি তা নিয়ে সংগ্রাম করব।
v=input('');h=numel(v);for i=1:h,f=(v(i)>v(1));l=(v(i)>v(h));for j=h-1:-1:i+1,l=(v(i)>v(j))*(1+l);end,if(i>1),l=l+(v(i)>v(i-1))*l;end;for j=2:i-1,f=(v(i)>v(j))*(1+f);end,if(i<h),f=f+(v(i)>v(i+1))*f;end;s=f+l+1;if(i<h&&i>1),s=s-((v(i)>v(i+1))*(v(i)>v(i-1)));end;s
end

ইনপুট

একটি ভেক্টর অবশ্যই ফর্মের হতে হবে [abcd ...]

  • উদাহরণ:

    [2 4 7 11 3]

আউটপুট

প্যাটার্ন ঘটনা।

s =

 1


s =

 2


s =

 3


s =

 8


s =

 1

ব্যাখ্যা:

যদি [abcd] একটি ইনপুট হয় প্রোগ্রামটি ফলাফল হিসাবে গিজে গণনা করে

g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (ক> সি)))

h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) ) = ... 'সরলিকৃত'

i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..

j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...


0

জে (49)

আমি মনে করি উন্নতির জন্য কিছু জায়গা আছে ...

[:+/~.="1 0[:;([:i.#)<@:(4 :'(}:>.}.)^:x y')"0 1]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.