Küp küpün yüzlerini topla


13

Kübik bir küpün yüzlerini manuel olarak toplamak sıkıcı ve zaman alıcıdır, Kübik'in kendisinde kod yazmak gibi.

In En verimli cubifier , ben cubically kaynağına ASCII çevirmek istedi. Buradaki cevaplardan biri bir küp başlatma dizisi kullanır ve daha sonra elde edilen küpü, önceden başlatılmış küpün toplamlarına göre değiştirir. Bu yöntem o zamandan beri Küplerle ilgili birçok programda kullanılmıştır. Yeni bir başlatma sırası test edilirken, genellikle iki veya üç dakika süren tüm yüzlerdeki tüm değerler toplanmalıdır.

Göreviniz bu süreci bizim için otomatikleştirmek!

Bir tamsayı nve bir dize olmak üzere iki giriş alacaksınız c. Bunlar komut satırı argümanlarından, fonksiyon argümanlarından, standart girişten, bir dosyadan veya bunların herhangi bir kombinasyonundan okunabilir. cBir olacaktır cubically bellek küp boyutu nyorumlayıcı tarafından hoş yazılı olarak.

Kübik yorumlayıcı, basit görüntüleme için güzel biçimlendirilmiş program sonlandırmasıyla küpünü STDERR'a atar. Kübik yorumlayıcıda boş bir program çalıştırın ve başlatılan bir küpün küp dökümünü görmek için hata ayıklama bölümünü açın. 44x4x4 5boyutunda veya 5x5x5 boyutlarında vb. Görmek için bağımsız değişken ekleyin .

Eğer n3'tür, cbu formatı (tamsayı değişken olacaktır) takip edecek:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Mekanlar, yeni satırlar ve hepsi. Eğer n4'tür, cbu (aynı zamanda değişken tamsayılar ile) gibi görünecektir:

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

Ve benzeri.

Programınız altı tamsayı çıkarır. İlk tam sayı, üst yüzdeki tüm sayıların toplamı olacaktır.

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

İkinci tam sayı sol yüzün toplamı, üçüncüsü ön, dördüncü sağ, beşinci arka ve altıncı altın toplamı olacaktır.

n3 olsaydı ve cşuydu:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Programınız çıktı alacaktı 20 1 14 43 24 33.

Ek kurallar:

  • Çıktı tamsayıları tamsayı olmayan karakterler ile sınırlanmalıdır. Bir dizi döndürmeyi de seçebilirsiniz.
  • Girdinin doğru olduğunu varsayabilirsiniz - nbir tamsayıdır ve Cubically'ın hata ayıklama çıkışındanc bir küptür . Yani eğer oldu ve oldu , programınız kırmak ve hala geçerli olabilir.n3.0cfoo bar
  • Programınızın yalnızca n > 1ve için çalışması gerekir n < 1260. Bu olabilir büyük veya daha küçük küp boyutları ele (girişiminde), ancak gerekli değildir.

Bu , bu yüzden en kısa kod kazanır! Yardıma ihtiyacınız varsa, Kübik sohbet odasında sormaya çekinmeyin .


Girdinin bir dikdörtgen olacak şekilde tüm boşlukları içerdiğini varsayabilir miyiz?
fireflame241

@ fireflame241 nher satırdan sonra boşluklar demek istiyorsanız , hayır. Çöp kutusuna dahil edilmezler.
MD XF

1
Gerçekten "kübik" bir etikete ihtiyacımız var.
Bay Xcoder

@ Mr.Xcoder durumu tamamlandı :) Bunu ben de düşünüyordum ve Kübik zorluklarla dolu dört ATM üzerinde çalışıyorum.
MD XF

Yanıtlar:



5

Piton 2 , 155 , 150 147 123 121 120 bayt

Muhtemelen biraz golf olabilir

Düzenleme: Beyaz alanları kaldırmak için daha iyi bir yöntem kullanarak -5 bayt

Düzenleme: @Leaky Nun sayesinde -3 bayt

Düzenleme: Boşlukları kaldırarak -24 bayt

Düzenleme: Önceliği kullanarak -2 bayt

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

Çevrimiçi deneyin!



3

Kabuk , 15 bayt

3 sn ve 2 msn

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

Çevrimiçi deneyin!

açıklama

                  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ṁṁigerçekten güzel!
Zgarb

3

Oktav, 64 59 54 bayt

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

Çevrimiçi deneyin!

Önceki cevap:

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

Çevrimiçi deneyin!

Bir diziyi çıktı olarak döndürür.


Beklediğim gibi değil, ama mükemmel geçerli ve dürüst olmak gerekirse ben hiç cevap beklemiyorduk. +1
MD XF

@MDXF Ne bekliyordun?
rahnema1

Bu kadar kısa bir cevap beklemiyordum, ne de ipleri kabul etmenin bu biçimi. Ama Octave bunu böyle yapıyor; Hiç Octave kullanmadım.
MD XF



1

Haskell, 128 bayt

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

Satır kesmeleri olan bir dizeyi kabul eder.


1

PowerShell , 236 bayt

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

Çevrimiçi deneyin!

Ooof, bu uzun. Ancak, dizeleri bölmek ve dilimlemek PowerShell'in güçlü takımlarından biri değildir, bu yüzden sanırım biraz bekleniyor. Ayrıca - Yani. Birçok. Dolar.

Parametreleri $nve $zsırasıyla boyut ve küp ağı olarak alır. Ardından, baştan sona kullanılan bir işlev oluşturur. Burada, boşlukları kaldırıyoruz, her bir basamağa bölüyoruz, aradaki boş karakterleri kaldırıyoruz, a ile tüm karakterleri birleştiriyoruz +ve sonra bir sayı elde etmek için sonuçtaki ifadeyi yürütüyoruz. Örneğin, bu tur "123"halinde 1+2+3yürütülür ki bu 6.

Bir sonraki satır split, sonucu diziye kaydederek yeni satırlardaki giriş küpü ağıdır $a. Daha sonra işlevi ilk $nsatırlarda gerçekleştirir ve küpün üst yüzünü çıkarırız.

Bir sonraki set için, dizeleri küp boyutuna göre eklememiz gerekir. Bu nedenle, $xuygun regex deseni olarak inşa ederek (örneğin, $n=3bu olacak boyut için "(...)") her bir çizgiyi döngüye alıyoruz , dizeyi bu desene göre ayırıyoruz, yine boş elemanları çıkarıyoruz ve bunları dört yüzü temsil eden dört değişkene saklıyoruz. Bunlar daha sonra dize üzerine birleştirilmiş olan haracılığıyla k.

Bir sonraki satır daha sonra küpün kenarlarını (sol, ön, sağ, arka) çıktılamak için fonksiyonun hiçinden kgeçer.

Son olarak, $nküpün alt yüzünü çıkarmak için fonksiyonun son satırlarını çalıştırıyoruz .

Tüm sayılar ardışık düzende bırakılır ve çıktı örtüktür.


1

APL (Dyalog Klasik) , 30 27 bayt

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

@ Adám sayesinde 3 baytlık tıraş

n , c

açıklama

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

Çevrimiçi deneyin!


Bana 59 bayt gibi geliyor. Değiştirme ile ⎕U2286sadece 5 bayt olsa katacak.
Adam

Benim kötüm, bölümlenmiş kapsülü olan ve olmayan oynuyordum ve sadece Klasik sürüm için bayt sayısını kullandım. Göç seviyesi 3'ü kullanmak için cevabımı düzenleyeceğim :)
Gil

1
Ayrıca, arasında boşluk kaldırabilirsiniz 3ve .
Adam

1
(6,⍺*2) → 6(⍺*2)
17'de

1
IFAICT, her zamanki gibi doğru argümanını ravel düzeninde kullandıktan ,sonra ihtiyacınız yoktur .
Adam

0

Kübik , 19 bayt

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

Küpü STDIN'den ve boyuttan yorumlayıcıya komut satırı argümanı olarak alır. Üst yüzün, bir boş baytın, sol yüzün, bir boş baytın, ... alt yüzün ve bir boş baytın toplamını çıktılar.

Çevrimiçi deneyin! ... görünüşe göre null baytları tarayıcımda bir çeşit boşluk olarak gösteriyor.

Bu dil bu meydan okuma için yapılmadı, ama meydan okuma dil için yapıldı .... hala hile yapıyor mu? ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.