입방체 큐브의 얼굴 합산


13

입방체 큐브의 얼굴을 수동으로 합산하는 것은 입방체 자체에서 코드를 작성하는 것과 같이 지루하고 시간 소모적입니다.

에서 가장 효율적인 cubifier , 나는 입체적 소스에 ASCII 번역을 요청했다. 거기에 대한 답변 중 하나는 큐브 초기화 시퀀스를 사용한 다음 사전 초기화 된 큐브의 합계를 기반으로 결과 큐브를 수정합니다. 이 방법은 이후 많은 Cubically 관련 프로그램에서 사용되었습니다. 새로운 초기화 순서를 테스트 할 때는 모든 얼굴에 모든 값을 더해야하는데 보통 2 ~ 3 분이 걸립니다.

당신의 임무는 우리를 위해이 과정을 자동화하는 것입니다!

정수 n와 문자열의 두 가지 입력을 c받습니다. 이들은 명령 행 인수, 함수 인수, 표준 입력, 파일 또는 이들의 조합에서 읽을 수 있습니다. c될 것 입체적으로 메모리 큐브 크기의 n인터프리터에 의해 꽤 인쇄한다.

Cubically 인터프리터는 프로그램 종료시 큐브를 STDERR에 덤프하여 간단한보기를 위해 멋지게 형식화합니다. Cubically 인터프리터 에서 빈 프로그램을 실행 하고 디버그 섹션을 열어 초기화 된 큐브의 큐브 덤프를 확인하십시오. 44x4x4 또는 55x5x5 등 을 보려면 인수 를 추가 하십시오.

경우 n3, c이 형식을 (정수가 변수가 될 것이다) 따를 것이다 :

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

공백, 줄 바꿈 및 모두 경우 n4, c이 (또한 변수 정수와)과 같이 표시됩니다

    0000
    0000
    0000
    0000
1111222233334444
1111222233334444
1111222233334444
1111222233334444
    5555
    5555
    5555
    5555

등등.

프로그램은 6 개의 정수를 출력합니다. 첫 번째 정수는 윗면의 모든 숫자의 합입니다.

   000
   000          top face
   000
111222333444    left, front, right, and back faces, respectively
111222333444
111222333444
   555
   555          bottom face
   555

두 번째 정수는 왼쪽, 세 번째는 앞, 네 번째는 오른쪽, 다섯 번째는 뒷면 및 여섯 번째는 바닥의 합계입니다.

따라서 n3 c이었고 이것이 라면 :

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

프로그램이 출력 20 1 14 43 24 33됩니다.

추가 규칙 :

  • 출력 정수는 정수가 아닌 문자로 구분되어야합니다. 배열을 반환하도록 선택할 수도 있습니다.
  • 입력이 올바르다 고 가정 할 수 있습니다 n. 정수이고 Cubically의 디버깅 출력의c 큐브입니다 . 따라서 was and was 인 경우 프로그램이 중단되어 여전히 유효 할 수 있습니다.n3.0cfoo bar
  • 귀하의 프로그램은 n > 1및에 대해서만 작동하면 n < 1260됩니다. 크 거나 작은 큐브 크기를 처리하려고 시도 할 있지만 반드시 필요한 것은 아닙니다.

이것은 이므로 가장 짧은 코드가 승리합니다! 도움이 필요하면 Cubically 대화방 에 문의하십시오 .


입력이 직사각형이되도록 모든 후행 공백을 포함한다고 가정 할 수 있습니까?
fireflame241241

n모든 줄 다음에 공백이 있으면 @ fireflame241 덤프에는 포함되지 않습니다.
MD XF

1
실제로 "입방체"태그가 필요합니다.
Mr. Xcoder

@ Mr.Xcoder 상태 완료 :) 나도 그렇게 생각하고 있었고, Cubically 4 개의 ATM에 도전하고 있습니다.
MD XF

답변:



5

파이썬 (2) , 155 (150) 147 123 121 120 바이트

아마 꽤 골프 될 수 있습니다

편집 : 공백을 제거하는 더 좋은 방법을 사용하여 -5 바이트

편집 : @ Leaky Nun 덕분에 -3 바이트

편집 : 공백을 제거하지 않고 -24 바이트

편집 : 우선 순위를 활용하여 -2 바이트

lambda n,a:[sum(sum(map(int,b[j*n:][:n]))for b in a.split("\n")[i*n:][:n])for i in range(3)for j in range(~i%2,i%2*2+2)]

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



3

껍질 , 15 바이트

3 초 및 2 m

mṁṁiṁoC⁰TC⁰mf±¶

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

설명

                  Takes input as two arguments, the first being n, the second, the cube
              ¶   Split second argument into a list of lines
           m      For each line
            f±    keep only the digits (remove spaces)
         C⁰       Cut into lists of length n
    ṁ             Map then concatenate
        T           transpose
     oC⁰            then cut into lists of length n
mṁṁi              Takes list of lists of strings (or, in Husk, a list of lists of lists of chars) and returns the sum of the digits in each list
m                 Map function over list of lists
 ṁ                  map then sum
  ṁ                   map then sum
   i                  convert character to integer

1
mṁṁi정말 좋습니다!
Zgarb

3

옥타브, 64 59 54 바이트

@(c,n)sum(im2col(c'-48,[n n],'distinct'))([2 5:8 10])

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

이전 답변 :

@(c,n)sparse(kron((1:4)+[0;4;8],!!e(n)),1,c-48)([2 5:8 10])

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

배열을 출력으로 반환합니다.


내가 기대했던 것이 아니라 완벽하게 유효하며 정직하기 위해 나는 전혀 대답을 기대하지 않았습니다. +1
MD XF

@MDXF 무엇을 기대 했습니까?
rahnema1 1

나는이 짧은 대답이 나이 형식의 수용 문자열을 기대하지 않았습니다. 그러나 그것은 옥타브가하는 방식입니다. 나는 옥타브를 사용한 적이 없다.
MD XF



1

하스켈, 128 바이트

s n c=filter(>=0)$map(\[x,y]->sum$map(\[v,w]->fromEnum((lines c)!!(x*n+v)!!(y*n+w))-48)$n%n)$3%4
n%m=sequence[[0..n-1],[0..m-1]]

줄 바꿈이있는 문자열을 허용합니다.


1

PowerShell , 236 바이트

param($n,$z)
function f($y){$y-replace' '-split'(.)'-ne''-join'+'|iex}
$a=$z-split"`n"
f $a[0..($n-1)]
$a[$n..(2*$n-1)]|%{$x="($('.'*$n))";$1,$2,$3,$4=$_-split$x-ne'';$h+=$1;$i+=$2;$j+=$3;$k+=$4}
$h,$i,$j,$k|%{f $_}
f $a[(2*$n)..(3*$n)]

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

죄송합니다. 그러나 문자열을 나누고 자르는 것은 PowerShell의 강력한 장점 중 하나가 아니므로 다소 예상되는 것 같습니다. 또한-그래서. 많은. 불화.

매개 변수 $n$z크기 및 큐브 그물을 각각 취 합니다. 그런 다음 전체적으로 사용되는 함수를 구성합니다. 여기서 공백을 제거하고 각 숫자를 나누고 사이에 빈 문자를 제거하고 모든 문자를와 결합한 +다음 결과 문을 실행하여 숫자를 얻습니다. 예를 들어, 교대 "123"1+2+3실행하는가이다 6.

다음 줄은 줄 split바꿈에 입력 큐브 그물을 배열하여 결과를 array에 저장합니다 $a. 그런 다음 첫 번째 $n라인 에서 기능을 수행 하고 큐브의 윗면을 출력합니다.

다음 세트의 경우 큐브 크기를 기준으로 문자열을 스플 라이스해야합니다. 따라서 우리 $x는 적절한 정규 표현식 패턴 (예 : 크기 $n=3가 될 것입니다 "(...)")으로 구성하고 해당 패턴을 기반으로 문자열을 분할하고 빈 요소를 다시 제거하고 4 개의 얼굴을 나타내는 4 개의 변수에 저장합니다. 그런 다음 문자열을 h통해 연결 됩니다 k.

그런 다음 다음 줄 은 함수를 h통해 k전달되어 큐브의 측면 (왼쪽, 앞쪽, 오른쪽, 뒤쪽)을 출력합니다.

마지막으로 $n함수 의 마지막 라인을 실행 하여 큐브의 바닥면을 출력합니다.

모든 숫자는 파이프 라인에 남아 있으며 출력은 암시 적입니다.


1

APL (Dyalog Classic) , 30 27 바이트

{+/⍎¨6(⍺*2)⍴⍉⊃,⌿3⍺⍴⍵⊂⍨⍵∊⎕D}

@ Adám 덕분에 3 바이트가 줄었습니다.

n 은 c이다

설명

                        ⍵⊂⍨⍵∊⎕D   c partitioned by D (digits 0..9)
                    3⍺⍴           reshape into 3 by n matrix
                 ,⌿              concatenate on first axis (results in n vectors)
              ⍉⊃                  ravel transpose mix (results in a simple string with all digits in side order)
      6(⍺*2)⍴                     reshape into 6 by n squared matrix (one row per side)
 +/⍎¨                            sum rows execute each (execute will turn characters into numbers)

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


나에게 59 바이트처럼 보인다 . 교체 와 함께하는 ⎕U22865 바이트 불구하고 추가 할 것입니다.
Adám

나쁘고, 나는 파티션을 묶거나 묶지 않고 놀고 있었고 클래식 버전의 바이트 수 만 사용했습니다. 마이그레이션 수준 3을 사용하도록 내 대답을 편집합니다. :)
Gil

1
또한, 사이의 공간을 제거 할 수 있습니다 3.
Adám

1
(6,⍺*2) → 6(⍺*2)
Adám

1
IFAICT, 항상 올바른 인수를 라벨 순서로 사용하는 것처럼 ,나중에 필요하지 않습니다 .
Adám

0

큐빅으로 , 19 바이트

r%0@%1@%2@%3@%4@%5@

STDIN에서 큐브와 크기를 인터프리터에 대한 명령 행 인수로 가져옵니다. 윗면, 널 바이트, 왼쪽, 널 바이트, ... 밑면 및 널 바이트의 합계를 출력합니다.

온라인으로 사용해보십시오! ... 내 브라우저에서 null 바이트를 일종의 공백으로 표시합니다.

이 언어는이 도전에 대한 것이 아니라 언어에 대한 도전입니다. ;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.