กี่สี่เหลี่ยมในกริด


29

ถึงแม้ว่าความท้าทายนี้จะกลายเป็นความสำเร็จที่ยิ่งใหญ่ แต่มันก็กลายเป็นเรื่องเล็กน้อยที่จะแก้ไข ดังนั้นสำหรับผู้ที่มองหาความท้าทายมากขึ้นฉันได้สร้างภาคต่อของความท้าทายซึ่งตอนนี้คุณต้องนับจำนวนสี่เหลี่ยมที่ไม่ซ้ำกัน ลองดูสิ!

ทีนี้สำหรับคนที่คุณต้องการแก้ไขปัญหานี้มาถึงแล้ว


เรายังไม่มีการท้าทายเช่นนี้ดังนั้นเราจึงไป

ลองพิจารณา3 x 3ตารางสี่เหลี่ยมมุมฉากนี้:

ตัวอย่าง

มีกี่รูปสี่เหลี่ยม? การนับสายตาเราจะเห็นได้ว่ามี36สี่เหลี่ยมจริง ๆรวมถึงระนาบทั้งหมดซึ่งทั้งหมดแสดงใน GIF แบบเคลื่อนไหวด้านล่าง:

รูปสี่เหลี่ยมผืนผ้าในตัวอย่าง

งาน

การนับสี่เหลี่ยมตามที่แสดงด้านบนเป็นภารกิจ ในคำอื่น ๆ ที่ได้รับ 2 จำนวนเต็มมากกว่าหรือเท่ากับ0, mและnที่mแสดงให้เห็นถึงความกว้างและnแสดงให้เห็นถึงความสูงเอาท์พุทจำนวนรวมของรูปสี่เหลี่ยมในm x nตารางสี่เหลี่ยม

กฎระเบียบ

  • การใช้บิวด์อินใด ๆ ที่แก้ปัญหานี้โดยตรงจะไม่ได้รับอนุญาตอย่างชัดเจน

  • ความท้าทายนี้ไม่ได้เกี่ยวกับการหาคำตอบที่สั้นที่สุด แต่การค้นหาคำตอบที่สั้นที่สุดในทุกภาษา ดังนั้นจะไม่ยอมรับคำตอบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

กรณีทดสอบ

นำเสนอในรูปแบบArray of Integers Input -> Integer Output:

[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588

อ้างอิง

โปรดจำไว้ว่านี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ!


ฉันคำนวณ588สำหรับกรณีทดสอบครั้งสุดท้าย
Leun Nun

@LeakyNun ถ้าอย่างนั้นฉันคิดว่าฉันคิดถึงบางคนในขณะที่นับมัน มันคงที่
R. Kap

ค่าสูงสุดของอินพุตคืออะไร?
Erik the Outgolfer

คำตอบ:


34

Python ขนาด 22 ไบต์

lambda m,n:m*~m*n*~n/4

สูตรm*n*(m+1)*(n+1)/4จะสั้นลงโดยใช้บิตสมบูรณ์~m=-(m+1)แสดงความเป็น(m+1)*(n+1)~m*~n

ทำไมจำนวนรูปสี่เหลี่ยมผืนผ้าm*n*(m+1)*(n+1)/4? แต่ละสี่เหลี่ยมถูกระบุโดยตัวเลือกของเส้นแนวนอนสองอัน (บนและล่าง) และสองเส้นแนวตั้ง (ซ้ายและขวา) มีm+1เส้นแนวนอนที่เราเลือกส่วนย่อยของสองเส้นที่แตกต่างกัน ดังนั้นจำนวนตัวเลือกคือซึ่งเป็นchoose(m+1,2) m*(m+1)/2การคูณด้วยn*(n+1)/2ตัวเลือกสำหรับเส้นแนวตั้งจะให้ผลลัพธ์


เคล็ดลับ +1 นั้นยอดเยี่ยม
David Ljung Madison Stellar

11

เยลลี่ขนาด 4 ไบต์

RS€P

ลองออนไลน์!

หรือมิฉะนั้นก็ 4 ไบต์

pP€S

ลองออนไลน์!


ทำได้ดีมาก ยกนิ้ว :)
R. Kap

24
สนใจที่จะอธิบาย?
Pureferret

นอกจากนี้ยังมีבHPและ‘c2Pอาจมีตัวเลือก 4 ไบต์อื่น ๆ
ไมล์

1
@Pureferret นี้ใช้สูตรจาก OEIS เกี่ยวกับเรื่องนี้เป็นผลิตภัณฑ์ของnthและmthหมายเลขสามเหลี่ยม Rแปลงจำนวนลงในดัชนี 1 [1, 2, ..., n]ตามแต่ละ Sคือผลรวมและหมายถึง [nth triangle number, mth triangle number]'แต่ละคนเพื่อให้แต่ละรายการจะสรุปให้รายการเช่น: จากนั้นPนำผลิตภัณฑ์ของรายการนั้นมาซึ่งให้ผลลัพธ์ที่ต้องการ
FryAmTheEggman

1
@FryAmTheEggman ดังนั้นสิ่งที่คุณพูดคือ .... Magic
Pureferret

9

Javascript (ES6), 17 ไบต์

m=>n=>m*n*~m*~n/4

ทางแยกของคำตอบนี้

f=m=>n=>m*n*~m*~n/4
alert(f(prompt())(prompt()))


ฉันไม่แน่ใจมีการแก้ตัวในภาษาที่ไม่ได้ทำตามค่าเริ่มต้นหรือไม่
John Dvorak

1
@JanDvorak โพสต์ Meta
Leun Nun

9

Mathematica ขนาด 15 ไบต์

##(1##+##+1)/4&

นี่เป็นฟังก์ชันที่ไม่มีชื่อโดยรับอาร์กิวเมนต์จำนวนเต็มสองรายการและส่งกลับจำนวนของรูปสี่เหลี่ยมผืนผ้า

คำอธิบาย

การใช้งานนั้นเป็นรูปแบบของผลิตภัณฑ์ของทั้งสองรูปสามเหลี่ยม มันอาจคุ้มค่าที่จะอ่านหัวข้อ "ลำดับของการขัดแย้ง" ในโพสต์นี้สำหรับรายละเอียด แต่ฉันจะพยายามสรุปส่วนสำคัญที่นี่

##ขยายออกเป็นลำดับของอาร์กิวเมนต์ทั้งหมด สิ่งนี้คล้ายกับการขีดในภาษาอื่น ตัวอย่างเช่นถ้ามีข้อโต้แย้ง3และ4จากนั้นจะทำให้คุณ{1, 2, ##, 5} {1, 2, 3, 4, 5}แต่ตอนนี้ไม่เพียง แต่การทำงานในรายการ แต่ในการแสดงออกใด ๆ เช่นนี้ยังจะเป็นf[1, 2, ##, 5]f[1, 2, 3, 4, 5]

สิ่งนี้น่าสนใจเมื่อคุณรวมเข้า##กับโอเปอเรเตอร์ ตัวดำเนินการทั้งหมดใน Mathematica เป็นเพียงมือสั้นสำหรับf[...]การแสดงออกที่เหมือนกันบางอย่าง(อาจซ้อนกัน) เช่นa+bเป็นPlus[a, b]และจริงเป็นa-b Plus[a, Times[-1, b]]ตอนนี้เมื่อคุณรวม##กับโอเปอเรเตอร์สิ่งที่ Mathematica ทำก็คือการขยายโอเปอเรเตอร์ก่อนปฏิบัติ##เหมือนตัวถูกดำเนินการตัวเดียวและขยายออกไปตอนท้ายเท่านั้น โดยการแทรก##ในสถานที่ที่เหมาะสมเราจึงสามารถใช้มันเพื่อคูณและเพิ่มตัวถูกดำเนินการ

ลองทำตามโค้ดด้านบน:

##(1##+##+1)/4

การขยายให้เต็มรูปแบบเราจะได้สิ่งนี้:

Times[##, Plus[Times[1, ##], ##, 1], Rational[1/4]]

ลองแทรกอาร์กิวเมนต์ของฟังก์ชันaและb:

Times[a, b, Plus[Times[1, a, b], a, b, 1], Rational[1/4]]

และตอนนี้เราแปลงกลับเป็นสัญกรณ์คณิตศาสตร์มาตรฐาน:

a * b * (a * b + a + b + 1) / 4

การจัดเรียงใหม่เล็กน้อยแสดงให้เห็นว่านี่เป็นผลคูณของตัวเลขสามเหลี่ยม:

a * b * (a + 1) * (b + 1) / 4
(a * (a + 1) / 2) * (b * (b + 1) / 2)
T(a) * T(b)

สนุกจริง: การดำเนินการนี้เพื่อให้ golfy PolygonalNumberก็ยาวเช่นเดียวกับในตัวสำหรับการคำนวณจำนวนสามเหลี่ยมเดียว


8

C, 25 ไบต์

#define r(x,y)x*y*~x*~y/4

คนเจ้าระเบียบรุ่น (27):

r(x,y){return x*y*~x*~y/4;}

รุ่น ISO-er (35):

#define r(x,y)((x)*(y)*~(x)*~(y)/4)

คุณคิดว่าเวอร์ชั่นไหนดีที่สุด?
Erik the Outgolfer

8

แมงกะพรุนขนาด 16 ไบต์

p|%/**+1
  4  Ei

รูปแบบอินพุตคือ[x y]เอาต์พุตเป็นเพียงผลลัพธ์

ลองออนไลน์!

โซลูชันทางเลือกนับไบต์เดียวกัน:

pm%/*[*i
  4  +1

คำอธิบาย

ได้เวลาแนะนำแมงกะพรุนที่สมควรได้รับ! :)

แมงกะพรุนเป็นZgarbภาษา 's ขึ้นอยู่กับความท้าทาย 2D ไวยากรณ์ของเขา ความหมายส่วนใหญ่ได้รับแรงบันดาลใจจากเจ แต่ไวยากรณ์เป็นงานศิลปะ ฟังก์ชั่นทั้งหมดเป็นตัวอักษรเดียวและวางบนตาราง ฟังก์ชั่นใช้การโต้แย้งของพวกเขาจากโทเค็นถัดไปทางทิศใต้และทิศตะวันออกของพวกเขาและส่งกลับผลเหนือและตะวันตก สิ่งนี้ช่วยให้คุณสร้างเว็บการเรียกใช้ฟังก์ชันที่น่าสนใจซึ่งคุณสามารถนำค่ามาใช้ใหม่โดยส่งผ่านไปยังฟังก์ชั่นต่างๆจากหลายทิศทาง

หากเราเพิกเฉยต่อความจริงที่ว่าโทเค็นบางตัวในโปรแกรมด้านบนเป็นตัวดำเนินการพิเศษ(ฟังก์ชั่นระดับสูงกว่า) โปรแกรมด้านบนจะเขียนอะไรแบบนี้ในภาษาที่มีเหตุผล:

p(|( /*(i*(i+1)) % 4 ))

ลองดูรหัสจากล่างขึ้นบน การป้อนข้อมูลได้รับการเลี้ยงดูในโดยที่จึงประเมินi[x y]

+บนของมันได้รับข้อมูลนี้พร้อมกับที่แท้จริง1และดังนั้นจึงเพิ่มองค์ประกอบทั้งสองที่จะให้[(x+1) (y+1)](ดำเนินการส่วนใหญ่เป็นเกลียวโดยอัตโนมัติผ่านรายการ)

ค่าอื่น ๆ ของiถูกส่งไปทางซ้าย แต่การEแบ่งเป็นอาร์กิวเมนต์ตะวันออกทางทิศเหนือและตะวันตก นั่นหมายความว่าปัจจัยการผลิตทางด้านขวา*เป็นจริง[x y]และเพื่อคำนวณนี้[(x+1) (y+1)][x*(x+1) y*(y+1)]

การ*อัพอัพครั้งถัดไปจะถูกแก้ไขจริงโดยการก่อนหน้านี้/ซึ่งเปลี่ยนเป็นการดำเนินการแบบพับ พับมากกว่าคู่เพียงแค่คูณมันดังนั้นที่เราได้รับ*x*(x+1)*y*(y+1)

ตอนนี้เป็นเพียงส่วนจึงคำนวณ% แต่น่าเสียดายที่ผลนี้ลอยดังนั้นเราจึงจำเป็นที่จะรอบกับเอกx*(x+1)*y*(y+1)/4 |ในที่สุดค่านี้จะถูกป้อนเพื่อpพิมพ์ผลลัพธ์สุดท้าย


ฉันสาบานได้แล้วว่าฉันได้อ่านอะไรบางอย่างในเอกสารเกี่ยวกับการหารจำนวนเต็ม ...
Conor O'Brien

7

R, 40 35 ไบต์

ถึงเวลากระโดดลงลึกสุดแล้ว! นี่คือรหัสRของฉันแรงบันดาลใจจาก @xnor คำตอบ:

a=scan();(n=a[1])*(m=a[2])*(n+1)*(m+1)/4 

แก้ไข : ในรุ่นนี้Rจะถามถึงสองครั้งสำหรับอินพุต

(n=scan())*(m=scan())*(n+1)*(m+1)/4

cat(prod(choose(scan()+1,2)))คือ 29 ไบต์
Giuseppe

6

CJam, 12 10 ไบต์

บันทึก 2 ไบต์ด้วย Martin

{_:)+:*4/}

ลองออนไลน์!

นี่คือบล็อกที่ใช้รายการของ 2 องค์ประกอบจากสแต็กและปล่อยให้โซลูชันบนสแต็ก riari+{_:)+:*4/}~โปรแกรมเต็มรูปแบบที่ใช้งานได้สำหรับการทดสอบ:

อ้างอิงจากโซลูชัน python ที่ยอดเยี่ยมของ xnor

คำอธิบาย:

{_:)+:*4/}
{        } -- Define a block
 _:)       -- Duplicate list, increment all values in new list
    +      -- Join the two lists
     :*    -- Fold multiply over all 4 elements
       4/  -- Divide by 4

2
ฉันคิดว่ามันใช้งานได้ 10 ถ้าคุณทำรายการของสององค์ประกอบ? {_:~+:*4/}
Martin Ender

ที่จริงแล้วไม่จำเป็นต้องใช้~ใน CJam เลย )ใช้เพียงแค่
Martin Ender


4

MATL , 6 ไบต์

tQ*2/p

[m,n]การป้อนข้อมูลเป็นอาร์เรย์ที่มีรูปแบบ

ลองออนไลน์!

คำอธิบาย

m*(m+1)*n*(n+1)/4การคำนวณตรงตามสูตรการคำนวณ

t     % Input array [m,n] implicitly. Duplicate
Q     % Add 1 to each entry of the copy: gives [m+1,n+1]
*     % Multiply element-wise: gives [m*(m+1),n*(n+1)]
2/    % Divide each entry by 2: [m*(m+1)/2,n*(n+1)/2]
p     % Product of the two entries: m*(m+1)*n*(n+1)/4. Display implicitly


4

Java 7, 39 38 ไบต์

int c(int a,int b){return~a*a*b*~b/4;}

Java 8, 26 25 19 18 17 ไบต์

a->b->a*~a*b*~b/4

ขึ้นอยู่กับ@xnorเป็นคำตอบที่ดี ไบต์หลายบันทึกขอบคุณที่@DavidConrad ลองที่นี่

รหัสทดสอบ (Java 7):

ลองที่นี่

class M{
  static int c(int a,int b){return~a*a*b*~b/4;}

  public static void main(String[] a){
    System.out.println(c(0, 0));
    System.out.println(c(1, 1));
    System.out.println(c(3, 3));
    System.out.println(c(4, 4));
    System.out.println(c(6, 7));
  }
}

เอาท์พุท:

0
1
36
100
588

1
คุณไม่จำเป็นต้องว่าreturnและเป็นหนึ่งไบต์สั้นกว่าa->b-> (a,b)->
David Conrad

2
ฉันไม่คิดว่าคุณต้องการเครื่องหมายอัฒภาคเนื่องจากถ้าคุณส่งแลมบ์ดาไปเป็นวิธีที่ใช้Function<Integer, Function<Integer, Integer>>เป็นพารามิเตอร์มันจะไม่ตามด้วยเครื่องหมายอัฒภาค
David Conrad

2
ฉันเห็นด้วยกับ @DavidConrad: ฉันไม่นับตอนจบของ;คำสั่ง lambdas เดี่ยว J8
CAD97

@DavidConrad ขออภัยในความล่าช้า แต่ตอนนี้ฉันสังเกตเห็นว่าฉันอ่านความคิดเห็นของคุณที่ผ่านมาเพื่อลบreturn .. นอกจากนี้ฉันแทบจะไม่เคยโปรแกรมใน Java 8 (ดังนั้น Java 7 ทั้งหมดของฉันตอบ) แต่ฉันจะa->b->ไปทำงานอย่างไร นี่คืออุดมคติสำหรับกรณีปัจจุบัน
Kevin Cruijssen

1
ขออภัยที่ตอบช้ามาก! คุณจำเป็นต้องแกงฟังก์ชั่นเพื่อให้คุณจะต้องมีการเปลี่ยนแปลงMathOperation.operationที่จะใช้เวลาเพียงหนึ่งint, กลับFunction<Integer, Integer>และเมื่อคุณเรียกว่าคุณเริ่มเพียงผ่านพารามิเตอร์แรกaแล้วโทรบน.apply(b) นอกจากนี้คุณยังจำเป็นต้องนำเข้าFunction นี่คืออุดมคติของการเปลี่ยนแปลง java.util.function.Function
David Conrad

3

ทับทิมขนาด 22 ไบต์

ขโมยเคล็ดลับของ @ xnor และสร้าง stabby-lambda:

r=->(m,n){m*n*~m*~n/4}

ตัวอย่างการโทร:

r[6,7]     # => 588

หรือเป็น proc ขนาด 22 ไบต์เช่นกัน:

proc{|m,n|m*n*~m*~n/4}

ซึ่งเราสามารถเรียก:

proc{|m,n|m*n*~m*~n/4}.call(6,7)     # => 588

คุณไม่จำเป็นต้องตั้งชื่อ - ฟังก์ชั่นที่ไม่ระบุชื่อเป็นเรื่องปกติตามแบบแผนของไซต์
Conor O'Brien

3

เขาวงกต , 13 11 ไบต์

*?;*_4/!
):

ลองออนไลน์!

คำอธิบาย

นอกจากนี้ยังคำนวณผลคูณของตัวเลขสามเหลี่ยมเหมือนคำตอบส่วนใหญ่ บล็อก 2x2 ชั้นนำนั้นเป็นวงเล็ก ๆ :

*?
):

ในการวนซ้ำครั้งแรก*ไม่ได้ทำอะไรเลยเพื่อให้การวนซ้ำจริงเป็นดังนี้:

?   Read integer N from STDIN or 0 at EOF and push onto stack. If 0, exit the loop.
:   Duplicate N.
)   Increment.
*   Multiply to get N*(N+1).

รหัสที่เหลืออยู่เป็นเส้นตรง:

;   Discard the zero that terminated the loop.
*   Multiply the other two values.
_4  Push a 4.
/   Divide.
!   Print.

จากนั้นเขาวงกตก็พยายามที่จะดำเนินการ/อีกครั้งซึ่งจะยุติโปรแกรมเนื่องจากการหารด้วยศูนย์



2

05AB1E, 4 ไบต์

€LOP

คำอธิบาย

ใช้สูตรที่อธิบายไว้ที่A096948

      # Implicit input, ex: [7,6]
€L    # Enumerate each, [[1,2,3,4,5,6,7],[1,2,3,4,5,6]]
  O   # Sum, [28,21]
   P  # Product, 588
      # Implicit display

จะเข้าเป็น[N, M]

ลองออนไลน์


1

Pyth, 8 6 ไบต์

บันทึกสองไบต์ด้วย @DenkerAffe

*FmsSd

[m,n]การป้อนข้อมูลที่คาดว่าเป็นรายการเช่น ลองที่นี่

คำอธิบาย:

          Implicit assignment of Q to eval(input).
*         Multiplication.
 F        Splat the following sequence onto the arguments of the previous function.
  m       Map the following function of d over Q (Q is implicitly added to the end).
   s      Reduce the following list with addition, initial value of 0.
    Sd    Return range(1,d+1).

1
คุณสามารถใช้Fแทน.*และลบQเพราะมันถูกเพิ่มเข้ามาโดยนัย
Denker

ฉันรู้Fแต่ไม่สามารถหาวิธีใช้และคิดว่าฉันต้องใช้.*แทน ... ขอบคุณ!
Rhyzomatic


1

Lua, 74 63 ไบต์

x,y=...n=0 for i=1,y do for j=i,i*x,i do n=n+j end end print(n)

ฟังก์ชั่นรับอินพุตเป็นพารามิเตอร์ตัวเลข

เนื่องจากวิธีการใช้งาน Lua นี่คือฟังก์ชันทางเทคนิคโดยมีตัวแปร args ซึ่งสามารถเรียกได้โดยการตัดคำสั่งในคำสั่ง "ฟังก์ชัน" หรือโหลดจากซอร์สโค้ดโดยใช้ "loadstring"


1
ฉันเห็นว่าคุณมีรหัสค่อนข้างมากสำหรับ I / O เท่านั้น บางทีมันอาจจะสั้นกว่าที่จะสร้างฟังก์ชั่นที่ใช้ตัวเลขสองตัวและคืนคำตอบและลบรหัส I / O ที่ไม่จำเป็นทั้งหมดนี้ออก
Zwei

@Zwei ฉันลืมฟังก์ชั่นที่ได้รับอนุญาตให้รับอินพุตด้วยพารามิเตอร์ ขอบคุณสำหรับการชี้ให้เห็นว่า
brianush1

ฟังก์ชั่นอาจตั้งชื่อบางอย่างเช่น "f" แทนที่จะเป็นทั้งชื่อ "ฟังก์ชั่น" เพื่อประหยัดอีก 7 ไบต์
Zwei

ใน Lua จำเป็นต้องใช้คำหลัก "ฟังก์ชัน" เพื่อประกาศฟังก์ชัน หากไม่มีการระบุชื่อ (เช่น: "function f ()") แสดงว่าเป็นฟังก์ชันที่ไม่ระบุตัวตน (เช่น: "function ()") ดังนั้นจำเป็นต้องใช้ "function" เพื่อให้โค้ดทำงาน
brianush1

โอ้ฉันลืมไปว่า lua ทำงานอย่างนั้น ความผิดฉันเอง!
Zwei


1

Brain-Flak , 84 80 ไบต์

({}<>)({({})<({}[()])>}{})<>({({})<({}[()])>}{}[()]){<>(({}))<>({}[()])}<>({{}})

ลองออนไลน์!

น่าจะเป็นวิธีย่อยที่ดีที่สุดโดยเฉพาะอย่างยิ่งเพราะมีการนำรหัสมาใช้เกี่ยวกับตัวเลขสามเหลี่ยม แต่อย่างน้อยเราก็มีวิธีแก้ปัญหา Brain-Flak ที่ใช้งานได้

น่าเศร้าที่ดูเหมือนว่าจะล้มเหลวโดยการวนซ้ำอย่างไม่มีที่สิ้นสุดกับ0 0testcase แต่คนอื่น ๆ ทั้งหมดทำงานได้ดี




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