Tổng hợp khuôn mặt của khối lập phương


13

Tổng hợp thủ công các khuôn mặt của khối lập phương là tẻ nhạt và tốn thời gian, giống như viết mã trong chính Cuba.

Trong phần lập phương hiệu quả nhất , tôi đã yêu cầu bạn dịch ASCII sang nguồn gốc. Một trong những câu trả lời ở đó sử dụng chuỗi khởi tạo khối và sau đó sửa đổi khối kết quả dựa trên tổng của khối được khởi tạo trước. Phương pháp này đã được sử dụng trong nhiều chương trình liên quan đến Cuba kể từ đó. Khi kiểm tra trình tự khởi tạo mới, người ta phải cộng tất cả các giá trị trên tất cả các mặt, thường mất hai hoặc ba phút.

Nhiệm vụ của bạn là tự động hóa quá trình này cho chúng tôi!

Bạn sẽ lấy hai đầu vào, một số nguyên nvà một chuỗi c. Chúng có thể được đọc từ các đối số dòng lệnh, đối số chức năng, đầu vào tiêu chuẩn, một tệp hoặc bất kỳ sự kết hợp nào của chúng. csẽ là một khối bộ nhớ hình khối có kích thước nnhư được in bởi trình thông dịch.

Trình thông dịch lập phương đưa khối lập phương của nó vào STDERR khi kết thúc chương trình, được định dạng độc đáo để xem đơn giản. Chạy một chương trình trống trong trình thông dịch lập phương và mở phần gỡ lỗi để xem kết xuất khối của khối được khởi tạo. Thêm một đối số 4để xem 4x4x4 hoặc 5để xem 5x5x5, v.v.

Nếu nlà 3, csẽ theo định dạng này (số nguyên sẽ là biến):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Không gian, dòng mới, và tất cả. Nếu nlà 4, csẽ trông như thế này (cũng với các số nguyên biến):

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

Vân vân.

Chương trình của bạn sẽ xuất ra sáu số nguyên. Số nguyên đầu tiên sẽ là tổng của tất cả các số trên mặt trên.

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

Số nguyên thứ hai sẽ là tổng của mặt trái, thứ ba phía trước, thứ tư bên phải, thứ năm phía sau và thứ sáu phía dưới.

Vì vậy, nếu nlà 3 và cđây là:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Chương trình của bạn sẽ xuất ra 20 1 14 43 24 33.

Quy tắc bổ sung:

  • Các số nguyên đầu ra phải được phân cách bằng các ký tự không nguyên. Bạn cũng có thể chọn trả về một mảng.
  • Bạn có thể cho rằng đầu vào là chính xác - nlà một số nguyên và clà một khối từ đầu ra gỡ lỗi của Cubally . Vì vậy, nếu nđã 3.0cđang foo bar, chương trình của bạn có thể phá vỡ và vẫn còn hiệu lực.
  • Chương trình của bạn chỉ cần làm việc cho n > 1n < 1260. Nó có thể (cố gắng) xử lý kích thước khối lớn hơn hoặc nhỏ hơn, nhưng không cần thiết.

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng! Nếu bạn cần giúp đỡ, vui lòng hỏi trong phòng chat của Cuba .


Chúng ta có thể giả sử đầu vào bao gồm tất cả các dấu cách để là một hình chữ nhật không?
fireflame241

@ fireflame241 nếu bạn có nghĩa là nkhông gian sau mỗi dòng, không. Chúng không được bao gồm trong bãi chứa.
MD XF

1
Chúng tôi thực sự cần một thẻ "lập phương".
Ông Xcoder

Tình trạng @ Mr.Xcoder đã hoàn tất :) Tôi cũng đã nghĩ như vậy và tôi đang làm việc với bốn thử thách ATM nữa.
MD XF

Câu trả lời:



5

Python 2 , 155 150 147 123 121 120 byte

Có lẽ có thể bị đánh golf khá nhiều

Chỉnh sửa: -5 byte bằng cách sử dụng phương pháp tốt hơn để xóa khoảng trắng

Chỉnh sửa: -3 byte nhờ @Leaky Nun

Chỉnh sửa: -24 byte bằng cách không xóa khoảng trắng

Chỉnh sửa: -2 byte bằng cách khai thác quyền ưu tiên

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)]

Hãy thử trực tuyến!



3

Husk , 15 byte

3 giây và 2 mgiây

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

Hãy thử trực tuyến!

Giải trình

                  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ṁṁithực sự dễ thương!
Zgarb

3

Octave, 64 59 54 byte

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

Hãy thử trực tuyến!

Câu trả lời trước:

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

Hãy thử trực tuyến!

Trả về một mảng là đầu ra.


Không phải những gì tôi mong đợi, nhưng hoàn toàn hợp lệ, và thành thật mà nói tôi không mong đợi bất kỳ câu trả lời nào cả. +1
MD XF

@MDXF Bạn mong đợi điều gì?
rahnema1

Tôi không mong đợi câu trả lời ngắn này, cũng không phải dạng chấp nhận chuỗi này. Nhưng đó chỉ là cách Octave làm điều đó; Tôi chưa bao giờ sử dụng Octave.
MD XF



1

Haskell, 128 byte

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]]

Chấp nhận một chuỗi có ngắt dòng.


1

PowerShell , 236 byte

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)]

Hãy thử trực tuyến!

Ôi, cái này dài quá. Nhưng, việc tách và cắt chuỗi không phải là một trong những bộ đồ mạnh mẽ của PowerShell, vì vậy tôi đoán nó có phần được mong đợi. Ngoài ra - Vì vậy. Nhiều. USD.

Lấy tham số $n$znhư kích thước và khối lập phương, tương ứng. Sau đó, xây dựng một chức năng được sử dụng trong suốt. Ở đây, chúng tôi sẽ xóa khoảng trắng, phân tách trên từng chữ số riêng lẻ, xóa các ký tự trống ở giữa, nối tất cả các ký tự với nhau +và sau đó thực hiện câu lệnh kết quả để lấy số. Ví dụ, điều này biến "123"thành 1+2+3mà khi thực hiện là 6.

Dòng tiếp theo splitlà mạng khối lập phương đầu vào trên dòng mới, lưu kết quả vào mảng $a. Sau đó chúng tôi thực hiện chức năng trên các $ndòng đầu tiên và xuất ra mặt trên của khối.

Đối với tập tiếp theo, chúng ta cần nối các chuỗi dựa trên kích thước khối. Vì vậy, chúng tôi lặp qua từng dòng, xây dựng $xnhư mẫu regex thích hợp (ví dụ: đối với kích thước $n=3này sẽ là "(...)"), chia chuỗi dựa trên mẫu đó, một lần nữa loại bỏ các phần tử trống và lưu trữ chúng thành bốn biến đại diện cho bốn mặt. Đó là những chuỗi sau đó nối với nhau hthông qua k.

Dòng tiếp theo sau đó chuyển hqua kchức năng để xuất ra các mặt (trái, trước, phải, sau) của khối.

Cuối cùng, chúng tôi chạy các $ndòng cuối cùng thông qua chức năng để xuất ra mặt dưới của khối.

Tất cả các số còn lại trên đường ống và đầu ra là ẩn.


1

APL (Dyalog Classic) , 30 27 byte

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

Đã tắt 3 byte nhờ @ Adám

là n là c

Giải trình

                        ⍵⊂⍨⍵∊⎕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)

Hãy thử trực tuyến!


Hình như là 59 byte đối với tôi. Thay thế bằng ⎕U2286sẽ chỉ thêm 5 byte mặc dù.
Adám

Thật tệ, tôi đã chơi với và không có phân vùng kèm theo và chỉ sử dụng số byte cho phiên bản Cổ điển. Sẽ chỉnh sửa câu trả lời của tôi để sử dụng di chuyển cấp 3 :)
Gil

1
Ngoài ra, bạn có thể loại bỏ khoảng cách giữa 3.
Adám

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

1
IFAICT, bạn không cần phải ,sau như luôn luôn sử dụng lập luận đúng của nó để Ravel.
Adám

0

Về cơ bản , 19 byte

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

Lấy khối lập phương từ STDIN và kích thước làm đối số dòng lệnh cho trình thông dịch. Xuất ra tổng của mặt trên, byte rỗng, mặt trái, byte rỗng, ... mặt dưới và byte rỗng.

Hãy thử trực tuyến! ... dường như hiển thị byte rỗng dưới dạng một số khoảng trắng trên trình duyệt của tôi.

Ngôn ngữ này không được tạo ra cho thử thách này, nhưng thử thách được tạo ra cho ngôn ngữ .... nó có còn gian lận không? ;)

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.