เบ็ดยาวผลิตภัณฑ์


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"คุณสามารถคาดหวังว่ารายการจะเรียงลำดับจากน้อยไปมากหรือจากมากไปน้อย รายการจะไม่ว่างเปล่าและมีจำนวนเต็มบวกเท่านั้น

เอาท์พุท:ผลิตภัณฑ์ของความยาวเบ็ดซึ่งเป็นจำนวนเต็มบวก ไม่ต้องกังวลกับจำนวนเต็มล้นหรือรันไทม์

ไม่อนุญาตให้ใช้บิวด์อินเฉพาะกับ Young diagrams หรือ partition จำนวนเต็ม

กรณีทดสอบ:

[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

CJam, 20 19 ไบต์

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

สิ่งนี้ใช้เวลาในรายการเดียวของสไตล์ CJam ในลำดับจากน้อยไปหามาก ตัวอย่างเช่น:

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

จะช่วยให้

115200

มันทำงานอย่างไร

รุ่นนี้จัดทำโดย Dennis และใช้ความจริงที่ว่าBlock ArrayList %ยังใช้งานได้ใน CJam: D

{       }_             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/

สิ่งนี้ใช้ในรายการสไตล์ CJam ของขนาดแถวตามลำดับจากน้อยไปหามาก ตัวอย่างเช่น:

[1 3 3 5]

จะช่วยให้

115200

มันทำงานอย่างไร

หากเราดูความยาวของตะขอของแต่ละบล็อกในแผนภาพบล็อกเล็กคือผลรวมของดัชนีของบล็อกนั้นในแถวและคอลัมน์ของมันนับถอยหลัง ie เริ่มดัชนีในแต่ละแถวจากด้านขวาและเริ่มดัชนีในแต่ละคอลัมน์จากด้านล่าง

เรารับข้อมูลเข้าในลำดับของขนาดแถวเพื่อเริ่มต้นดัชนีจากด้านล่างในแต่ละคอลัมน์อย่างง่ายดาย อันดับแรกเราจะได้รับดัชนีต่อแถวและย้อนกลับ จากนั้นเราย้าย เนื่องจากคำสั่งแถวเดิมกลับด้านการทำดัชนีในแผนภาพที่ย้ายนี้จะให้ดัชนีด้านล่างถึงด้านบนโดยตรง

การขยายรหัส

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]]
Dennis

@Dennis Nice (ab) ใช้คำสั่ง arity สำหรับ%: P
เครื่องมือเพิ่มประสิทธิภาพ

6

J, 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

Pyth - 21 ไบต์

ฉันสูญเสียจำนวนมากในการคำนวณแนวตั้ง จะเน้นไปที่การเล่นกอล์ฟนั้น

*Fs.em+lf>Td>Qkt-bdbQ

[5, 3, 3, 1]จะเข้าเช่น

ลองมันนี่เกมออนไลน์


4

Pyth, 18 ไบต์

*Fsm.e+k-bdf>TdQeQ

ใช้อินพุตตามลำดับจากน้อยไปมากเช่น [1, 3, 3, 5]จะเข้าในลำดับเช่น

สาธิต.


โซลูชันสำรองขนาด 19 ไบต์

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

3

Python 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

(ขอบคุณ @xnor สำหรับการบันทึกไบต์บ้าโดยรวมpและj)

d.getดูน่าสงสัยเล็กน้อยสำหรับฉัน แต่อย่างอื่นฉันค่อนข้างมีความสุขกับสิ่งนี้ ฉันลองวิธีอื่น ๆ เช่นการเรียกซ้ำและการซิป แต่นี่เป็นวิธีเดียวที่ฉันสามารถทำได้ต่ำกว่า 100

นำข้อมูลจาก STDIN เป็นรายการใน Ascending Order, [1, 3, 3, 5]เช่น


3

Haskell, 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สแกนจากบนลงล่างโดยการคูณfของรายการทั้งหมดด้วยpหาง


2

R, 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))

Ungolfed:

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

Python 2, 135 128 ไบต์

ใช้รายการประเภทหลามจาก stdin:

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 เพื่อให้การใช้งานง่ายขึ้นในการคำนวณในภายหลัง) จากนั้นมันวนซ้ำทุกช่องและเพิ่มความยาวของเบ็ด ความยาวของ hook นั้นเล็กน้อยในการคำนวณเมื่อคุณมีจำนวนกล่องในแต่ละแถวและคอลัมน์


1
ดูเหมือนว่าคุณไม่ได้ใช้m?
xnor

อาจสาบานว่าฉันจะลบมัน! ฉันจำได้ว่าสังเกตเห็นว่าฉันใช้เพียงครั้งเดียวและทดแทนการใช้งานเพียงอย่างเดียว แต่ฉันก็ต้องพลาดที่จะลบตัวแปรจริงๆ :(
Reto Koradi

1

JavaScript ( ES6 ) 69

ฟังก์ชั่นรับอาร์เรย์ของจำนวนเต็มจากน้อยไปมากตามลำดับ

เรียกใช้ตัวอย่างเพื่อทดสอบ (Firefox เท่านั้น)

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

Python, 95 91 ไบต์

นี่คือการดำเนินงานของงูหลามNimi คำตอบของ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

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:])

ยินดีต้อนรับสู่ Python golfing! คุณสามารถทำz and _ or 1ตามที่z==[]or _เมื่อเป็นรายการโดยใช้ความจริงที่ว่าz True==1การประกาศฟังก์ชั่นของไพ ธ อนนั้นดีกว่า Haskell ดังนั้นมันจึงให้ผลตอบแทนที่ดีในการกำหนดฟังก์ชั่นวนซ้ำแบบเดี่ยวที่ทำทั้งวนภายในและภายนอกแบบวนซ้ำแม้ว่าฉันจะไม่รู้ว่าเป็นไปได้อย่างไร
xnor

@xnor "ยินดีต้อนรับสู่ Python golfing"?
Sherlock9

โอ้ขอโทษคุณเล่นกอล์ฟใน Python ฉันเชื่อมโยงคุณกับจริง
xnor

@ xnor Long นานก่อนที่ฉันจะเริ่มในความเป็นจริงฉันเล่นกอล์ฟใน Python ฉันสับสนนิดหน่อยที่คุณจำไม่ได้: P
Sherlock9

ฉันไม่สามารถพูดกับ xnor ได้ แต่ฉันจำผู้ใช้เป็นหลักได้ด้วยอวาตาร์
เดนนิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.