합계 그리드 생성


15

난수로 채워진 7 x 7 격자를 생성하십시오. 그러나 홀수 및 열 번호 (0부터 시작)가있는 셀에서는 주변 셀의 합계를 사용해야합니다. 다음은 3 x 3 그리드 (sum-square 굵은 체)가있는 작은 예입니다.

2 2  2
2 16 2
2 2  2

다음은 7 x 7 그리드의 예입니다.

6 5  4 3  7 2  5
6 43 3 50 8 43 8
4 7  8 8  9 3  1
4 36 1 43 6 40 5
3 3  6 1  4 7  5
4 35 3 45 9 42 1
2 6  8 6  8 5  3

규칙

  • 합계가 아닌 숫자는 항상 1에서 9 사이 여야합니다.

  • 그리드는 무작위로 생성되어야합니다. 합계가 아닌 각각의 셀에 관계없이 모든 숫자가 나타날 가능성이 동일해야합니다.

  • 숫자를 정렬해야합니다. 이것은 열에있는 각 숫자의 첫 번째 또는 마지막 숫자가 세로로 정렬되어야 함을 의미합니다. 중간 숫자는 항상 두 자리수라고 가정 할 수 있습니다.

  • 주변 셀에는 대각선이 포함됩니다. 따라서 각 합계 제곱에는 주위에 8 개의 숫자가 있으며 추가해야합니다.

  • 이므로 가장 짧은 코드가 승리 합니다.


3
이 있는가 첫 번째 숫자 그 라인까지로? 즉 마지막이 될 수 있습니까?
변동성

@Volatility 나는 올바른 정렬이 효과가 있다고 생각합니다. 수정
Doorknob

언어에 난수 생성기가없는 경우 어떻게합니까?
Heimdall

답변:


14

APL, 53 49 43 42 40 39 36

나는 ;.APL에서 J를 복제 하고 Gareth의 접근 방식 을 사용하여 13 문자를 절약했습니다.

{×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1

샘플 실행 :

      {×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1
9  9 6  1 7  5 6
7 55 5 39 9 54 9
9  8 2  1 8  1 9
2 43 8 41 6 42 5
7  3 4  4 8  3 2
2 29 1 26 2 35 8
6  4 2  3 2  3 7

설명:

  • ∘.∨⍨9⍴0 1 비트 마스크를 생성합니다.
  • ×∘?∘9¨ 각 비트에 1에서 9까지의 임의의 값을 곱하여 마스크 된 난수 격자를 생성합니다.
  • 3,⌿3,/은 해커로만 설명 할 수있는 것을 사용하여 마스킹 된 배열에서 3 x 3 개의 겹치는 상자를 반환합니다. 이것들은 또한 과정에서 납작해진다.
  • {×5⌷⍵:5⌷⍵⋄+/⍵}¨각 요소를에 할당하여 배열을 반복합니다 . 각 반복에 대해 다섯 번째 (중간, APL 색인화는 1 기반임을 기억)를 취하고 부호를 리턴합니다. 이 경우 숫자가 0보다 큰지 테스트하는 것과 같습니다. 1을 반환하면 (true) 해당 요소를 반환합니다. 그렇지 않으면 평평한 3 x 3 상자에있는 요소의 합계를 반환하십시오. :⋄삼항 연산자를 사용하는데 , 이는 ?:많은 언어에서 와 동일 합니다.

어 오. 더 많은 캐릭터 절약을 찾아야 할 것 같습니다. : -S
Gareth

@Gareth 잘, 우리가 여기있는 것을보십시오. 내가 선두에 돌아왔다 : P
변동성

NOOOOOOOOOO !!!!!!! :-(
Gareth

13

J, 63 61 59 55 52 51 49 47 39 37 자

3 3(4&{+4{*|+/)@,;._3(**1+?)+./~9$0 9

그의 10 문자 절약에 대한 변동성 덕분에 .

설명 (각 단계마다 다른 난수를 갖습니다 ...) :

난수 생성을위한 마스크를 생성합니다 $.

   9 9$9$0 9
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0

이제 우리는 갈고리가 있습니다. 이것은 실제로 이전 버전을 엉망으로 만들었을 때의 행복한 사고입니다. 원래와 함께 바꾸 |:거나 OR 로 사용해야했습니다 +.. 당시에 1과 0을 사용하고 있었지만 이제는 9와 0이 있습니다. GCD의 의미와 동일한 방식으로 작동합니다 +.. 운이 좋다 :-)

   (+.|:)9 9$9$0 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0

이제 9와 0의 격자가 생겼으므로 임의의 숫자를 생성하려고합니다. ?0에서 주어진 숫자까지 (포함하지는 않음) 난수를 생성합니다. 리스트가 주어지면리스트의 각 멤버에 대해 이런 방식으로 하나의 난수를 생성합니다. 따라서이 경우 테이블의 9마다 0에서 8까지의 숫자를 생성하고 각 0에서 0에서 1의 부동 소수점 숫자를 생성합니다.

   ?(+.|:)9 9$9$0 9
 0.832573 7 0.926379 7 0.775468 6 0.535925 3  0.828123
        7 0        5 5        4 3        4 5         4
0.0944584 2 0.840913 2 0.990768 1 0.853054 3  0.881741
        3 8        7 0        8 3        3 4         8
 0.641563 4 0.699892 7 0.498026 1 0.438401 6  0.417791
        6 8        7 5        2 3        6 6         3
 0.753671 6 0.487016 4 0.886369 7 0.489956 5  0.902991
        3 4        7 8        1 4        8 0         8
0.0833539 4 0.311055 4 0.200411 6 0.247177 5 0.0464731

그러나 0에서 8이 아닌 1에서 9까지의 숫자를 원합니다. 따라서 1을 더합니다.

   (1+?)(+.|:)9 9$9$0 9
 1.4139 4  1.7547 7 1.67065 4 1.52987 1 1.96275
      2 8       2 4       3 9       6 9       9
1.15202 7 1.11341 5  1.0836 1 1.24713 2 1.13858
      9 3       3 2       4 7       3 8       6
1.06383 9 1.67909 4 1.09801 8  1.4805 6  1.0171
      9 5       5 5       9 5       9 4       3
1.22819 1 1.85259 4 1.95632 6 1.33034 3 1.39417
      4 2       5 1       3 7       2 5       6
1.06572 5  1.9942 5 1.78341 5 1.16516 6 1.37087

이것은 매우 좋지만 원하는 0을 잃어 버렸으므로 9를 모두 1로 바꾼 후 원래 마스크로 곱합니다. 값이 1보다 큰지 확인 하여이 작업을 수행합니다 (1&<*1+?).
여기 몇 가지 일이 있습니다.

  • 우리는 많은 작업을 매우 적은 문자로 묶을 수 있는 포크 를 만들었습니다 .
  • 우리는 &1을 <동사에 붙였습니다.

따라서 모든 결합 된 (1&<*1+?)임의의 숫자를 생성하고 원래 그리드에서 0으로 생성 된 모든 숫자를 0으로 만듭니다.

   (1&<*1+?)(+.|:)9 9$9$0 9
0 3 0 2 0 7 0 1 0
9 5 2 7 7 1 4 5 7
0 6 0 8 0 3 0 1 0
4 8 7 5 9 7 7 9 4
0 9 0 6 0 9 0 9 0
6 1 2 1 4 6 8 9 4
0 3 0 8 0 6 0 6 0
2 5 2 2 2 2 3 9 3
0 9 0 3 0 5 0 3 0

다음 비트는 (내 의견으로는 어쨌든 :-) 영리한 비트입니다.
절단 ;.동사 형태 가지고 x u;._3 y설명 상자에 입력을 절단 x하고 동사 적용 u그들있다. 이 경우 우리는이 3 3(4&{++/*0=4&{)@,;._3.

  • 3 3우리가 원하는 상자를 설명한다 - 3 × 3을.
  • (4&{++/*0=4&{)@,우리가 각 상자에 수행 할 작업을 설명하는 동사 열차입니다.

각 상자를 표시 ;.하는 <데 사용할 동사 를 설명하려면 :

   3 3(<);._3(1&<*1+?)(+.|:)9 9$9$0 9
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 8 0│8 0 7│0 7 0│7 0 4│0 4 0│4 0 3│0 3 0│
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
│0 9 0│9 0 3│0 3 0│3 0 4│0 4 0│4 0 3│0 3 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘

알아 두어야 할 사항 :

  • 상자가 겹칩니다-왼쪽 상단 상자의 두 번째 및 세 번째 열은 오른쪽 상자의 첫 번째 및 두 번째 열입니다.
  • 7x7 상자가 있습니다. 그렇기 때문에 처음 9x9 그리드를 사용했습니다.
  • 합계가 필요한 각 장소는 0상자의 중앙에 있습니다.

이제 중앙의 값을 다시 전달하거나 (0이 아닌 경우) 3x3 상자의 숫자를 합산하면 (중심이 0 인 경우) 필요합니다.
이를 위해서는 센터 번호에 쉽게 접근 할 수 있어야합니다. ,여기에 도움이됩니다. 이 4 번에서 중심 번호 9 개 항목의 목록에 3 × 3 격자를 회전
4&{사용 {0과 비교 한 후 중심 값을 꺼내하고 : 0=4&{. 이것은 a 0또는 1true 또는 false를 반환 한 다음 sum을 곱합니다 +/. 중앙에 0이면 필요에 따라 합계가 표시됩니다. 우리가 0이 아니었다면 마무리하기 위해 중심 값을 추가하십시오 4&{+.
이것은 동사 기차를 제공합니다(4&{++/*0=4&{)@,

   3 3(4&{++/*0=4&{)@,;._3(1&<*1+?)(+.|:)9 9$9$0 9
2  6 9  3 7  9 7
3 47 6 51 5 49 5
3  9 9  6 6  2 8
7 48 6 47 1 37 5
5  4 5  7 7  2 6
5 35 3 49 8 51 9
1  6 6  6 7  4 8

한 줄의 코드가 난수 생성을 포함하여 모든 것을 수행합니까? 안심하십시오. 믿기 ​​어려운 것을 발견했습니다.
DavidC

믿기 ​​어려울 정도로 힘들다. 임의의 비트는에 의해 수행됩니다 ?. 최신 버전을 반영하도록 설명을 변경하겠습니다.
Gareth

@DavidCarraher J의 대부분 동사는 1 ~ 2 자이므로 47자가 많은 작업을 처리 할 수 ​​있습니다.
Gareth

9x9 상자를 7x7 겹치는 사각형으로 자르는 것은 분명히 영리한 비트입니다. 10 분도 채 안되어 현재 GolfScript 구현을 7.5 % 향상시킬 수있었습니다.
피터 테일러

글쎄, 그것은 나를 위해 드로잉 보드로 돌아온 것처럼 보입니다.
변동성

5

루비 (135 자)

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

샘플 출력

2  1  6  9  4  5  1  
9  34 4  37 2  31 3  
7  2  3  1  8  1  7  
5  42 4  40 2  47 9  
3  9  9  4  9  4  7  
3  44 4  41 2  47 4  
6  9  1  5  7  6  8  

고장

이것이 어떻게 작동하는지 너무 명확하지 않으므로 여기에 빠른 고장이 있습니다. 참고 : 아마도이 단계 중 일부를 건너 뛰고 더 짧은 버전으로 더 빨리 이동할 수는 있지만 문자를 깎은 다른 방법을 볼 수있을 정도로 교육적이라고 생각합니다. 특히 리터럴 패턴을 발견하여 2 자리 숫자를 1 자리 버전으로 바꿉니다. .

순진한 버전

2 차원 배열에 의존 하는 다른 루비 솔루션 과 달리, 1 차원 배열로 시작하여 오프셋 값으로 작업함으로써 패턴이 반복되므로 더 짧은 버전을 얻을 수 있습니다.

ary=(0..48).map { rand(9) + 1 }

offsets = [-8,-7,-6,-1,1,6,7,8]

3.times do |i|
  [8,10,12].each do |j|
    ary[j + 14*i] = ary.values_at(*offsets.map { |e| j+14*i + e }).inject(:+)
  end
end

ary.each.with_index do |e,i|
  $> << ("%-3s" % e)
  $> << ?\n if i % 7==6
end

여기서 핵심 원리는 인덱스 위치 8, 10, 12에서 14의 배수로 상쇄하는 것입니다. 위치 8, 10 및 12는 요약 할 3x3 그리드의 중심입니다. 샘플 출력에서 ​​34는 위치 8, 42는 위치 8 + 14 * 1 등 입니다. [-8,-7,-6,-1,1,6,7,8]즉 , 위치 8에서 위치 오프셋을 기준으로 위치 8을 34로 대체 34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])합니다. [8 + 14*i, 10 + 14*i, 12 + 14*i]패턴이 반복되므로 동일한 원리가의 모든 값에 적용 됩니다.

그것을 최적화

먼저 몇 가지 빠른 최적화 :

  • 매번 3.times { ... }계산 하는 대신 j + 14*i위치를 "인라인"합니다 [8,10,12,22,24,26,36,38,40].
  • offsets배열 때문에 문자와 변수를 대체 한 번 사용된다.
  • 교체 do ... end{...}와에 인쇄 주위 전환 $> << foo. (여기에 포함 트릭있다 puts nil() == nil.)
  • 더 짧은 변수 이름.

이 후의 코드는 177 자입니다.

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[-8,-7,-6,-1,1,6,7,8].map{|e|j+e}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

다음 축소의 inject경우 오프셋 배열이 순서대로 필요하지 않습니다. [-8,-7,-6,-1,1,6,7,8]덧셈은 교환 적이므로 다른 순서 를 가질 수도 있고 다른 순서 를 가질 수도 있습니다 .

먼저 긍정과 부정을 쌍을 이루십시오 [1,-1,6,-6,7,-7,8,-8].

이제 짧아 질 수 있습니다

[1,-1,6,-6,7,-7,8,-8].map { |e| j+e }.inject(:+)

[1,6,7,8].flat_map { |e| [j+e, j-e] }

결과

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

어떤는 176 개 문자.

8만큼 이동하여 차이점으로 이동

두 문자 리터럴 값은 짧아 질 수있는 것처럼 보이므로 루프 시작시 업데이트 하여 [8,10,12,22,24,26,36,38,40]모든 것을 아래로 내리십시오 . (참고 것을 피한는의 오프셋 값을 갱신 할 필요 ).8j+=81,6,7,8

a=(0..48).map{rand(9)+1}
[0,2,4,14,16,18,28,30,32].each{|j|j+=8;a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

이것은 179로, 더 크지 만 j+=8실제로 제거 할 수 있습니다.

첫 번째 변화

[0,2,4,14,16,18,28,30,32]

차이점의 배열 :

[2,2,10,2,2,10,2,2]

이 값을 초기 값에 누적하여 추가합니다 j=8. 이것은 결국 같은 값을 다룰 것입니다. (아마도 8만큼 먼저 이동하는 대신 이것을 바로 건너 뛸 수 있습니다.)

우리는 또한의 더미 값을 추가 할 것입니다 점에 유의 9999차이 배열의 끝에 및 추가 j상기 이 아닌 시작 루프를. 정당화는 3 번 반복되는 동일한 3 개의 숫자에 끔찍하게2,2,10,2,2,10,2,2 보이고 , 루프 끝에서 계산 함으로써 최종 값은 실제로 출력에 영향을 미치지 않습니다. 어떤 가치가 있는 호출 이 없기 때문입니다 이상 .j+difference9999a[j]j10000

a=(0..48).map{rand(9)+1}
j=8
[2,2,10,2,2,10,2,2,9999].each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

이 차이점 배열을 사용하면 물론 j+=8이제는 그냥 그렇습니다. j=8그렇지 않으면 반복적으로 8너무 많이 추가하기 때문입니다. 또한 블록 변수를에서 j로 변경 했습니다 l.

따라서 9999요소는 출력에 영향을 미치지 않기 때문에 요소를 변경 10하고 배열을 줄일 수 있습니다 .

a=(0..48).map{rand(9)+1}
j=8
([2,2,10]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

이다 170 개 문자.

그러나 이제는 j=8외형이 약간 어수선 해져 2 개씩 [2,2,10]아래로 이동 하여 2 개 문자를 절약 하여 편리하게 8할당 할 수 있습니다. 이것 또한 j+=l되어야 j+=l+2합니다.

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

이다 169 개 문자. 7자를 짜는 둥근 길이지만 깔끔합니다.

최종 조정

values_at호출은 실제로 일종의 중복이다, 우리는 인라인 수있는 Array#[]전화를. 그래서

a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)

된다

[1,6,7,8].flat_map{|e|[a[j+e],a[j-e]]}.inject(:+)

또한 배열 의 이니셜 을 사용하여 flat_map+ j+e/j-e+ inject를 더 직접적인 합계로 줄일 수 있음을 알 수 있습니다 0.

이렇게하면 152자가 됩니다.

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

드디어:

  • map.with_index될 수 있습니다 each_slice.
  • 인쇄 방식을 변경하십시오.

135 :

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

당신은 대체 할 수 each와 함께 map한 바이트를 위해.
Jordan

3

파이썬, 132

각 숫자의 마지막 숫자가 첫 번째 숫자가 아니라 정렬되므로 기술적으로 규칙을 충족하지 않습니다. 그러나 나는 어쨌든 공유 할 것이라고 생각했다.

import numpy
G=numpy.random.randint(1,10,(7,7))
G[1::2,1::2]=sum(G[i:6+i:2,j:6+j:2]for i in[0,1,2]for j in[0,1,2]if i&j!=1)
print G

샘플 출력 :

[[ 8  9  8  3  8  5  8]
 [ 6 53  4 45  8 53  8]
 [ 8  2  8  1  5  3  8]
 [ 2 40  6 34  1 32  7]
 [ 4  1  9  1  3  3  2]
 [ 4 35  7 35  6 31  1]
 [ 1  7  2  5  2  8  6]]

3

매스 매 티카, 108

s=#-1;;#+1&;g=1+8~RandomInteger~{7,7};Column/@
ReplacePart[g,{i_?EvenQ,j_?EvenQ}:>g〚s@i,s@j〛~Total~2-g〚i,j〛]

결과

더 예민한 출력 Column/@을 위해 TableForm@2 문자의 비용 으로 교체 할 수 있습니다 .


매우 영리합니다. Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]Transpose를 하나의 문자로 계산하면 Mathmatica에서 더 깔끔한 출력을 제공하고 두 개의 문자를 저장합니다. Btw, Wolfram의 OneLinerSubmission 템플릿은 106 문자, 한 문자 Transpose로 105를 계산했습니다.
DavidC

@DavidCarraher 감사합니다. 문자 수는 줄 바꿈이 필요없고 :>하나의 기호이지만 유니 코드의 개인 사용 영역에 있습니다. 타당성 후에도 유효성 합산 규칙이 적용되므로 전치사를 제거 할 수도 있습니다. 그러나 Grid추가 옵션없이 항목을 정렬하지 않는 것 같습니다 (v8)
ssch

Grid열의 숫자를 가운데에 맞 춥니 다. 기술적으로는 문제를 해결하지 못하지만 표시된 표에 목록을 표시하는 것보다 낫습니다.
DavidC

아주 좋아요 난 그냥 단지 내가 사용, 같은 일을 만들어 상당한 시간을 할애 Part하고 Tuples. 곧 게시
Mr.Wizard

다음과 같이 두 문자를 저장할 수 있습니다.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
Mr.Wizard

3

GolfScript ( 79 78 72 70 68 66 65 60 자)

56,{13%5<,~9rand)}%9/`{>3<zip`{>3<(*(+(\{+}*or' '}+7,%n}+7,/

NB 여기에는 마크 다운이 포함되어있어 마크 다운이 잘릴 수 있습니다.

영리한 비트는 Gareth 때문입니다. J 솔루션을 참조하십시오.

온라인 데모


3

R : 114 자

a=array(sample(1:9,49,r=T),c(7,7))
for(i in 2*1:3){for(j in 2*1:3)a[i,j]=sum(a[(i-1):(i+1),(j-1):(j+1)])-a[i,j]}
a

첫 번째 줄은 1에서 9까지 무작위로 선택된 숫자로 채워진 7 x 7 배열을 만듭니다 (교체와 함께 균일 분포, 따라서 r=T 약자 replace=TRUE). 두 번째 줄은 3 x 3 그리드의 합계를 빼고 중심을 빼고 결과로 바꿉니다. 세 번째 줄은 결과 그리드를 인쇄합니다 (기본적으로 행렬 및 배열 열은 오른쪽 정렬 됨).

출력 예 :

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    8    5    6    4    3    2    2
[2,]    1   37    6   41    7   38    8
[3,]    5    3    3    3    9    4    3
[4,]    4   31    3   41    3   44    9
[5,]    3    5    5    9    6    7    3
[6,]    3   32    2   40    4   37    5
[7,]    8    2    4    1    9    1    2

2

J, 67 65 바이트

J의 순진하고 장황한 솔루션. 작업을 간단하게 구현합니다.

(+/^:_"2((,&.>/@(<:,],>:)"0)&.>m){0 m}a)(m=.{;~1 3 5)}a=.>:?7 7$9

먼저 1에서 9 사이의 정수로 구성된 7 x 7 배열을 만듭니다. 실제로 J는? 동사는 인수까지 숫자를 생성하기 때문에 각 요소>>를 증가시켜야합니다.

a=.>:?7 7$9 
2 8 7 4 5 1
4 5 4 1 6 7 9
3 8 3 6 5 3 3
6 8 6 3 7 7 1
7 7 4 5 9 9
2 3 6 5 2 2 9
2 6 8 8 1 3

홀수 행 / 열 셀의 제로화에 사용할 마스크, 홀수 행 / 열 인덱스 쌍을 준비합니다.

m=.{;~1 3 5
┌───┬───┬───┐
│1 1│1 3│1 5│
├───┼───┼───┤
│3 1│3 3│3 5│
├───┼───┼───┤
│5 1│5 3│5 5│
└───┴───┴───┘

카탈로그 동사 {는 박스 목록 안에있는 원자의 항목을 결합합니다.

┌─────┬─────┐
│1 3 5│1 3 5│
└─────┴─────┘

카탈로그, 위의 쌍의 3x3 테이블을 형성

그런 다음 각 3x3 하위 배열을 선택하는 데 사용할 행 / 열 인덱스 테이블을 준비합니다.

s=.(,&.>/@(<:,],>:)"0)&.>m
┌─────────────┬─────────────┬─────────────┐
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││0 1 2│0 1 2│││0 1 2│2 3 4│││0 1 2│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││2 3 4│0 1 2│││2 3 4│2 3 4│││2 3 4│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││4 5 6│0 1 2│││4 5 6│2 3 4│││4 5 6│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
└─────────────┴─────────────┴─────────────┘

m 배열의 각 쌍에 대해 m 쌍의 각 수를 중심으로 삼중 쌍을 만듭니다.

        ┌─────┬─────┐
 1 3 -> │0 1 2│2 3 4│
        └─────┴─────┘

이 삼중 항 쌍은 J From 동사 {에서 사용하며, 여러 행과 열을 동시에 선택할 수 있습니다. 0 1 2 / 2 3 4는 열 2, 3 및 4와 함께 행 0, 1 및 2를 선택하여 상단에서 두 번째 3x3 하위 배열을 선택 함을 의미합니다.

마지막으로 7x7 배열과 마스크를 사용하여 작업을 수행 할 수 있습니다. 먼저 m을 마스크로 사용하여 해당 요소를 0으로 설정합니다.

0 m}a

그런 다음 s를 선택기로 사용하여 모든 3x3 하위 배열을 가져 와서 합계를 찾습니다.

+/^:_"2 s{0 m}a

그런 다음이 숫자를 다시 시작 배열에 넣습니다.

 (+/^:_"2 s{0 m}a)m}a 
2 8 7 4 5 1
4 39 4 39 6 36 9
3 8 3 6 5 3 3
6 44 6 40 7 42 1
7 7 4 5 9 9
2 36 6 43 2 46 9
2 6 8 8 1 3

온라인으로 사용해보십시오!



1

루비, 207

나는 항상 해결책을 먼저 제시 할 것이다.

a=Array.new(7){Array.new(7){rand(9)+1}}
s=[-1,0,1]
s=s.product s
s.slice!4
r=[1,3,5]
r.product(r).map{|x|u=0
s.map{|y|u+=a[x[0]+y[0]][x[1]+y[1]]}
a[x[0]][x[1]]=u}
puts a.map{|x|x.map{|y|y.to_s.ljust 3}.join

1

루비, 150 자

v=(a=0..6).map{a.map{rand(9)+1}}
(o=[1,3,5]).map{|i|o.map{|j|v[i][j]=0
(d=[0,-1,1]).map{|r|d.map{|c|v[i][j]+=v[i+r][j+c]}}}}
puts v.map{|r|"%-3d"*7%r}

왼쪽 정당화 요구 사항 정당화가 ljust사용되어야 하는 것이라면 ... 나는 루비의 포맷 기능을 좋아한다.

사용하지 마십시오 Array.new(7){...}. (0..6).map{...}더 짧고 읽기 쉬우 무료로 할당 가능한 범위를 얻습니다.

3 번째 줄은 Doorknob의 솔루션에서 영감을 얻은 입니다.


1

GolfScript, 87 자

49,{.1&\7/1&!|9rand)*}%.7/{[..1>@0\+]zip{{+}*}%);}:^%zip{^~}%]zip{.0=!=}%{'  '+3<}%7/n*

안에 너무 많은 지퍼가 있습니다 ... ( 온라인 참조 )

3  9  9  3  3  9  8  
6  46 2  50 3  39 8  
7  3  7  2  4  7  3  
8  33 9  51 8  49 5  
4  3  9  9  3  9  2  
1  45 9  41 6  33 2  
4  3  6  1  6  1  4  

1

J, 58/64/67 자

0j_1":(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

사양에는 숫자를 왼쪽 정렬해야하지만 소수점 표기법을 사용할 필요는 없으므로 유효한 출력이라고 생각합니다.

1.0e0 8.0e0 9.0e0 6.0e0 2.0e0 9.0e0 6.0e0
6.0e0 3.9e1 8.0e0 4.0e1 2.0e0 3.8e1 4.0e0
1.0e0 4.0e0 2.0e0 8.0e0 3.0e0 9.0e0 3.0e0
2.0e0 2.4e1 5.0e0 4.1e1 9.0e0 4.7e1 8.0e0
1.0e0 3.0e0 6.0e0 5.0e0 3.0e0 5.0e0 7.0e0
4.0e0 3.0e1 1.0e0 2.3e1 1.0e0 3.1e1 1.0e0
6.0e0 5.0e0 4.0e0 2.0e0 1.0e0 5.0e0 8.0e0

왼쪽 정렬 대신 오른쪽 정렬이 허용되는 경우 58 자입니다.

(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

J ":(형식)에는 세 가지 형식 모드가 있습니다.

  • n 자리 또는 수축 랩 (오른쪽 표시)과 오른쪽 정렬
  • n 자리 숫자와 m 개 문자의 왼쪽 정렬 과학 표기법
  • (왼쪽 / 중앙 / 오른쪽)-(상단 / 중간 / 하단) 정렬 (아래, 69 자)이있는 수축 포장 상자 표시

가장 장황하지만 다목적이며 예제에 따라 출력을 생성 할 수있는 유일한 것은 8!:2형식화 외부 문자열이며 형식화 문자열을 왼쪽 인수로 사용합니다. 또한 67 자 :

'l3.'8!:2(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

박스 형식은 다음과 같습니다.

 0 0":<"0(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

 ┌─┬──┬─┬──┬─┬──┬─┐
 │2│6 │5│7 │5│7 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│40│4│35│9│49│6│
 ├─┼──┼─┼──┼─┼──┼─┤ 
 │6│7 │2│2 │1│9 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│41│9│35│3│45│7│
 ├─┼──┼─┼──┼─┼──┼─┤
 │3│1 │5│6 │7│8 │4│
 ├─┼──┼─┼──┼─┼──┼─┤
 │7│37│4│45│6│48│8│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│4 │5│4 │8│1 │6│
 └─┴──┴─┴──┴─┴──┴─┘

1

펄, 117 자

print$_,++$j%7?$":$/for map{++$i/7&$i%7&1?
eval join"+",@x[map{$i+$_,$i-$_}1,6,7,8]:" $_"}@x=map{1+int rand 9}$i--..48

이것은 for 루프 중 하나를 제외한 모든 루프가 축소 된 Perl 스크립트 중 하나입니다. map 호출 모든 것을 단일 명령문으로 수행 할 수 . 전역 변수도 이것에 중요한 것으로 보입니다. 내가 여기서 말하려는 것은이 프로그램이 다소 거칠다는 것입니다.

잠깐만, 점점 나 빠진다 : 스크립트에 알려진 버그가있다! 그러나 백만 분의 일의 확률로 촉발 될 수 있으므로 아직 해결하지는 못했습니다.


우리를 막지 말고, 버그는 무엇입니까?

그것을 처음 발견 한 사람에게 보너스 포인트!
breadbox September

1

수학 , 106/100

나는 그것을보기 전에 ssch의 코드와 매우 비슷한 것을 생각해 냈습니다. 나는 그의 사용 아이디어를 빌리고있다 Column. ASCII 만 사용하면 106 :

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a[[##]]=a[[s@#,s@#2]]~Total~2-a[[##]];&@@@{2,4,6}~Tuples~2
Column/@a

ssch에서 사용되는 유니 코드 문자를 사용하면 100 :

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a〚##〛=a〚s@#,s@#2〛~Total~2-a〚##〛;&@@@{2,4,6}~Tuples~2
Column/@a

1

Excel VBA, 74 바이트

로 출력되는 VBE 즉시 기능 [B2:H9].

[B2:H9]="=IF(ISODD(ROW()*COLUMN()),SUM(A1:C1,A2,C2,A3:C3),INT(RAND()*8)+1)

샘플 출력

여기에 이미지 설명을 입력하십시오


1

Powershell, 149148 바이트

@AdmBorkBork 덕분에 -1 바이트. 춥다!

$i=-1
($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
-join($a|%{if(!(++$i%7)){"
"};'{0,3}'-f$_})

설명:

$i=-1                       # let $i store -1
($a=                        # let $a is array of random numbers with zero holes
    (,1*8+0,1*3)*3+,1*7|    # the one-dimension array equals
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
    %{                      # for each element
        $_*(1+(Random 9))   # multiply 0 or 1 element to random digit from 1 to 9
    }                       # now $a stores values like (* is a random digit from 1 to 9)
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
)|?{++$i;!$_                # calc index $i and passthru values == 0 only
}|%{                        # for each zero value cell with index $i
    6..8+1|%{               # offsets for the surrounding cells
                            #  .  .  .
                            #  .  x +1
                            # +6 +7 +8  
        $_,-$_              # add the mirror offsets 
                            # -8 -7 -6
                            # -1  x +1
                            # +6 +7 +8  
    }|%{                    # for each offset 
        $a[$i]+=$a[$i+$_]   # add surrounding values to the cell
    }
}
                            # display the $a
-join(
    $a|%{                   # for each value of $a
        if(!(++$i%7)){"`n"} # line break for each 7 cells
        '{0,3}'-f$_         # formatted value of $a with width = 3 char and align right
    }
)                           # join all values to string

1
$a할당을 parens 로 캡슐화 하고 다음 줄을 위로 이동하여 하나의 큰 줄을 만들면 바이트 (줄 바꿈)를 제거 할 수 있습니다.($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
AdmBorkBork

아니요. 작동하지 않습니다. 전에 배열을 완전히 채워야합니다 $a[$i+$_]. 여기 두 단계가 있습니다. 하나의 파이프에 여러 차례 캡슐화를 시도했습니다. :)
mazzy

1
과제 주위에 parens를 배치하지 않으면 작동하지 않습니다. 와 ($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))}), $a완전 다음 파이프 라인 인스턴스 전에 채워집니다. 그것은 작동해야합니다 (적어도 나를 위해).
AdmBorkBork

0

Mathematica 142151172 179

암호

z = (m = RandomInteger[{1, 9}, {7, 7}]; s = SparseArray; o = OddQ; e = EvenQ; i = {1, 1, 1};
(m + ArrayPad[ListCorrelate[{i, i, i}, m] s[{{i_, j_} /; o@i \[And] o@j -> 1}, {5, 5}], 1]
- 2 m s[{{i_, j_} /; e@i \[And] e@j -> 1}, {7, 7}]) // Grid)

용법

z

m8


당신은 0s가 있습니다; 규칙 1-9
Doorknob

감사. 데이터와 사진을 수정했습니다. 기능은 변경되지 않습니다.
DavidC

또한 숫자는 질문에 지정된대로 정렬되지 않습니다.
Doorknob

Mathematica의 말씨 (또는 더 정확하게 말하면 큰 단어를 사용해야한다는 주장)가 분명해집니다.
DavidC

0

Julia 0.6 , 127 (89) 바이트

x=rand(1:9,7,7);[x[i,j]=sum(!(0==k==l)*x[i+k,j+l]for k=-1:1,l=-1:1)for i=2:2:7,j=2:2:7]
Base.showarray(STDOUT,x,1<1;header=1<1)

온라인으로 사용해보십시오!

기본 디스플레이를 사용하는 89 바이트. 추가 행을 인쇄 할 수있는 경우 허용 될 수 있습니다.

7×7 Array{Int64,2}:
6   6  8   2  3   2  3
7  44  5  33  4  23  5
3   8  1   9  1   3  2
4  41  2  37  5  22  2
7   8  8   8  3   4  2
9  53  6  44  7  36  3
7   7  1   9  2   6  9

0

자바 10 262 260 248 239 바이트

v->{int a[][]=new int[7][7],i=49,j,k;for(;i-->0;)a[i/7][i%7]+=Math.random()*9+1;var r="";for(;++i<7;r+="\n")for(j=0;j<7;r+=(k=a[i][j])>9|j++%2<1?k+" ":k+"  ")if(i*j%2>0)for(a[i][j]=k=0;k<9;k++)a[i][j]+=k!=4?a[i+k/3-1][j+k%3-1]:0;return r;}

@ceilingcat 덕분에 -12 바이트 .

설명:

여기에서 시도하십시오.

v->{                        // Method with empty unused parameter and String return-type
  int a[][]=new int[7][7],  //  Integer-matrix with 7x7 zeroes
      i=49,j,k;             //  Index integers (`i` starting at 49)
  for(;i-->0;)              //  Loop `i` in the range (49, 0]:
    a[i/7][j%7]+=Math.random()*9+1;
                            //   Fill the current cell with a random 1..9 integer
  var r="";                 //  Result-String, starting empty
  for(;++i<7;               //  Loop `i` in the range [0, 7):
      r+="\n")              //    After every iteration: append a new-line to the result
    for(j=0;j<7;            //   Inner loop `j` in the range [0, 7):
        r+=                 //     After every iteration: append the result-String with:
           (k=a[i][j])>9    //      If the current number has 2 digits,
           |j++%2<1?        //      or it's an even column (indices 0/2/4/6)
            k+" "           //       Append the current number appended with one space
           :                //      Else:
            k+"  ")         //       Append the current number appended with two spaces
      if(i*j%2>1)           //    If both indexes `i` and `j` are odd
        for(a[i][j]=k=0;    //     Reset both the current item and index `k` to 0
            k<9;k++)        //     Inner loop `k` in the range [0, 9):
          a[i][j]+=         //      Sum the item at location `i,j` with:
           k!=4?            //       If `k` is not 4 (the current item itself)
            a[i+k/3-1][j+k%3-1]
                            //        Sum it with the numbers surrounding it
           :                //       Else:
            0;              //        Leave it the same by adding 0
  return r;}                //  Return the result-String

@ceilingcat 감사합니다! 그리고 var대신 String+=Math.random()*9+1;대신 몇 바이트를 더 저장할 수있었습니다 =(int)(Math.random()*9+1);. 실제로 내 대답을 모두 방문하는 것이 좋습니다. : D
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.