รวมใบหน้าของคิวบ์ Cubically


13

การรวมใบหน้าคิวบ์แบบลูกบาศก์ด้วยตนเองนั้นเป็นเรื่องที่น่าเบื่อและใช้เวลานานและ sorta ก็เหมือนกับการเขียนโค้ดในแบบลูกบาศก์

ในcubifier ที่มีประสิทธิภาพที่สุดฉันขอให้คุณแปล ASCII เป็นแหล่งข้อมูลแบบลูกบาศก์ หนึ่งในคำตอบนั้นใช้ลำดับการกำหนดค่าเริ่มต้นของคิวบ์จากนั้นปรับเปลี่ยนคิวบ์ผลลัพธ์ตามจำนวนผลรวมของคิวบ์ที่กำหนดค่าเริ่มต้นไว้ล่วงหน้า วิธีนี้ถูกใช้ในโปรแกรมที่เกี่ยวข้องกับผู้ใช้หลายคนตั้งแต่ Cubically เมื่อทำการทดสอบลำดับการกำหนดค่าเริ่มต้นใหม่เราต้องเพิ่มค่าทั้งหมดบนใบหน้าทั้งหมดซึ่งโดยปกติจะใช้เวลาสองหรือสามนาที

งานของคุณคือทำให้กระบวนการนี้เป็นอัตโนมัติสำหรับเรา!

คุณจะใช้เวลาสองปัจจัยการผลิตเป็นจำนวนเต็มและสตริงn cสิ่งเหล่านี้อาจอ่านได้จากอาร์กิวเมนต์บรรทัดคำสั่งอาร์กิวเมนต์ฟังก์ชันอินพุตมาตรฐานไฟล์หรือการรวมกันของสิ่งเหล่านั้น cจะเป็นคิวบ์หน่วยความจำแบบลูกบาศก์ขนาดnตามที่พิมพ์โดยนักแปล

ล่าม Cubically จะทิ้ง cube ไว้ที่ STDERR เมื่อมีการยกเลิกโปรแกรมซึ่งจัดรูปแบบไว้อย่างดีเพื่อการดูที่ง่าย รันโปรแกรมว่างในตัวแปล Cubicallyและเปิดส่วนดีบักเพื่อดูการถ่ายโอนข้อมูลคิวบ์ของคิวบ์เริ่มต้น เพิ่มอาร์กิวเมนต์4เพื่อดู 4x4x4 หรือ5ดู 5x5x5 เป็นต้น

หากnเป็น 3 cจะเป็นไปตามรูปแบบนี้ (จำนวนเต็มจะเป็นตัวแปร):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

ช่องว่างการขึ้นบรรทัดใหม่และทั้งหมด ถ้าnเป็น 4 cจะมีลักษณะเช่นนี้ (เช่นเดียวกับจำนวนเต็มตัวแปร):

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

เป็นต้น

โปรแกรมของคุณจะแสดงผลเป็นจำนวนเต็มหกจำนวน จำนวนเต็มแรกจะเป็นผลรวมของตัวเลขทั้งหมดที่อยู่ด้านบนสุด

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

จำนวนเต็มที่สองจะเป็นผลรวมของใบหน้าด้านซ้าย, ด้านหน้าที่สาม, สี่ด้านขวา, ด้านหลังที่ห้าและด้านหลังที่หก

ดังนั้นถ้าnเป็น 3 และcนี่คือ:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

20 1 14 43 24 33โปรแกรมของคุณจะเอาท์พุท

กฎเพิ่มเติม:

  • จำนวนเต็มเอาต์พุตต้องถูกคั่นด้วยอักขระที่ไม่ใช่จำนวนเต็ม คุณอาจเลือกที่จะคืนค่าอาร์เรย์
  • คุณอาจจะคิดว่าการป้อนข้อมูลที่ถูกต้อง - nเป็นจำนวนเต็มและcเป็นก้อนจากการส่งออกการแก้จุดบกพร่องของ Cubically ดังนั้นหากnเคย3.0และcเคยfoo barโปรแกรมของคุณอาจหยุดทำงานและยังคงใช้งานได้
  • โปรแกรมของคุณจำเป็นต้องทำงานn > 1และn < 1260เท่านั้น มันอาจ (พยายาม) จัดการกับขนาดลูกบาศก์ที่ใหญ่กว่าหรือเล็กกว่า แต่ก็ไม่จำเป็น

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ! หากคุณต้องการความช่วยเหลืออย่าลังเลที่จะถามในห้องสนทนา Cubically


เราขอสมมติให้อินพุตรวมช่องว่างต่อท้ายทั้งหมดเพื่อให้เป็นสี่เหลี่ยมหรือไม่?
fireflame241

@ fireflame241 ถ้าคุณหมายถึงnช่องว่างหลังจากทุกบรรทัดไม่ใช่ พวกเขาจะไม่รวมอยู่ในการถ่ายโอนข้อมูล
MD XF

1
เราจำเป็นต้องมีแท็ก "ที่เป็นลูกบาศก์" จริงๆ
Mr. Xcoder

@ สถานะ Mr.Xcoder เสร็จสมบูรณ์แล้ว :) ฉันก็คิดเช่นกันและฉันกำลังทำงานกับความท้าทาย ATM อีกสี่มิติ
MD XF

คำตอบ:



5

Python 2 , 155 150 147 123 121 120 ไบต์

อาจจะเล่นกอล์ฟได้สักหน่อย

แก้ไข: -5 ไบต์โดยใช้วิธีที่ดีกว่าสำหรับการลบช่องว่าง

แก้ไข: -3 ไบต์ขอบคุณ@Leaky Nun

แก้ไข: -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

Huskขนาด 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

ฉันไม่ได้คาดหวังว่าคำตอบสั้น ๆ นี้หรือการรับสายแบบนี้ แต่มันเป็นเพียงวิธีที่ Octave ทำ ฉันไม่เคยใช้ Octave
MD XF



1

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

ลองออนไลน์!

Ooof นี้ยาว แต่การแยกและการแบ่งสายไม่ใช่ชุดที่แข็งแกร่งของ PowerShell ดังนั้นฉันคิดว่ามันค่อนข้างคาดหวัง ยัง - ดังนั้น จำนวนมาก ดอลลาร์

ใช้พารามิเตอร์$nและ$zขนาดและคิวบ์สุทธิตามลำดับ จากนั้นสร้างฟังก์ชันที่ใช้ตลอด ที่นี่เราจะลบช่องว่างแยกแต่ละหลักลบอักขระว่างในระหว่างการรวมตัวอักขระทั้งหมดเข้าด้วยกัน+แล้วดำเนินการคำสั่งผลลัพธ์เพื่อรับตัวเลข ยกตัวอย่างเช่นการเปลี่ยนนี้"123"เข้าซึ่งเมื่อดำเนินการคือ1+2+36

บรรทัดถัดไปsplits $aก้อนสุทธิข้อมูลเกี่ยวกับการขึ้นบรรทัดใหม่การจัดเก็บผลลงในอาร์เรย์ จากนั้นเราจะดำเนินการฟังก์ชั่นใน$nบรรทัดแรกและส่งหน้าสูงสุดของคิวบ์

สำหรับชุดถัดไปเราจำเป็นต้องแยกสตริงตามขนาดคิวบ์ ดังนั้นเราวนรอบแต่ละบรรทัดสร้าง$xเป็นรูปแบบ regex ที่เหมาะสม (เช่นขนาด$n=3นี้"(...)"), แยกสตริงตามรูปแบบนั้นลบองค์ประกอบที่ว่างเปล่าอีกครั้งและเก็บไว้เป็นตัวแปรสี่ตัวที่เป็นตัวแทนของใบหน้าทั้งสี่ สตริงเหล่านั้นจะถูกต่อกันเข้าhด้วยkกัน

บรรทัดถัดไปจัดส่งhผ่านkฟังก์ชั่นเพื่อส่งออกด้านข้าง (ซ้าย, ด้านหน้า, ขวา, หลัง) ของคิวบ์

ในที่สุดเราก็เรียกใช้$nบรรทัดสุดท้ายผ่านฟังก์ชั่นเพื่อส่งหน้าล่างของคิวบ์

ตัวเลขทั้งหมดจะถูกทิ้งไว้บนไพพ์ไลน์และเอาท์พุทจะเป็นนัย


1

APL (Dyalog Classic) , 30 27 ไบต์

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

ลบออกไป 3 ไบต์ด้วย@ Adám

คือ 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 ไบต์กับฉัน การแทนที่ด้วย⎕U2286จะเพิ่มเพียง 5 ไบต์เท่านั้น
อดัม

ของฉันไม่ดีฉันกำลังเล่นกับและไม่มีการแบ่งพาร์ติชันและใช้นับไบต์สำหรับรุ่นคลาสสิกเท่านั้น จะแก้ไขคำตอบของฉันกับการใช้ระดับการโยกย้าย 3 :)
กิล

1
นอกจากนี้คุณยังสามารถลบช่องว่างระหว่างและ3
อดัม

1
(6,⍺*2) → 6(⍺*2)
อดัม

1
IFAICT คุณไม่จำเป็นต้อง,หลังจากที่เป็นมักจะใช้การโต้แย้งสิทธิในการสั่งซื้อ Ravel
อดัม

0

ตามอำเภอใจ 19 ไบต์

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

รับคิวบ์จาก STDIN และขนาดเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปยังล่าม ส่งออกผลรวมของหน้าบนสุด, ไบต์ว่าง, ใบหน้าซ้าย, null null, ... ใบหน้าล่างและไบต์ว่าง

ลองออนไลน์! ... ซึ่งเห็นได้ชัดว่าแสดงไบต์ว่างเป็นช่องว่างบนเบราว์เซอร์ของฉัน

ภาษานี้ไม่ได้ถูกสร้างขึ้นสำหรับความท้าทายนี้ แต่ความท้าทายนั้นถูกสร้างขึ้นสำหรับภาษา .... มันยังคงโกงอยู่หรือไม่? ;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.