최대 100을 더하는 조합을 그립니다.


13

각 모서리에는 한 자리 숫자의 상자가 있습니다.

1|2
---
3|4

왼쪽에서 오른쪽으로 행을 따라 숫자를 연결하면 12와 34가됩니다. 열을 따라 숫자를 위에서 아래로 연결하면 13과 24가됩니다.이 숫자를 모두 더하면 12 + 34 + 13 +가됩니다. 24 = 83.

도전

위와 같이 계산 된 합계가 100과 같은 모든 상자를 인쇄하는 프로그램을 작성하십시오.

각 모서리에 1과 9 사이의 단일 숫자가 있다고 가정하면 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 및 3119의 9 가지 조합이 있습니다 (0을 포함하면 25 개의 조합이 있습니다. 우리는이 도전에 대한 것이 아닙니다.)

12 + 34 + 13 + 24가 100이 아니기 때문에 예제 1234는 작동하지 않습니다.

입력

없음

산출

다음 형식의 답변 상자 :

A|B
---
C|D

출력은 STDOUT 또는 가장 가까운 대안으로 인쇄해야합니다.

규칙

  • AB + CD + AC + BD = 100
  • 각 모서리에는 양의 정수 1-9 만 포함됩니다.
  • 0은 제외됩니다.
  • 숫자는 두 번 이상 사용할 수 있습니다.
  • 위와 같이 상자를 그려야합니다. ( A|B\n---\nC|D\n)
  • 유효한 모든 답변을 출력해야합니다.
  • 추가 후행 줄 바꿈이 좋습니다.
  • 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.
  • 표준 허점과 T & C가 적용됩니다.

이것은 첫 번째 제출물이므로 명확하게해야 할 사항이 있으면 알려 주시기 바랍니다.


출력이 무엇인지 보여줄 수 있습니까? 또한 후행 줄 바꿈 문자는 어떻습니까?
Spikatrix

좋은 도전입니다. 어떤 숫자를 추가 해야하는지 명시 적으로 알려 주어야한다고 생각합니다. "연결된 두 자리 숫자와 PLUS 숫자 두 자리 숫자는 100과 같아야합니다." 충분히 명확하지 않습니다. 나는 1234의 예를 사용하여 알아 냈습니다. 또한 9 가지 조합 만 얻었습니다. 16 가지 조합을 말씀해 주시겠습니까?
Optimizer

1
설명과 서식을 약간 수정했습니다. 원래 의도와 일치하지 않으면 편집을 롤백하십시오.
Alex A.

1
@ DenhamCoote 실제로 세미 하드 코딩 된 솔루션은 세미 하드 코드이기 때문에 매우 흥미 롭습니다. 뻔뻔한 하드 코딩이 최선 / 가장 명백한 옵션 인 질문은 종종 흥미로운 답변을 얻지 못하기 때문에 규칙에 대한 예외가되었습니다.
Level River St

1
답변을 수락하면 질문이 끝났다는 인상을 줄 수 있으므로 잠시 동안 그대로 두겠습니다. 나중에 더 많은 답변을 받으면 수락을 변경할 수 있지만 시간이 없을 수 있습니다. 인기 콘테스트는 종종 게으르고 지나치게 광범위하기 때문에 종종 "가장 복잡한 방식으로 X를 수행"하기 때문에 싫어합니다. 일반적으로 인기있는 유일한 질문은 이미지 처리에 있으며, 여기서 인간 평가는 알고리즘이 좋은지 아닌지를 결정하는 유일한 방법입니다. 이미지 처리는 주제가 아닌 순수 예술을 배제합니다.
Level River St

답변:


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입니다. iA.의 세 가지 값을 순환 반복

B의 값은 1에서 1 사이의 값일 수 있으며 7-i*2B와 C의 총계는이어야합니다 14-A-D. 따라서 우리는 다음과 같은 표현을 얻습니다. 루비는 문자열에 줄 바꿈 문자를 넣을 수 있습니다''

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

4

자바 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

좋은 트릭입니다.
Optimizer

와. 배울 것이 많다. 설명 주셔서 감사합니다 :)
Denham Coote

3

하스켈 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의 그림에서 뻔뻔스럽게 도난당했습니다 (잘 연구했지만, Haskell에 문자를 표시하는 효율적인 방법이 없기 때문에 putStr $ unlines를 피하기가 어렵습니다).

그리고 ... 끝에 수식의 인수 분해를 제외하고는 여전히 읽을 수 있습니다 =)


3

하스켈 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

>>in "abcd">>[[1..9]]은 두 번째 요소의 사본 4 개 (길이 1 번째 매개 변수)로 목록을 만듭니다 [[1..9],[1..9],[1..9],[1..9]]. mapM id그 모든 조합, 즉의 목록을 만들어 [0,0,0,0][9,9,9,9]. 요약 된 것을 유지 100하고 상자로 문자열을 만듭니다. 모든 상자를 인쇄하십시오.

1 바이트에 대한 @Mauris에게 감사 드리며 3을 더 찾으려면 내 게시물을 검토하게하십시오.


mapM id바이트 대 sequence.를 저장합니다 .
Lynn

2

파이썬 2 145 129 바이트

나는 현재 설명 된 것보다 짧은 몇 가지 계산 방법을 사용하고 있지만 지금 가지고있는 것을 게시 할 것입니다.

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


1

파이썬 3, 159

빠르고 더러운.

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 바이트

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 이라는 아이덴티티를 활용합니다 .

언 골프 + 설명 :

# 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연결하고 인쇄 하는 함수는 값을 반환합니다 NULL. cat와 같은 함수 내에서 호출 apply하면 출력이 뒤에 NULL나오는데 이는 바람직하지 않습니다. 이 문제를 해결하는 데는 두 가지 방법이 있습니다. 변수에 변수를 할당하거나에 래핑하십시오 invisible. 여기서 나는 전자가 상당히 짧기 때문에 선택했습니다.

당신은 할 수 있습니다 온라인으로보십시오 .


1

자바, 450

내 첫 번째 (unolfed) 시도는 다음과 같습니다.

클래스 B {
  공개 정적 무효 메인 (문자열 [] a) {
    for (int i = 1; i <10; i ++)
      for (int j = 1; j <10; j ++)
        for (int k = 1; k <10; k ++)
          for (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
힌트 : 20*a + 11*(b + c) + 2*d == 100.
orlp

예,이 솔루션은 순전히 문자열 연결이었습니다. 매우 겸손한 첫 번째 시도입니다.
Denham Coote

1
450이 아닌 436 바이트 만 계산합니다 . 또한 공백이 필요하지 않으므로 상당한 양을 절약 할 수 있습니다.
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.