Vẽ các kết hợp thêm tới 100


13

Bạn có một hộp có một chữ số duy nhất ở mỗi góc:

1|2
---
3|4

Nếu chúng ta ghép các chữ số dọc theo các hàng từ trái sang phải, chúng ta sẽ nhận được 12 và 34. Nếu chúng ta ghép các chữ số dọc theo các cột từ trên xuống dưới, chúng ta sẽ nhận được 13 và 24. Nếu chúng ta thêm tất cả các số này, chúng ta sẽ nhận được 12 + 34 + 13 + 24 = 83.

Thử thách

Viết chương trình in tất cả các ô như vậy trong đó tổng được tính như trên bằng 100.

Giả sử mỗi góc chứa một số có một chữ số từ 1 đến 9, có 9 kết hợp: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 và 3119. (Lưu ý rằng có 25 kết hợp nếu chúng tôi bao gồm 0, nhưng chúng tôi không cho thử thách này.)

Lưu ý rằng ví dụ 1234 không hoạt động vì 12 + 34 + 13 + 24 không bằng 100.

Đầu vào

không ai

Đầu ra

Trả lời các hộp theo định dạng sau:

A|B
---
C|D

Đầu ra phải được in ra STDOUT hoặc thay thế gần nhất.

Quy tắc

  • AB + CD + AC + BD = 100
  • Mỗi góc sẽ chỉ chứa các số nguyên dương 1-9.
  • 0 được loại trừ.
  • Số có thể được sử dụng nhiều lần.
  • Bạn cần vẽ các hộp, như trên. ( A|B\n---\nC|D\n)
  • Bạn cần xuất ra tất cả các câu trả lời hợp lệ.
  • Một dòng mới bổ sung là tốt.
  • , vì vậy mã ngắn nhất trong byte thắng.
  • Sơ hở tiêu chuẩn và áp dụng T & C.

Đây là lần gửi đầu tiên của tôi vì vậy xin vui lòng cho tôi biết nếu tôi cần làm rõ bất cứ điều gì.


Bạn có thể chỉ ra những gì đầu ra được cho là? Ngoài ra, những gì về một nhân vật dòng mới?
Spikatrix 20/07/2015

Thử thách đẹp. Tôi nghĩ bạn cần nói rõ ràng những con số nào cần được thêm vào. Dòng "Hai, hai số có hai chữ số trên PLUS hai, hai số có hai chữ số phải bằng 100." không đủ rõ ràng. Tôi chỉ tìm ra bằng cách sử dụng ví dụ của 1234. Ngoài ra, tôi chỉ nhận được 9 kết hợp như vậy. Bạn có thể vui lòng đề cập đến 16 kết hợp?
Tối ưu hóa

1
Tôi đã thực hiện một vài chỉnh sửa để giải thích và định dạng. Nếu nó không phù hợp với mục đích ban đầu của bạn, vui lòng quay lại chỉnh sửa.
Alex A.

1
@DenhamCoote thực sự, giải pháp bán mã hóa cứng của tôi khá thú vị để làm, bởi vì nó chỉ là bán mã hóa cứng. Điều này là một ngoại lệ đối với quy tắc này, bởi vì các câu hỏi trong đó mã hóa trắng trợn là lựa chọn tốt nhất / rõ ràng nhất thường không tạo ra câu trả lời thú vị (ví dụ: xem câu hỏi về vòng borromean gần đây.) Cảm ơn bạn về câu hỏi.
Cấp sông St

1
Chấp nhận một câu trả lời có thể mang lại ấn tượng cho câu hỏi đã kết thúc, vì vậy tôi sẽ để nó một lúc. Nếu bạn nhận được nhiều câu trả lời hơn sau đó, bạn có thể thay đổi sự chấp nhận, nhưng điều đó có nghĩa là bạn phải theo dõi, điều mà bạn có thể không có thời gian để làm. Các cuộc thi phổ biến không thích vì chúng thường được viết một cách lười biếng và quá rộng, thường thuộc loại "Do X theo cách phức tạp nhất có thể". Nói chung, các câu hỏi phổ biến tốt duy nhất là trong xử lý hình ảnh, trong đó đánh giá của con người là cách duy nhất để quyết định xem thuật toán có tốt hay không. Xử lý hình ảnh không bao gồm nghệ thuật thuần túy là chủ đề.
Cấp sông St

Câu trả lời:


8

Pyth, 42 38 34 byte

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

Dòng mới trong mã là quan trọng. Lý do chính tôi là cạnh tranh là vì tôi sử dụng vector chấm sản phẩm của [1, 1, 5, 7][20, 11, 11, 2]và so sánh nó với 100.


"|"-> \|, \n-> (linefeed theo nghĩa đen) và bạn không cần trích dẫn cuối cùng.
Dennis


2
Nếu bạn không phiền, bạn có thể vui lòng thêm một lời giải thích cho những người (như tôi), người không thể giải mã câu trả lời cực kỳ ngắn của bạn không?
Denham Coote

6

Ruby, 71

Vì mã hóa cứng không được phép (và trong mọi trường hợp, rất khó để vẽ một dòng) đây là câu trả lời được mã hóa một phần.

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

Giải trình

Công thức cho một giải pháp như sau:

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

Bằng các đối số số học mô-đun, chúng ta thấy rằng A và D phải khác nhau bởi một lượng không đổi, như vậy (A*20+D*2)%11là không đổi. Trong thực tế D = A + 6. Các ilặp vòng lặp thông qua ba giá trị có thể có của A.

Giá trị của B có thể là bất cứ thứ gì từ 1 đến 7-i*2và tổng của B và C phải là 14-A-D. Do đó, chúng tôi có được các biểu thức sau đây, được in. Ruby cho phép các dòng mới theo nghĩa đen trong chuỗi được bao trong''

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

4

Java, 202 200 198

Thử lần đầu tiên: D

EDIT: đã lưu 2 byte với tính toán nhỏ hơn một chút được tìm thấy trong một nhận xét khác.

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

Mẻ - 187 byte

Lực lượng vũ phu.

@!! 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

Un-golfed nó hơi ít kinh tởm:

@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 byte

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

Cách tiếp cận để tìm các kết hợp khác với @ Tối ưu hóa, nhưng mã để in chúng là giống hệt nhau.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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#

Vì tôi biết rất ít ngoài một số Java, tôi muốn giải thích về cách thức hoạt động của nó, nếu bạn sẵn sàng ..?
Denham Coote

Đó là một mẹo hay.
Tối ưu hóa

Ồ Tôi có nhiều thứ để học. Cảm ơn đã giải thích :)
Denham Coote

3

Haskell, 107 131 byte

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]

Phiên bản thứ hai của chương trình Haskell đầu tiên của tôi từ trước đến nay!

Lần này với màn hình theo yêu cầu, bị đánh cắp một cách đáng xấu hổ được điều chỉnh từ nimi (tôi cũng đã thực hiện một số nghiên cứu nhưng dường như không có cách nào hiệu quả để hiển thị các ký tự trong Haskell để khó có thể tránh được các dấu gạch ngang).

Và ... ngoài yếu tố công thức ở cuối, nó vẫn có thể đọc được =)


3

Haskell, 125 121 byte

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]

Sử dụng:

*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

>>in "abcd">>[[1..9]]tạo một danh sách với 4 (chiều dài của tham số thứ 1) của phần tử thứ hai, nghĩa là [[1..9],[1..9],[1..9],[1..9]]. mapM idtạo ra một danh sách của tất cả các kết hợp của chúng, tức là [0,0,0,0]tới [9,9,9,9]. Giữ những cái đó tổng hợp 100và xây dựng một chuỗi với hộp của nó. In tất cả các hộp.

Cảm ơn @Mauris cho 1 byte và khiến tôi xem lại bài đăng của mình để tìm thêm 3 byte.


mapM idlưu một byte so với sequence.
Lynn

2

Python 2, 145 129 byte

Tôi hiện đang chơi với một vài phương pháp tính toán khác nhau nên ngắn hơn so với những gì được phác thảo, nhưng tôi sẽ đăng những gì tôi có bây giờ.

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 byte

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

Giải thích để làm theo .. bởi hôm nay EOD

Dùng thử trực tuyến tại đây


Phiên bản java đánh gôn của tôi (không bận tâm với các hộp, nó chỉ liệt kê các chuỗi) là 197 ký tự. Điều này làm tất cả trong một phần tư chiều dài! Thật tuyệt :)
Denham Coote

@DenhamCoote Đó là mọi câu trả lời của CJam, Pyth và GolfScript.
giai đoạn

Vẫn mong chờ lời giải thích đó ;-)
Denham Coote

1

Con trăn 3, 159

Nhanh chóng và hèn hạ.

N='123456789'
D='%s|%s\n'
O=D+'---\n'+D
I=int
[print(O%(a,b,c,d)if I(a+b)+I(c+d)+I(a+c)+I(b+d)==100 else'',end='')for a in N for b in N for c in N for d in N]

1

R, 165 byte

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=""))

Điều này sẽ được rút ngắn đáng kể nếu tôi chọn mã hóa đầu ra theo một cách nào đó. Giống như một vài giải pháp khác, điều này tận dụng lợi thế của danh tính 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Ungolfed + giải thích:

# 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 = ""))

Bạn có thể tự hỏi tại sao tuyên bố cuối cùng là một bài tập. Khi nó bật ra, cathàm, nối và in, trả về một giá trị NULL. Khi bạn gọi cattừ bên trong một chức năng như apply, đầu ra sẽ được theo sau NULL, đó là điều không mong muốn. Có hai cách xung quanh điều này: gán nó cho một biến hoặc bọc nó vào invisible. Ở đây tôi đã chọn trước đây vì nó ngắn hơn đáng kể.

Bạn có thể thử nó trực tuyến .


1

Java, 450

Nỗ lực đầu tiên (không được phép) của tôi trông như thế này:

lớp B {
  công tĩnh void chính (Chuỗi [] a) {
    cho (int i = 1; i <10; i ++)
      cho (int j = 1; j <10; j ++)
        cho (int k = 1; k <10; k ++)
          cho (int l = 1; l <10; l ++)
            if (Integer.parseInt (i + "" + j) + Integer.parseInt (k + "" + l) + Integer.parseInt (i + "" + k) + Integer.parseInt (j + "" + l) == 100) {
              System.out.println (i + "|" + j);
              System.out.println ("---");
              System.out.println (k + "|" + l + "\ n");
            }
  }
}


3
Gợi ý : 20*a + 11*(b + c) + 2*d == 100.
orlp 20/07/2015

Vâng, giải pháp này hoàn toàn là nối chuỗi - một nỗ lực đầu tiên rất khiêm tốn.
Denham Coote

1
Tôi chỉ đếm 436 byte , không phải 450. Ngoài ra, khoảng trắng là không cần thiết, điều này sẽ giúp bạn tiết kiệm một khoản đáng kể.
Alex A.

Hơn nữa, loại bỏ khoảng trắng không cần thiết, giá trị này sẽ gần hơn với 340 byte :)
Kade

1

PowerShell, 98

công thức của steveverrill thích nghi

:\>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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.