วาดชุดค่าผสมที่รวมกันได้สูงสุด 100


13

คุณมีกล่องที่มีตัวเลขหนึ่งหลักในแต่ละมุม:

1|2
---
3|4

ถ้าเราต่อตัวเลขตามแถวจากซ้ายไปขวาเราจะได้ 12 และ 34 ถ้าเราต่อกันตัวเลขตามคอลัมน์จากบนลงล่างเราจะได้ 13 และ 24 ถ้าเราเพิ่มตัวเลขเหล่านี้ทั้งหมดเราจะได้ 12 + 34 + 13 + 24 = 83

ท้าทาย

เขียนโปรแกรมเพื่อพิมพ์กล่องดังกล่าวทั้งหมดที่ผลรวมที่คำนวณตามข้างบนเท่ากับ 100

สมมติว่าแต่ละมุมมีตัวเลขหลักเดียวระหว่าง 1 ถึง 9 มีการรวมกัน 9 แบบ: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 และ 3119 (โปรดทราบว่ามี 25 ชุดถ้าเรารวม 0 แต่ เราไม่ได้สำหรับความท้าทายนี้)

โปรดทราบว่าตัวอย่าง 1234 ใช้งานไม่ได้เนื่องจาก 12 + 34 + 13 + 24 ไม่เท่ากับ 100

อินพุต

ไม่มี

เอาท์พุต

กล่องคำตอบในรูปแบบต่อไปนี้:

A|B
---
C|D

ควรพิมพ์เอาต์พุตไปที่ STDOUT หรือทางเลือกที่ใกล้เคียงที่สุด

กฎระเบียบ

  • AB + CD + AC + BD = 100
  • แต่ละมุมจะมีจำนวนเต็มบวก 1-9 เท่านั้น
  • ยกเว้น 0
  • สามารถใช้ตัวเลขได้มากกว่าหนึ่งครั้ง
  • คุณจำเป็นต้องวาดกล่องดังกล่าวข้างต้น ( A|B\n---\nC|D\n)
  • คุณต้องส่งคำตอบที่ถูกต้องทั้งหมด
  • ขึ้นบรรทัดใหม่ต่อท้ายไม่เป็นไร
  • ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
  • มีช่องโหว่มาตรฐานและข้อกำหนดของ T & C

นี่คือการส่งครั้งแรกของฉันดังนั้นโปรดแจ้งให้เราทราบหากฉันต้องการชี้แจงอะไร


คุณสามารถแสดงสิ่งที่ผลลัพธ์ควรจะเป็นอย่างไร นอกจากนี้แล้วอักขระขึ้นบรรทัดใหม่ที่ต่อท้ายคืออะไร
Spikatrix

ความท้าทายที่ดี ฉันคิดว่าคุณต้องบอกให้ชัดเจนว่าต้องเพิ่มตัวเลขใด บรรทัด "ตัวเลขสองตัวต่อกันสองหลักข้ามบวกสองหลักสองหลักมีค่าเท่ากับ 100" ไม่ชัดเจนเพียงพอ ฉันคิดโดยใช้ตัวอย่างของ 1234 เท่านั้นและฉันเพิ่งได้รับชุดค่าผสม 9 อย่างเท่านั้น คุณช่วยพูดถึงชุดค่าผสม 16 ชุดได้ไหม
เครื่องมือเพิ่มประสิทธิภาพ

1
ฉันแก้ไขคำอธิบายและการจัดรูปแบบสองสามครั้ง หากไม่ตรงกับความตั้งใจดั้งเดิมของคุณโปรดย้อนกลับการแก้ไข
Alex A.

1
@DenhamCoote ที่จริงแล้วโซลูชันกึ่งฮาร์ดโค้ดของฉันค่อนข้างน่าสนใจที่จะทำเพราะมันเป็นเพียงกึ่งฮาร์ดโค้ด นี่เป็นข้อยกเว้นสำหรับกฎเนื่องจากคำถามที่ตัวเลือกที่ชัดเจนที่สุด / ชัดเจนที่สุดมักจะไม่ได้คำตอบที่น่าสนใจ (ดูตัวอย่างของ borromean ดังเช่นแหวน) ขอบคุณสำหรับคำถาม
เลเวลริเวอร์เซนต์

1
การยอมรับคำตอบอาจให้ความรู้สึกว่าคำถามนั้นเสร็จสิ้นดังนั้นฉันจึงทิ้งไปสักพัก หากคุณได้รับคำตอบเพิ่มเติมหลังจากนั้นคุณสามารถเปลี่ยนคำตอบได้ แต่นั่นหมายความว่าคุณต้องระวังซึ่งคุณอาจไม่มีเวลาทำ การแข่งขันความนิยมไม่ชอบเพราะพวกเขามักจะเขียนอย่างเกียจคร้านและกว้างเกินไปมักจะเป็นประเภท "Do X ในวิธีที่ซับซ้อนที่สุดที่เป็นไปได้" โดยทั่วไปคำถามยอดนิยมเพียงอย่างเดียวที่อยู่ในการประมวลผลภาพซึ่งการประเมินโดยมนุษย์เป็นวิธีเดียวที่จะตัดสินว่าอัลกอริทึมนั้นดีหรือไม่ การประมวลผลภาพไม่รวมงานศิลปะล้วน ๆ
เลเวลริเวอร์เซนต์

คำตอบ:


8

Pyth, 42 38 34 ไบต์

V ^ ST4IqC \ ds * VNsM ^, T1 2Xj \ | N3 "
---

บรรทัดใหม่ต่อท้ายในรหัสเป็นสิ่งสำคัญ เหตุผลหลักที่ผมแข่งขันเป็นเพราะผมใช้ผลิตภัณฑ์เวกเตอร์จุดของ[1, 1, 5, 7]และ[20, 11, 11, 2]และเปรียบเทียบกับ 100


"|"-> \|, \n-> (การป้อนบรรทัดตามตัวอักษร) และคุณไม่จำเป็นต้องมีใบเสนอราคาสุดท้าย
Dennis

@Dennis กำลังนอนหลับ>. <
orlp

2
หากคุณไม่เป็นไรคุณช่วยเพิ่มคำอธิบายสำหรับคนที่ (เช่นฉัน) ที่ไม่สามารถถอดรหัสคำตอบสั้น ๆ ของคุณได้อย่างเหลือเชื่อ?
Denham Coote

6

ทับทิม, 71

เนื่องจากฮาร์ดโค้ดไม่ได้รับอนุญาต (และในกรณีใด ๆ มันเป็นการยากที่จะวาดเส้น) นี่คือคำตอบฮาร์ดโค้ดบางส่วน

1.upto(3){|i|1.upto(7-i*2){|j|print i,?|,j,'
---
',8-j-2*i,?|,i+6,'
'}}

คำอธิบาย

สูตรสำหรับโซลูชันมีดังนี้:

A*20+(B+C)*11+D*2=100

โดยการขัดแย้งทางคณิตศาสตร์แบบแยกส่วนเราจะเห็นว่า A และ D จะต้องแตกต่างกันตามจำนวนคงที่เช่นนั้น(A*20+D*2)%11คงที่ อันที่จริง D = A + 6 การiวนซ้ำวนซ้ำผ่านค่าสามค่าที่เป็นไปได้ของ A

ค่าของ B สามารถเป็นอะไรก็ได้ตั้งแต่ 1 ถึง7-i*2และรวมของ B และ C 14-A-Dจะต้อง ดังนั้นเราจึงได้รับการแสดงออกต่อไปนี้ซึ่งจะถูกพิมพ์ Ruby อนุญาตให้ขึ้นบรรทัดใหม่ตามตัวอักษรในสตริงที่ล้อมรอบ''

   i     |    j
------------------
8-j-2*i  |   i+6

4

Java, 202 200 198

ลองครั้งแรก: D

แก้ไข: บันทึก 2 ไบต์ด้วยการคำนวณที่เล็กกว่าเล็กน้อยในความคิดเห็นอื่น

class C{public static void main(String[]c){for(int i=0;++i<5;)for(int j=0;++j<7;)for(int k=0;++k<10;)for(int l=0;++l<10;)if(20*i+11*(j+k)+2*l==100)System.out.printf("%s|%s%n---%n%s|%s%n",i,j,k,l);}}

4

ชุด - 187 ไบต์

กำลังดุร้าย.

@!! 2>nul||cmd/q/v/c%0&&exit/b
set y=for /l &set z= in (1,1,9)do 
%y%%%a%z%%y%%%b%z%%y%%%c%z%%y%%%d%z%set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d&if !a!==100 echo %%a^|%%b&echo ---&echo %%c^|%%d

ยกเลิกการตีกอล์ฟมันน่าขยะแขยงเล็กน้อย :

@echo off
setLocal enableDelayedExpansion
for /l %%a in (1,1,9) do (
    for /l %%b in (1,1,9) do (
        for /l %%c in (1,1,9) do (
            for /l %%d in (1,1,9) do (
                set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d
                if !a!==100 (
                    echo %%a^|%%b
                    echo ---
                    echo %%c^|%%d
                )
            )
        )
    )
)

3

CJam, 40 ไบต์

A4m*{[KBBY].*:+56=},{:)2/'|f*"
---
"*N}/

วิธีในการค้นหาชุดค่าผสมนั้นแตกต่างจากของ @ Optimizer แต่รหัสสำหรับการพิมพ์จะเหมือนกัน

ลองใช้ออนไลน์ในล่าม CJam

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

A4m*     e# Push all vectors of length 4 with coordinates in [0 ... 9].
         e# We'd normally use [0 ... 8] here, but "9 4m*" is 1 byte longer and
         e# "A4m*" doesn't produce any false positives.

{        e# Filter the vectors:
[KBBY].* e#   Multiply the elements of the vector by 20, 11, 11 and 2.
:+       e#   Add all four products.
56=      e#   Check if the sum is 56. 56 is used instead of 100 since all elements
         e#   of the vector will be incremented and 56 + 20 + 11 + 11 + 2 == 100.
},       e# Keep only vectors for which = pushed a truthy value.

{        e# For each vector:
:)       e#   Increment each coordinate.
2/       e#   Split into pair.
'|f*     e#   Join each pair, delimiting by '|'.
"
---
"*       e#   Join the two pairs, delimiting by "\n---\n".
N        e#   Push "\n".
}/       e#

เนื่องจากฉันรู้น้อยมากนอกเหนือจาก Java บางตัวฉันชอบคำอธิบายว่ามันทำงานอย่างไรถ้าคุณเต็มใจ .. ?
Denham Coote

นั่นเป็นเคล็ดลับที่ดี
เครื่องมือเพิ่มประสิทธิภาพ

ว้าว. ฉันมีอะไรมากมายให้เรียนรู้ ขอบคุณสำหรับคำอธิบาย :)
Denham Coote

3

Haskell, 107 131 ไบต์

s=show
r=[1..9]
v=putStr$unlines[s a++"|"++s b++"\n---\n"++s c++"|"++s d++"\n"|a<-r,b<-r,c<-r,d<-r,(2*a+b+c)*10+b+2*d+c==100]

รุ่นที่สองของโปรแกรม Haskell ครั้งแรกของฉัน!

คราวนี้มีการแสดงตามความต้องการถูกขโมยอย่างไร้ยางอายดัดแปลงมาจาก nimi's (อย่างดีฉันได้ทำการวิจัยบางอย่าง แต่ดูเหมือนว่าไม่มีวิธีที่มีประสิทธิภาพในการแสดงอักขระใน Haskell ดังนั้นการวางบรรทัด un $ นั้นยากที่จะหลีกเลี่ยง)

และ ... นอกเหนือจากการแยกตัวประกอบของสูตรในตอนท้ายก็ยังสามารถอ่านได้ =)


3

Haskell, 125 121 ไบต์

s=show
f=putStr$unlines[s a++'|':s b++"\n---\n"++s c++'|':s d|[a,b,c,d]<-mapM id$"abcd">>[[1..9]],20*a+11*(b+c)+2*d==100]

การใช้งาน:

*Main> f
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9

>>ในการ"abcd">>[[1..9]]ทำรายการที่มี 4 (ความยาวของพารามิเตอร์ 1) [[1..9],[1..9],[1..9],[1..9]]สำเนาขององค์ประกอบที่สองคือ mapM idทำให้รายการของการรวมกันทั้งหมดนั้นคือการ[0,0,0,0] [9,9,9,9]เก็บค่าที่รวมไว้100และสร้างสตริงด้วยกล่องของมัน พิมพ์กล่องทั้งหมด

ขอบคุณ @Mauris 1 ไบต์และทำให้ฉันตรวจสอบโพสต์ของฉันเพื่อหา 3 เพิ่มเติม


mapM idsequenceบันทึกไบต์เทียบกับ
ลินน์

2

Python 2, 145 129 Bytes

ขณะนี้ฉันกำลังเล่นกับวิธีการคำนวณที่แตกต่างกันสองสามวิธีซึ่งควรจะสั้นกว่าที่ระบุไว้ แต่ฉันจะโพสต์สิ่งที่ฉันมีตอนนี้

i=int
for k in range(1000,9999):
 a,b,c,d=`k`
 if i(a+b)+i(c+d)+i(a+c)+i(b+d)==100and not'0'in`k`:print a+'|'+b+'\n---\n'+c+'|'+d

2

CJam, 43 42 ไบต์

A,1>4m*{2/_z+Afb:+100=},{2/'|f*"
---
"*N}/

คำอธิบายที่จะติดตาม .. โดย EOD วันนี้

ลองออนไลน์ได้ที่นี่


รุ่น java golfed ของฉัน (ซึ่งไม่ได้ยุ่งกับกล่องมันเพียงรายการลำดับ) คือ 197 ตัวอักษร ทั้งหมดนี้ทำได้แค่หนึ่งในสี่ของความยาว! Cool :)
Denham Coote

@DenhamCoote นั่นคือคำตอบของทุก CJam, Pyth และ GolfScript
ช่วง

ยังรอคอยคำอธิบายนั้น ;-)
Denham Coote


1

R, 165 ไบต์

e=expand.grid(d<-1:9,d,d,d)
a=apply
o=a(e[a(e,1,function(x)20*x[1]+11*(x[2]+x[3])+2*x[4]==100),],1,function(x)cat(x[1],"|",x[2],"\n---\n",x[3],"|",x[4],"\n",sep=""))

นี่จะสั้นลงอย่างเห็นได้ชัดหากฉันเลือกฮาร์ดโค้ดเอาต์พุตในบางวิธี เช่นเดียวกับโซลูชันอื่น ๆ สองสามตัวนี้ใช้ประโยชน์จากข้อมูลเฉพาะตัว 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100

คำอธิบาย Ungolfed +:

# Create a matrix where each row is a combination of the digits 1-9
e <- expand.grid(1:9, 1:9, 1:9, 1:9)

# Filter the rows of the matrix using the aforementioned identity
e <- e[apply(e, 1, function(x) 20*x[1] + 11*(x[2]+x[3]) + 2*x[4] == 100), ]

# Print each row formatted into boxes
o <- apply(e, 1, function(x) cat(x[1], "|", x[2], "\n---\n", x[3], "|", x[4], sep = ""))

คุณอาจสงสัยว่าทำไมคำสั่งสุดท้ายคือการมอบหมาย มันจะเปิดออก, catฟังก์ชั่นซึ่ง concatenates และภาพพิมพ์, NULLส่งกลับค่า เมื่อคุณโทรcatจากภายในฟังก์ชั่นเช่นapplyเอาท์พุทจะถูกตามด้วยNULLซึ่งไม่พึงประสงค์ invisibleกำหนดให้ตัวแปรหรือห่อไว้ใน: มีสองวิธีในรอบนี้ ที่นี่ฉันเลือกใช้มาตั้งแต่อดีตเพราะสั้นกว่ามาก

คุณสามารถลองออนไลน์ได้


1

Java, 450

ความพยายามครั้งแรกของฉัน (ไม่ได้แต่งตัว) ดูเหมือนว่า:

คลาส B {
  โมฆะคงที่สาธารณะหลัก (String [] a) {
    สำหรับ (int i = 1; i <10; i ++)
      สำหรับ (int j = 1; j <10; j ++)
        สำหรับ (int k = 1; k <10; k ++)
          สำหรับ (int l = 1; l <10; l ++)
            ถ้า (Integer.parseInt (i + "" + J) + Integer.parseInt (k + "" + L) + Integer.parseInt (i + "" + k) + Integer.parseInt (ญ + "" + L) == 100) {
              System.out.println (i + "|" + J);
              System.out.println ( "---");
              System.out.println (k + "|" + L + "\ n");
            }
  }
}


3
คำแนะนำ: 20*a + 11*(b + c) + 2*d == 100.
orlp

ใช่วิธีนี้คือการต่อสายอย่างหมดจด - ความพยายามครั้งแรกที่ต่ำต้อย
Denham Coote

1
ฉันนับได้เพียง436 ไบต์ไม่ใช่ 450 นอกจากนี้ช่องว่างไม่จำเป็นซึ่งจะช่วยให้คุณประหยัดได้มาก
Alex A.

นอกจากนี้การลบช่องว่างที่ไม่จำเป็นนี้ควรจะใกล้ชิดกับ 340 ไบต์ :)
Kade

1

PowerShell, 98

ดัดแปลงสูตรของสตีฟเวอร์ริลล์

:\>cat printbox.ps1

1..9|%{for($j=1;$j-lt10;$j++){if(($k=(8-$j-2*$_))-gt0){"{0}|{1}`n---`n{2}|{3}"-f$_,$j,$k,
($_+6)}}}

:\>powershell -f printbox.ps1
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.