Jumlahkan kubus wajah kubus

13

Secara manual menjumlahkan wajah kubus kubus itu membosankan dan memakan waktu, agak seperti menulis kode dalam kubus itu sendiri.

Dalam cubifier paling efisien , saya meminta Anda untuk menerjemahkan ASCII ke sumber Cubically. Salah satu jawaban di sana menggunakan urutan inisialisasi kubus dan kemudian memodifikasi kubus yang dihasilkan berdasarkan jumlah kubus pra-diinisialisasi. Metode ini telah digunakan di banyak program yang berhubungan dengan Cubic. Saat menguji urutan inisialisasi baru, kita harus menambahkan semua nilai pada semua wajah, yang biasanya memakan waktu dua atau tiga menit.

Tugas Anda adalah mengotomatiskan proses ini untuk kami!

Anda akan mengambil dua input, integer ndan string c. Ini dapat dibaca dari argumen baris perintah, argumen fungsi, input standar, file, atau kombinasi dari semuanya. cakan menjadi kubus memori kubik dengan ukuran yang ncukup dicetak oleh penerjemah.

Juru bahasa Cubs membuang kubusnya ke STDERR setelah penghentian program, diformat dengan baik untuk tampilan sederhana. Jalankan program kosong dalam juru bahasa Cubically dan buka bagian debug untuk melihat pembuangan kubus dari sebuah kubus diinisialisasi. Tambahkan argumen 4untuk melihat 4x4x4, atau 5untuk melihat 5x5x5, dll.

Jika n3, cakan mengikuti format ini (bilangan bulat akan menjadi variabel):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Spasi, baris baru, dan semua. Jika n4, cakan terlihat seperti ini (juga dengan variabel integer):

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

Dll.

Program Anda akan menghasilkan enam bilangan bulat. Bilangan bulat pertama adalah jumlah dari semua angka di permukaan atas.

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

Bilangan bulat kedua adalah jumlah dari wajah kiri, ketiga di depan, keempat di kanan, kelima di belakang dan keenam di bawah.

Jadi jika n3 dan cini:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Program Anda akan menampilkan 20 1 14 43 24 33.

Aturan tambahan:

  • Bilangan bulat output harus dibatasi oleh karakter non-integer. Anda juga dapat memilih untuk mengembalikan array.
  • Anda dapat mengasumsikan bahwa inputnya benar - nadalah bilangan bulat dan cmerupakan kubus dari hasil debugging Cubically . Jadi, jika nitu 3.0dan citu foo bar, program anda bisa istirahat dan masih berlaku.
  • Program Anda hanya perlu bekerja untuk n > 1dan n < 1260. Ini mungkin (mencoba untuk) menangani ukuran kubus yang lebih besar atau lebih kecil, tetapi tidak perlu.

Ini , jadi kode terpendek menang! Jika Anda butuh bantuan, silakan bertanya di ruang obrolan Cubically .

MD XF
sumber
Bisakah kita menganggap input untuk menyertakan semua spasi tambahan sehingga menjadi persegi panjang?
fireflame241
@ fireflame241 jika yang Anda maksud nspasi setelah setiap baris, tidak. Mereka tidak termasuk dalam dump.
MD XF
1
Kami benar-benar membutuhkan tag "kubik".
Tn. Xcoder
@ Status Mr.Xcoder selesai :) Saya sudah memikirkan itu juga, dan saya sedang mengerjakan empat tantangan ATM yang lebih Cubically.
MD XF

Jawaban:

6

Jelly , 16 14 13 byte

3 byte berkat Erik the Outgolfer.

ḟ⁶ỴV€€sS€ẎsS€

Cobalah online!

Biarawati Bocor
sumber
1
Simpan yang lain dengan menyingkirkan Z: ḟ⁶ỴV€€sS€ẎsS€(atau ḟ⁶ỴV€€sS€FsS€)
Erik the Outgolfer
5

Python 2 , 155 150 147 123 121 120 byte

Mungkin bisa bermain golf sedikit

Sunting: -5 byte dengan menggunakan metode yang lebih baik untuk menghapus spasi putih

Sunting: -3 bytes berkat @Leaky Nun

Edit: -24 byte dengan tidak menghapus spasi putih

Edit: -2 byte dengan mengeksploitasi prioritas

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

Cobalah online!

Halvard Hummel
sumber
3

Sekam , 15 byte

3 detik dan 2 mdetik

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

Cobalah online!

Penjelasan

                  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
H.Piz
sumber
1
mṁṁisangat bagus!
Zgarb
3

Oktaf, 64 59 54 byte

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

Cobalah online!

Jawaban sebelumnya:

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

Cobalah online!

Mengembalikan array sebagai output.

rahnema1
sumber
Bukan yang saya harapkan, tetapi benar-benar valid, dan jujur ​​saja saya tidak mengharapkan jawaban sama sekali. +1
MD XF
@ MDXF Apa yang Anda harapkan?
rahnema1
Saya tidak mengharapkan jawaban sesingkat ini, atau bentuk menerima string ini. Tapi begitulah Oktaf melakukannya; Saya tidak pernah menggunakan Oktaf.
MD XF
2

Perl 5 , 66 + 1 (-n) = 67 byte

$j=$k<6?$k++/3:5;s/\d{3}/';$r[$j++]+='.$&=~s|.|+$&|gr/gee}{say"@r"

Cobalah online!

Xcali
sumber
2

Python 2 , 137 127 byte

-10 byte berkat @Halvard Hummel

lambda x,n:[sum(sum(map(int,x.split('\n')[b+j][a:a+n]))for j in range(n))for a,b in[[n,0],[0,n],[n,n],[2*n,n],[3*n,n],[n,2*n]]]

Cobalah online!

officialaimm
sumber
2
127
Halvard Hummel
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]]

Menerima string dengan jeda baris.

Leif Willerts
sumber
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)]

Cobalah online!

Ooof, ini panjang. Tapi, membelah dan mengiris senar bukanlah salah satu dari kekuatan kuat PowerShell, jadi kurasa itu agak diharapkan. Juga - Jadi Banyak. Dolar

Mengambil parameter $ndan $zsebagai ukuran dan kubus bersih, masing-masing. Kemudian membangun fungsi yang digunakan di seluruh. Di sini, kami menghapus spasi, memisahkan setiap digit individu, menghapus karakter kosong di antaranya, menggabungkan semua karakter bersama dengan +, dan kemudian menjalankan pernyataan yang dihasilkan untuk mendapatkan nomor. Sebagai contoh, ini berubah "123"menjadi 1+2+3ketika dieksekusi 6.

Baris berikutnya splitadalah jaring kubus input pada baris baru, menyimpan hasilnya ke dalam array $a. Kami kemudian melakukan fungsi pada $nbaris pertama dan menampilkan permukaan atas kubus.

Untuk set berikutnya, kita perlu menyambung string berdasarkan pada ukuran kubus. Jadi, kita loop melalui setiap baris, membangun $xsebagai pola regex yang sesuai (misalnya, untuk ukuran $n=3ini akan "(...)"), membagi string berdasarkan pola itu, lagi-lagi menghapus elemen kosong, dan menyimpannya menjadi empat variabel yang mewakili empat wajah. Itu kemudian string digabungkan ke hmelalui k.

Baris berikutnya kemudian dikirimkan hmelalui kfungsi untuk menampilkan sisi (kiri, depan, kanan, belakang) dari kubus.

Akhirnya, kita menjalankan $nbaris terakhir melalui fungsi untuk menampilkan permukaan bawah kubus.

Semua angka dibiarkan dalam pipa, dan hasilnya tersirat.

AdmBorkBork
sumber
1

APL (Dyalog Classic) , 30 27 byte

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

Dicukur 3 byte berkat @ Adám

is n is c

Penjelasan

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

Cobalah online!

Gil
sumber
Sepertinya 59 byte bagi saya. Mengganti dengan ⎕U2286hanya akan menambah 5 byte.
Adám
Buruk saya, saya sedang bermain dengan dan tanpa melampirkan mempartisi dan hanya menggunakan jumlah byte untuk versi Classic. Akan mengedit jawaban saya untuk menggunakan migrasi level 3 :)
Gil
1
Anda juga dapat menghapus ruang antara 3dan .
Adám
1
(6,⍺*2) → 6(⍺*2)
Adám
1
IFAICT, Anda tidak perlu ,setelah seperti selalu menggunakan argumen yang benar dalam urutan ravel.
Adám
0

Secara kubik , 19 byte

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

Mengambil kubus dari STDIN dan ukurannya sebagai argumen baris perintah ke penerjemah. Menghasilkan jumlah wajah atas, byte nol, wajah kiri, byte nol, ... wajah bawah, dan byte nol.

Cobalah online! ... yang tampaknya menampilkan byte nol sebagai semacam spasi di browser saya.

Bahasa ini tidak dibuat untuk tantangan ini, tetapi tantangan itu dibuat untuk bahasa .... apakah itu masih curang? ;)

MD XF
sumber