হুক দৈর্ঘ্যের পণ্য


27

একটি ইয়ং ডায়াগ্রামটি বাম-ন্যায়সঙ্গত সারি এবং শীর্ষ-ন্যায়সঙ্গত কলামগুলিতে বাক্সগুলির একটি বিন্যাস। প্রতিটি বাক্সের জন্য, এটির উপরে এবং তার বামে সমস্ত স্থান দখল করা আছে।

XXXXX
XXX
XXX
X

হুক দৈর্ঘ্য একটি বক্স তার সারিতে তার ডানদিকে বাক্সে সংখ্যা, এবং এটি নিচে তার কলামে, এছাড়াও নিজেই একবার গণনা। উদাহরণস্বরূপ, দ্বিতীয় বাক্সটির হুক দৈর্ঘ্য 6:

X****
X*X
X*X
X

এখানে সমস্ত হুক দৈর্ঘ্য:

86521
532
421
1

আপনার লক্ষ্য হুক দৈর্ঘ্যের পণ্য এখানে গণনা করা হয় 8*6*5*2*1*5*3*2*4*2*1*1 = 115200

( আপনি কেন এই অভিব্যক্তিটি গুরুত্ব দেয় সে বিষয়ে আগ্রহী হলে হুক দৈর্ঘ্যের সূত্রটি সম্পর্কে পড়ুন ))

ইনপুট: মত নম্বর সারি-আকারের একটা সংগ্রহ [5,3,3,1]বা মত একটি পুনরাবৃত্তি ইউনারী প্রতীক হিসেবে [[1,1,1,1,1], [1,1,1], [1,1,1], [1]]বা "XXXXX XXX XXX X"। আপনি ইচ্ছানুযায়ী তালিকাটি আরোহণ বা উতরাইয়ের জন্য সাজানো আশা করতে পারেন। তালিকাটি খালি নয় এবং কেবল ধনাত্মক পূর্ণসংখ্যা থাকবে।

আউটপুট: হুক দৈর্ঘ্যের পণ্য, যা একটি ধনাত্মক পূর্ণসংখ্যা। পূর্ণসংখ্যা ওভারফ্লো বা রানটাইম সম্পর্কে চিন্তা করবেন না।

বিশেষত ইয়ং ডায়াগ্রাম বা পূর্ণসংখ্যার পার্টিশনগুলির সাথে বিল্ট-ইনদের ডিল করার অনুমতি নেই।

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

[1] 1
[2] 2
[1, 1] 2
[5] 120
[2, 1] 3
[5, 4, 3, 2, 1] 4465125
[5, 3, 3, 1] 115200
[10, 5] 798336000

উত্তর:


13

সিজেম, 20 19 বাইট

{ee::+W%}_q~%z%:+:*

এটি আরোহণের ক্রমে সিজেএম শৈলীর অবিচ্ছিন্ন তালিকায় নেয়। উদাহরণ স্বরূপ:

[[1] [1 1 1] [1 1 1] [1 1 1 1 1]]

দেয়

115200

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

এই সংস্করণটি ডেনিস সরবরাহ করেছেন এবং এটি সত্য যে Block ArrayList %সিজাম: ডিতে এখনও কাজ করে তা ব্যবহার করে

{       }_             e# Put this block on stack and make a copy
          q~           e# Read the input and evaluate it to put the array of arrays on stack
            %          e# Use the copy of the block and map the array using that block
 ee                    e# Here we are mapping over each unary array in the input. ee converts
                       e# the array to [index value] pair.
   ::+                 e# Add up each index value pair. Now we have the horizontal half of
                       e# hook length for each row
      W%               e# Reverse the array to make sure the count is for blocks to the right
             z%        e# Transpose and do the same mapping for columns
               :+      e# Now we have all the hook lengths. Flatten the array
                 :*    e# Get the product of all hook lengths.

এটি আসল 20 বাইট সংস্করণ

1q~:,Wf%z:ee{:+)*}f/

এটি একটি আরোহণের ক্রমে সারি-আকারের সিজ্যাম শৈলীর তালিকার তালিকা নেয়। উদাহরণ স্বরূপ:

[1 3 3 5]

দেয়

115200

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

আমরা যদি এটি দেখি, একটি ইয়ং ব্লক ডায়াগ্রামের প্রতিটি ব্লকের হুক দৈর্ঘ্য হ'ল তার সারি এবং কলামের সেই ব্লকের সূচকের যোগফল, পিছনের দিকে গণনা করা। অর্থাৎ ডান দিক থেকে প্রতিটি সারিতে সূচকটি শুরু করুন এবং নীচে থেকে প্রতিটি কলামে সূচি শুরু করুন।

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

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

1                       e# This serves as the initial term for product of hook lengths
 q~                     e# Read the input and eval it to put an array on stack
   :,                   e# For each row-size (N), get an array of [0..N-1]
     Wf%                e# Reverse each row so that each row becomes [N-1..0]
        z               e# Transpose for the calculation of blocks below each block
         :ee            e# Enumerate each row. Convert it into array of [index value] pairs
            {    }f/    e# Apply this mapping block to each cell of each row
             :+         e# Add the index value pair. Here, index is the blocks below the
                        e# block and value is the blocks to the right of it in the Young diag
               )        e# Increment the sum by 1 to account for the block itself
                *       e# Multiply it with the current holding product, starting with 1

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


{ee::+W%}_q~%z%:+:*(19 বাইট) ইনপুট ফর্ম্যাট:[[1][1 1 1][1 1 1][1 1 1 1 1]]
ডেনিস

@ ডেনিস নিস (আব) এর জন্য আরটি অর্ডার ব্যবহার করুন %: পি
অপ্টিমাইজার

6

জে, 24 বাইট

*/@,@(1|@-+/\."1++/\)@:>

25 বাইট (ব্যাখ্যা সহ):

*/@,@(+/\."1|@<:@++/\)@:>

উদাহরণের অনুরূপ আনারি ডিজিটের আরোহণের তালিকার তালিকা হিসাবে ইনপুট নেয় [[1], [1,1,1], [1,1,1], [1,1,1,1,1]]

ব্যবহার:

   f=.*/@,@(+/\."1|@<:@++/\)@:>

   f 1;1 1 1;1 1 1;1 1 1 1 1
115200

পদ্ধতি

  • ইনপুট থেকে বাইনারি ম্যাট্রিক্স তৈরি করুন
  • উভয় মাত্রায় চলমান পার্থক্য গণনা করুন।
  • প্রতিটি কক্ষের জন্য দুটি ফলাফল যুক্ত করুন, 1 টি বিয়োগ করুন, নিখুঁত মানটি নিন (মূলত শূন্য কোষের মানচিত্র 1 তে)
  • ম্যাট্রিক্সটি ফুটিয়ে তুলুন এবং সংখ্যার পণ্যটি নিন।

অন্তর্বর্তী ফলাফল ইনপুটতে দেখানো হয়েছে 1 1 1 1 1;1 1 1;1 1 1;1 (5,3,3,1 in unary)( এটি পূর্ববর্তী সংস্করণে অবতরণ দৈর্ঘ্যের সাথে তবে একই পদ্ধতি ব্যবহার করে ):

   ]c=.1 1 1 1 1;1 1 1;1 1 1;1
┌─────────┬─────┬─────┬─┐
│1 1 1 1 1│1 1 1│1 1 1│1│
└─────────┴─────┴─────┴─┘

   (>)  c
1 1 1 1 1
1 1 1 0 0
1 1 1 0 0
1 0 0 0 0

   (+/\.@:>)  c
4 3 3 1 1
3 2 2 0 0
2 1 1 0 0
1 0 0 0 0

   (+/\."1@:>)  c
5 4 3 2 1
3 2 1 0 0
3 2 1 0 0
1 0 0 0 0

   ((+/\."1++/\.)@:>)  c
9 7 6 3 2
6 4 3 0 0
5 3 2 0 0
2 0 0 0 0

   ((+/\."1<:@++/\.)@:>)  c
8  6  5  2  1
5  3  2 _1 _1
4  2  1 _1 _1
1 _1 _1 _1 _1

   ((+/\."1|@<:@++/\.)@:>)  c
8 6 5 2 1
5 3 2 1 1
4 2 1 1 1
1 1 1 1 1

   (,@(+/\."1|@<:@++/\.)@:>)  c
8 6 5 2 1 5 3 2 1 1 4 2 1 1 1 1 1 1 1 1

   (*/@,@(+/\."1|@<:@++/\.)@:>)  c
115200

একই দৈর্ঘ্য স্পষ্ট সংস্করণ:

3 :'*/,|<:(+/\."1++/\)>y'

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



4

পাইথ, 18 বাইট

*Fsm.e+k-bdf>TdQeQ

যেমন আরোহী ক্রমে ইনপুট নেয় [1, 3, 3, 5]

প্রদর্শন.


বিকল্প সমাধান, 19 বাইট

*Fs.em+s>Rd<Qk-bdbQ

3

পাইথন 2, 89 88 বাইট

p=j=-1;d={}
for n in input():j+=1;i=0;exec"a=d[i]=d.get(i,j);p*=n-i+j-a;i+=1;"*n
print-p

(একত্রিত করে একটি উন্মাদ বাইট সংরক্ষণের জন্য @ এক্সনোরকে ধন্যবাদ pএবং j)

d.getএকটু আমার কাছে সন্দেহজনক মনে, কিন্তু অন্যথায় আমি এই সাথে অপেক্ষাকৃত খুশি। আমি পুনরাবৃত্তি এবং জিপ করার মতো কিছু অন্যান্য পদ্ধতির চেষ্টা করেছি, তবে এই একমাত্র আমিই 100 এর নিচে যেতে পেরেছি।

STDIN থেকে আরোহী ক্রমের তালিকা হিসাবে ইনপুট নেয় [1, 3, 3, 5]


3

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

f[]=1
f g@(h:t)=(h+length t)*f[x-1|x<-g,x>1]
p[]=1
p g@(_:t)=f g*p t

ব্যবহারের উদাহরণ: p [5,4,3,2,1]->4465125

fবাম থেকে ডানে স্ক্যান করে নিজের কাছে পুনরাবৃত্ত কলের সাথে বহির্মুখী হুকের দৈর্ঘ্যকে গুণিত করে যেখানে ইনপুট তালিকার প্রতিটি উপাদান কমিয়ে আনা হয় 1(পৌঁছানোর সময় এটি ফেলে দেওয়া হয় 0)। পুচ্ছের সাথে পুরো তালিকাটিকে pগুণ করে উপরে থেকে নীচে স্ক্যান করে। fp


2

আর, 174 বাইট

সুতরাং ... এই সমাধানটি বেশ দীর্ঘ এবং সম্ভবত আরও গল্ফ হতে পারে। আমি এটা সম্পর্কে চিন্তা করব !

v=c();d=length;m=matrix(-1,l<-d(a<-scan()),M<-max(a));for(i in 1:l)m[i,(1:a[i])]=c(a[i]:1);for(j in 1:M)m[,j]=m[,j]+c((((p=d(which(m[,j]>0)))-1)):0,rep(0,(l-p)));abs(prod(m))

অসমাপ্ত:

v=c()          #Empty vector
d=length       #Alias

m=matrix(-1,l<-d(a<-scan()),M<-max(a)) #Builds a matrix full of `-1`

for(i in 1:l)
    m[i,(1:a[i])]=c(a[i]:1) #Replaces each row of the matrix by `n` to 1, `n` being the 
                            #corresponding input : each number is the number of non-empty
                            #cells at its left + itself

for(j in 1:M)
    m[,j]=m[,j]+c((((p=d(which(m[,j]>0)))-1)):0,rep(0,(l-p)))

    #This part calculates the number of "non-empty" (i.e. without `-1` in a column), -1,
    #because the count for the cell itself is already done.
    # Then, it creates a vector of those count, appending 0's at the end if necessary 
    #(this avoids recycling)

abs(prod(m)) #Outputs the absolute value of the product (because of the `-1`'s)

1

পাইথন 2, 135 128 বাইট

এটি স্টিডিন থেকে পাইথন ধরণের তালিকা নেয়:

r=input()
c=[-1]*r[0]
for a in r:
 for b in range(a):c[b]+=1
s=1
y=0
for a in r:
 for x in range(a):s*=a-x+c[x]-y
 y+=1
print s

এটি একটি খুব প্রচলিত বাস্তবায়ন, তবে আমি এখন পর্যন্ত খুব বেশি স্মার্ট কিছু নিয়ে আসিনি। আমার অনুভূতি আছে যে "আসল" প্রোগ্রামিং ভাষা এমনকি অনেক ছোট সমাধান হবে।

আমরা ইনপুট হিসাবে প্রতিটি সারিতে বাক্সের সংখ্যা পাই। এই সমাধানটি প্রথমে প্রতিটি কলামে থাকা বাক্সের সংখ্যা গণনা করে, যা এতে সঞ্চিত হয় c(এটি পরবর্তী গণনায় এর ব্যবহারকে সহজ করার জন্য এটি গণনা বিয়োগ 1 টি)) তারপরে এটি সমস্ত বাক্সে পুনরাবৃত্তি করে এবং হুক দৈর্ঘ্যকে বহুগুণ করে। হুক দৈর্ঘ্য নিজেই প্রতিটি সারি এবং কলামে বাক্সের গণনা পেলে গণনা করা তুচ্ছ।


1
দেখে মনে হচ্ছে আপনি ব্যবহার করছেন না m?
xnor

শপথ করতে পারতাম যে আমি এটি মুছে ফেলেছি! আমার মনে আছে যে আমি কেবল এটি একবার ব্যবহার করেছিলাম এবং একমাত্র ব্যবহারটি প্রতিস্থাপন করছি। তবে তখন অবশ্যই আমি ভেরিয়েবলটি মুছতে মিস করেছি। :(
রেটো কোরাাদি

1

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

আরোহী ক্রমে পূর্ণসংখ্যার অ্যারে গ্রহণ করা একটি ক্রিয়া taking

পরীক্ষার জন্য স্নিপেট চালান (কেবলমাত্র ফায়ারফক্স)

F=x=>x.map(r=>{for(i=-1;++i<r;p[i]=-~p[i])t*=r-i+~~p[i]},p=[],t=1)&&t

// TEST
out=x=>O.innerHTML += x + '\n';

test=[
 {y:[1], h: 1}
,{y:[2], h: 2}
,{y:[1, 1], h: 2}
,{y:[5], h: 120}
,{y:[2, 1], h: 3}
,{y:[5, 4, 3, 2, 1], h: 4465125}
,{y:[5, 3, 3, 1], h: 115200}
,{y:[10, 5], h: 798336000}
]

test.forEach(t=>{ 
  t.y.reverse(); // put in ascending order
  r=F(t.y);
  out((r==t.h? 'Ok':'Fail')+' Y: ['+t.y+'] Result:'+r+' Check:'+t.h)
})  
<pre id=O></pre>


1

পাইথন, 95 91 বাইট

এটি নিমির হাস্কেল উত্তরের পাইথন বাস্তবায়ন । গল্ফিং পরামর্শ স্বাগত জানাই।

f=lambda z:z==[]or(z[0]+len(z)-1)*f([i-1for i in z if~-i])
p=lambda z:z==[]or f(z)*p(z[1:])

পাইথন গল্ফিংয়ে স্বাগতম! আপনি যখন একটি তালিকা z and _ or 1হিসাবে ব্যবহার করতে পারেন, সত্যটি ব্যবহার করে । পাইথনের ফাংশন ঘোষণাগুলি হাস্কেলের চেয়ে শব্দযুক্ত, সুতরাং এটি প্রায়শই একটি একক পুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করার জন্য একটি ভাল অর্থ প্রদান করে যা অভ্যন্তরীণ এবং বাইরের উভয় পুনরাবৃত্তীয় লুপগুলি করে, যদিও আমি জানি না যে এটি এখানে কতটা সম্ভব কার্যকর। z==[]or _zTrue==1
xnor

@ xnor "পাইথন গল্ফিংয়ে আপনাকে স্বাগতম"?
শার্লক 9

ওহ, দুঃখিত, আপনি পাইথনে গল্ফ করেন। আমি আপনাকে সত্যিকারের সাথে যুক্ত করি।
xnor

@ এক্সনোর লং, আসলে আমি শুরু করার অনেক আগে, আমি পাইথনে গল্ফ করছিলাম। আমি কিছুটা বিড়বিড় হয়েছি যা আপনার মনে নেই: পি
শারলক 9

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