กลวงออกอาร์เรย์


35

งาน

ความท้าทายนี้ง่ายมาก ข้อมูลที่คุณป้อนเป็นจำนวนเต็มอาร์เรย์ 2 มิติขนาดอย่างน้อย 1 × 1 มันสามารถนำมาในรูปแบบที่เหมาะสม ส่งออกของคุณจะต้องเข้าแถว แต่มีรายการทั้งหมดไม่ได้0อยู่ในแถวหรือนามสกุลหรือชุดคอลัมน์ ต้องอยู่ในรูปแบบเดียวกับอินพุต

ตัวอย่างเช่นถ้าอาร์เรย์เป็น

67  4 -8  5 13
 9 13 42  4 -7
 1  1  3 -9 29
16 99  8 77  0

ดังนั้นผลลัพธ์ที่ถูกต้องคือ

67  4 -8  5 13
 9  0  0  0 -7
 1  0  0  0 29
16 99  8 77  0

กฎและการให้คะแนน

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

กรณีทดสอบ

สิ่งเหล่านี้ถูกจัดรูปแบบเป็นรายการแบบซ้อนเพื่อให้ง่ายต่อการคัดลอกวาง

[[3]] -> [[3]]
[[7,2,8]] -> [[7,2,8]]
[[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
[[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
[[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
[[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

หากคุณต้องการรวมหลายหมายเลข (เช่นเนื่องจากคุณได้ปรับปรุงคะแนนของคุณหรือคุณต้องการแสดงรายการตัวแปลภาษาแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

คำตอบ:


13

MATL , 9 ไบต์

0HJ_ht4$(

อินพุตอยู่ในรูปแบบ

[67  4 -8  5 13;  9 13 42  4 -7;  1  1  3 -9 29; 16 99  8 77  0]

แก้ไข (12 มิถุนายน 2016): เพื่อปรับให้เข้ากับการเปลี่ยนแปลงในภาษาลิงค์ข้างล่างนี้ได้_qถูกแทนที่ด้วย

ลองออนไลน์ !

0           % Push a 0: value that will be assigned into the array
HJ_h        % Vector [2, -1j]: this corresponds to index 2:end-1 for rows
t           % Duplicate: same index for columns
4$(         % Assignment indexing with 4 inputs: array, new value, row and col indices
            % Since the first input (array) to this function is currently missing, it's
            % implicitly taken at this point from stdin
            % Implicitly display stack contents, which is the modified array

2
ดี! ฉันรู้ว่า MATL จะทำงานอยู่ : D
บีกเกอร์

12

Java 7 เป็นฟังก์ชันที่มีชื่อเต็ม: 85

void f(int[][]a){for(int i=0,j;++i<a.length-1;)for(j=1;j<a[i].length-1;)a[i][j++]=0;}

คุณสามารถแลมบ์ดานี้ลงใน Java 8 เพื่อลบสองสามไบต์ แต่ฉันไม่ทำอย่างนั้นจริงๆ


คุณสามารถประหยัดพื้นที่โดยใช้Arrays.fill(a[i],1,a[i].length-1,0);? มีเพียง 36 ไบต์แทนที่จะเป็น 37. =)
corsiKa

@corsiKa มันจะดี แต่ฉันต้องนำเข้าหรือผ่านการรับรองอย่างเต็มที่: /
Geobits

แค่อยากรู้อยากเห็นทำไมคุณถึงมีวงวนต่างกัน? ทำไมไม่for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;? มันไม่ได้บันทึกไบต์ใด ๆ แต่มันสอดคล้องกันมากขึ้นกับลูปทั้งสองที่เหมือนกัน :)
Kevin Cruijssen

12

เยลลี่, 18 17 15 9 ไบต์

0W&ṖZ
ÇÇ^

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

พื้นหลัง

วิธีการนี้ขึ้นอยู่กับคำตอบ Jelly ของ @ Sp3000โดยเฉพาะกับความคิดของเขาในการใช้ประโยชน์จากการดำเนินการแบบเวกเตอร์ระหว่างรายการที่มีความยาวต่างกัน

เราเริ่มต้นด้วยการใช้ค่าบิต AND และ0และจำนวนเต็มทุกค่าในแถวแรกของอินพุต เนื่องจาก vectorization อัตโนมัตินี้สามารถทำได้โดยการ bitwise AND ของ[0]และการป้อนข้อมูลโดยไม่ต้องแถวสุดท้าย 0ถูกจับคู่กับแถวแรกทำให้แถวเป็นศูนย์ เนื่องจากแถวที่เหลือไม่มีคู่ใน[0]จึงไม่มีการแตะซ้ำ

ตอนนี้เราแปลงผลลัพธ์ให้ใช้การแปลงข้างต้นอีกครั้ง (ลบคอลัมน์สุดท้ายอย่างมีประสิทธิภาพและลบล้างศูนย์แรก) และย้ายอีกครั้ง

สำหรับการป้อนข้อมูล

 67   4  -8   5  13
  9  13  42   4  -7
  1   1   3  -9  29
 16  99   8  77   0

ผลลัพธ์นี้ใน

  0   0   0   0
  0  13  42   4
  0   1   3  -9

ทีนี้เราเอาค่า XOR bitwise ของผลลัพธ์นี้และเมทริกซ์ดั้งเดิม XORing จำนวนเต็มด้วยตัวเองผลตอบแทนถัวเฉลี่ย0 XOR จำนวนเต็มด้วย0 (หรือไม่ใช่ XORing เลย) ให้ผลเป็นจำนวนเต็มเดียวกัน นี่ทำให้เมทริกซ์ออกมา

มันทำงานอย่างไร

0W&ṖZ    Helper link. Argument: M (matrix)

0W       Yield [0].
   Ṗ     Yield M, without its last row.
  &      Take the bitwise AND of both.
    Z    Zip the result.

ÇÇ^      Main link. Input: A (matrix)

Ç        Call the helper link on A.
 Ç       Call the helper link on the result.
  ^      Take the bitwise XOR of the result and A.

8

Mathematica ขนาด 27 ไบต์

(a=#;a[[2;;-2,2;;-2]]=0;a)&

2
ประทับใจ ตอนนี้คุณช่วยอธิบายได้ไหม ดูเหมือนว่าคุณกำลังกำหนดเซลล์ภายในเป็นศูนย์อีกครั้งและ-2s แทนสองคอลัมน์หรือแถวที่สอง
DavidC

มันง่ายแค่ไหน!
njpipeorgan

7

R , 33 48 ไบต์

ฉันรู้ว่า R ไม่ได้ทำเพื่อการเล่นกอล์ฟ แต่มันถูกสร้างขึ้นมาเพื่อการจัดทำดัชนีตำแหน่ง ... กำลังโหลดตัวอย่าง;

a <- matrix(c(67,4,-8,5,13,9,13,42,4,-7,1,1,3,-9,29,16,99,8,77,0), ncol=5, byrow=TRUE)
a
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9   13   42    4   -7
# [3,]    1    1    3   -9   29
# [4,]   16   99    8   77    0

แทนที่ค่าที่ตำแหน่งใด ๆ ที่ไม่ได้อยู่ในแถวหรือคอลัมน์ขอบด้วย 0:

x <- function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]<-0;a}

x(a)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9    0    0    0   -7
# [3,]    1    0    0    0   29
# [4,]   16   99    8   77    0

ตรวจสอบการทดสอบ 2 คอลัมน์ด้วย:

b <- matrix(c(99,98,97,88,87,86), ncol=2, byrow=TRUE)
b
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

x(b)
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

ลูกหลาน: ความพยายามครั้งก่อน

# a[2:(nrow(a)-1),2:(ncol(a)-1)]<-0 # previous attempt

ทดสอบตัวอย่างทั้งหมด:

tests <- read.table(text="[[3]] -> [[3]]
                          [[7,2,8]] -> [[7,2,8]]
                          [[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
                          [[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
                          [[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
                          [[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
                          [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
                          [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]")
tests$cols <- c(1,3,1,3,2,3,5,5)
tests$V1 <- gsub("\\[|\\]","",tests$V1)
tests$V1 <- paste0("c(",tests$V1,")")
tests$V3 <- gsub("\\[|\\]","",tests$V3)
tests$V3 <- paste0("c(",tests$V3,")")

testfn <- function(testno) {
  intest <- matrix(eval(parse(text=tests$V1[testno])), ncol=tests$cols[testno], byrow=TRUE)
  intest <- x(intest)
  outtest <- matrix(eval(parse(text=tests$V3[testno])), ncol=tests$cols[testno], byrow=TRUE)
  return(identical(intest, outtest))
}

sapply(seq_len(nrow(tests)), testfn)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

เกิดอะไรขึ้นกับเมทริกซ์ 1 หรือ 2 แถวหรือคอลัมน์
mnel

จุดดีความพยายามครั้งแรกล้มเหลวในการทดสอบ 2 คอลัมน์และลบแถวกลาง ฉันจะอัปเดต
Jonathan Carroll

1
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! เราต้องการให้การส่งทั้งหมดเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ ในกรณีนี้โค้ดที่ให้คะแนนของคุณเป็นเพียงตัวอย่างเท่านั้นเนื่องจากถือว่ามีตัวแปรaอยู่ เพื่อให้สอดคล้องกับกฎของเราคุณสามารถทำให้เป็นฟังก์ชันที่ใช้เมทริกซ์เช่นfunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}47 ไบต์
Alex A.

6

Mathematica 81 76 ไบต์

(d=Dimensions@m;q=MemberQ;m Boole@Array[{1,d[[1]]}~q~#||{1,d[[2]]}~q~#2&,d])&

มันทำงานอย่างไร

mสมมติว่าอาร์เรย์การป้อนข้อมูลที่ถูกเก็บไว้ใน ขนาดของmคือ {4,5} `

(m={{67,4,-8,5,13}, {9,13,42,4,-7}, {1,1,3,-9,29}, {16,99,8,77,0}})//MatrixForm

ม.


แต่ละเซลล์ในอาร์เรย์ต่อไปนี้aเป็นจริงถ้าเซลล์อยู่ในแถวแรกหรือ ( ||) ในแถวสุดท้ายหรือในคอลัมน์แรกหรือคอลัมน์สุดท้าย มิฉะนั้นจะเป็นเท็จ

(d=Dimensions@m;a=Array[MemberQ[{1,d[[1]]},#]||MemberQ[{1,d[[2]]},#2]&,d])&[m]//MatrixForm

จริง


การใช้ฟังก์ชันBooleกับอาร์เรย์จะแปลง True เป็น 1 และ False เป็น 0

b = Boole[a]

Boole


คูณเมทริกซ์โดยm bนี่จะคูณแต่ละเซลล์เป็น m โดยเซลล์ที่สอดคล้องกันใน b

m b

เมทริกซ์กลวง


คุณสามารถใช้||เป็นหรือเพื่อบันทึกสองสามไบต์และฉันสามารถเห็นไบต์อื่น ๆ ที่คุณสามารถบันทึกได้เช่นกัน!
ซิมมอนส์

A Simmons ขอบคุณสำหรับคำแนะนำ
DavidC

# -Unitize @ ArrayFilter [Det, Array [Norm @ * รายการ, Dimensions @ #], 1] # &
njpipeorgan

@njpipeorgan ฉันขอแนะนำให้คุณส่งมัน (และหวังว่าจะอธิบายวิธีการใช้งาน!)
DavidC

@DavidC ฉันได้โพสต์คำตอบของฉัน
njpipeorgan

6

GNU Sed, 31

  • ขอบคุณ @manatwork สำหรับการบันทึก 4 ไบต์

เวอร์ชัน 4.2.2 หรือก่อนหน้านี้ก่อนที่จะนี้กระทำ (สนทนา)

คะแนนรวม +1 สำหรับ-rตัวเลือก

แถวอินพุตถูกขึ้นบรรทัดใหม่ องค์ประกอบในแต่ละแถวแยกกันเป็นบรรทัดเดียว

1n
$n
:
s/ -?\w+ / : /
t
y/:/0/

คำอธิบาย

1n                   # 1st line: print unchanged, then load next line
$n                   # last line: print unchanged, then load next line (i.e. EOF and stop)
:                    # unnamed label
s/ -?\w+ / : /       # substitute a number in spaces with a `:` in spaces
t                    # If the above matched, jump back to the label and try again
y/:/0/;              # transliterate `:` to `0`

ลองออนไลน์


1
โอ้ฉันเห็นแล้วมันเป็นวิธีที่ "แฟนซี" ในการหลีกเลี่ยง lookaheads และขอบคุณ!
andlrc

1
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/การจัดฟันมากเกินไป:
จัดการ

1
คุณสามารถรวมข้อมูลเกี่ยวกับการกระทำที่ทำให้คำตอบของคุณทำงานในบล็อกคำพูดเว็บไซต์ช้าจริง ๆ และใช้เวลา 1 นาทีในการโหลดเต็ม
Ferrybig

@Manatwork ขอบคุณ - บันทึกไว้ 4 ไบต์!
Digital Trauma

@Ferrybig เพิ่มลิงก์ไปยังการสนทนา dev ในหัวข้อนี้
Digital Trauma

5

อ็อกเทฟ 34 ไบต์

function h(M) M(2:end-1,2:end-1)=0

โปรดทราบว่าการป้อนข้อมูลต้องใช้เครื่องหมายอัฒภาคเพื่อคั่นแถวอาเรย์:

h([[3];[5];[12];[-6]])

คำอธิบาย:

ดัชนีอาร์เรย์แบบอ็อกเทฟ (และ MATLAB) เป็นแบบอิง 1 การระบุช่วงArray(1:end)จะให้องค์ประกอบทั้งหมดของอาร์เรย์ (หนึ่งมิติในตัวอย่างนี้) Array(2:end-1)จะให้องค์ประกอบทั้งหมดยกเว้นส่วนแรกและชิ้นสุดท้าย

M(2:end-1,2:end-1)=0

ตั้งค่าเป็น0องค์ประกอบทั้งหมดที่ไม่ได้อยู่ในแถวแรกหรือแถวสุดท้ายหรือคอลัมน์:

>> A = [[-1,-2,-3];[1,2,3];[5,5,5]]
A =

  -1  -2  -3
   1   2   3
   5   5   5

>> h(A)
M =

  -1  -2  -3
   1   0   3
   5   5   5

หากหนึ่งในมิติน้อยกว่าหรือเท่ากับ 2 ช่วงend-1จะน้อยกว่า 2 ดังนั้นจุดสิ้นสุดของช่วง(2:end-1)จะน้อยกว่าจุดเริ่มต้น ในกรณีนี้อ็อกเทฟจะข้ามช่วงและไม่ทำอะไรเลย นี่คล้ายกับforลูป:

for (int i=2; i < 2; i++) {...}

เงื่อนไขการหยุดเป็นจริงในการวนซ้ำครั้งแรกดังนั้นเราจึงหลุดออกจากลูป

>> A = [[6,7];[8,9];[10,11]]
A =

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11

5

เยลลี่ 12 ไบต์

ZṖṖ1;¥€
¬ÇÇ×

ฉันคิดว่ามันใช้งานได้ดี แต่ฉันยังคงพันรอบเยลลี่ ลองออนไลน์!

(ขอบคุณ @Dennis สำหรับ -2 ไบต์)

ทำงานโดยการคูณอาร์เรย์อินพุตด้วยอาร์เรย์ 1s และ 0s หนึ่งมิติที่เล็กลงในแต่ละวิธี ตัวอย่างเช่น[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]เราคูณองค์ประกอบที่ฉลาดด้วย

1 1 1 1
1 0 0 0
1 0 0 0

คำอธิบายแบบเต็ม

[Helper link - argument is a matrix]
Z           Zip
 ṖṖ         Pop last two elements, or [:-2]
   1;¥€     Append a 1 in front of every row

[Main link]
¬           Not, turning 0s to 1s and everything else to 0s. Even though some zeroes
            turn into 1s, it's fine because we multiply element-wise at the end,
            and 0*1 = 0
 ÇÇ         Perform helper link twice
   ×        Multiply element-wise

5

ES6, 52 48 46 ไบต์

f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)

แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ user81655 บันทึกอีก 2 ไบต์ด้วย @ETHproductions


ฉลาด! ต่อไปนี้เป็นวิธีที่คล้ายกันมากโดยไม่ต้องgบันทึกสองสามไบต์:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
user81655

งานที่ดี! ฉันนับ 48 ไบต์ (บางทีคุณลืมนับf=) แต่คุณสามารถลดได้ถึง 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
ETHproductions

1
@ETHproductions f=ใช่ฉันไม่ลืมที่จะนับ นอกจากนี้ฉันประหลาดใจเล็กน้อยใช้+.5งานได้ แต่ฉันเห็นว่ามันเป็นการเพิ่มสตริงในการโทรอื่น
Neil


4

Mathematica, 55 ไบต์

#-Unitize@ArrayFilter[Det,Power~Array~Dimensions@#,1]#&

กรณีทดสอบ

%[RandomInteger[9,{5,5}]]
(*
  {{8,8,3,6,5},
   {7,0,0,0,4},
   {2,0,0,0,7},
   {3,0,0,0,5},
   {8,6,1,0,8}}
*)

คำอธิบาย

แนวคิดหลักของคำตอบนี้เหมือนกับคำตอบของ DavidC (สร้างเมทริกซ์มาสก์แรกแล้วคูณกับเมทริกซ์ดั้งเดิม) แต่การสร้างมาสก์เมทริกซ์นั้นแตกต่างกัน

ArrayFilter[f,list,r]แผนที่fบนองค์ประกอบของทุกภายในรัศมีของlistr

ArrayFilter[f,{1,2,3,4,5},1]
(* { f[{1,1,2}], f[{1,2,3}], f[{2,3,4}], f[{3,4,5}], f[{4,5,5}] } *)

โปรดทราบว่าองค์ประกอบขอบเขตจะทำซ้ำเมื่อมีเพื่อนบ้านไม่เพียงพอ เมื่อlistมีขนาด 2 มิติคุณลักษณะนี้ทำงานได้ดีพร้อมกับDetให้ผลลัพธ์ที่ต้องการเนื่องจากคอลัมน์หรือแถวที่ซ้ำกันในสี่เขตแดนหายไปปัจจัย

ArrayFilter[Det,Power~Array~{4,4},1]
(*
  {{0, 0,  0,    0},
   {0, 12, 72,   0},
   {0, 48, 1152, 0},
   {0, 0,  0,    0}}
*)

ซึ่งPower~Array~{4,4}รับประกันว่าดีเทอร์มิแนนต์ในตำแหน่งภายในจะไม่เป็นศูนย์ และ

1-Unitize@%
(*
  {{1,1,1,1},
   {1,0,0,1},
   {1,0,0,1},
   {1,1,1,1}}
*)

ให้เมทริกซ์หน้ากาก


4

Python ขนาด 50 ไบต์

def f(a):
 for l in a[1:-1]:l[1:-1]=[0]*(len(l)-2)

ยอมรับรายชื่อของรายการและแก้ไขมันในสถานที่ ไวยากรณ์ของส่วนของ Python ไม่สะดวกสำหรับงานนี้

ฉันได้เรียนรู้ว่าการทวีคูณรายการด้วยจำนวนลบส่งผลให้เกิดรายการที่ว่างซึ่งทำให้โค้ดข้างต้นสามารถทำงานกับอินพุตขนาดเล็กได้


4

Julia, 50 35 bytes

A->A[2:size(A,1)-1,2:size(A,2)-1]=0

นี่คือฟังก์ชั่นนิรนามที่ยอมรับอาร์เรย์และแก้ไขมัน หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

วิธีการที่นี่ค่อนข้างง่าย: สำหรับnโดยmอินพุตอาร์เรย์AเรากำหนดA ij = 0 สำหรับทุกi = 2, ... , n -1 และj = 2, ... , m -1 โดยการสร้างช่วง ของดัชนี ช่วงอาจว่างเปล่าเช่นถ้าnหรือm = 1 ซึ่งในกรณีนี้จะไม่มีการแทนที่

ลองออนไลน์

บันทึก 15 ไบต์ขอบคุณเดนนิส!


4

C, 62 ไบต์

y;f(a,b,c)int **a;{for(b--;b-->1;)for(y=1;y<c-1;)a[b][y++]=0;}

หวังว่ามันโอเคที่จะใช้ความยาว / ความกว้างของอาเรย์เป็นพารามิเตอร์ ฉันเล่นกับ memset / bzero นิดหน่อย แต่การคูณด้วยการsizeof(int)เพิ่มขนาดรหัสอย่างมาก

แก้ไข: 55 ไบต์ถ้าเราสามารถงอกฎเพิ่มเติมและเก็บอาร์เรย์ของเราเป็นตัวอักษรเนื่องจากการป้อนข้อมูลเป็นตัวเลขหลักเดียวเท่านั้น

x;
#define f(a,b,c) for(x=1;x<b-1;)bzero(a[x++]+1,c-2);

แก้ไข: ขอบคุณ Washington Guedes สำหรับคำแนะนำ!


คุณลองคูณด้วยตัวอักษรsizeof(int)? คุณสามารถใช้4แทน ...
Anatolyg

sizeof(int) != 4ในเครื่องของฉัน: P
Josh

ฉันเดิมพันว่ามันยังคงเป็นตัวเลขหลักเดียวซึ่งคุณสามารถใช้ได้
anatolyg

ฉันหมายถึง ณ จุดนั้นฉันสามารถตัดสินใจได้ว่ามันเป็นอาร์เรย์ของตัวอักษรแทนที่จะเป็น ints เนื่องจากปัญหาใช้ตัวเลขหลักเดียวเท่านั้น เพียงแค่ขึ้นอยู่กับว่าเราต้องการโค้งกฏแค่ไหน
Josh

ขอบคุณ! ตอนนี้ฉันยังต้องใช้ตัว-->ดำเนินการที่ห่างออกไป;)
Josh Josh

3

Perl 6 , 28 ไบต์

{.[1..*-2]»[1..*-2] »=»0}

สิ่งนี้จะแก้ไขอินพุตในสถานที่

การใช้

my @test-cases = (
  [[3],] => [[3],],
  [[7,2,8],] => [[7,2,8],],
  [[3],[5],[12],[-6]] => [[3],[5],[12],[-6]],
  [[99,98,97],[88,87,86]] => [[99,98,97],[88,87,86]],
  [[6,7],[8,9],[10,11]] => [[6,7],[8,9],[10,11]],
  [[ -1,-2,-3],[1,2,3],[5,5,5]] => [[ -1,-2,-3],[1,0,3],[5,5,5]],
  [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] => [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]],
  [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] => [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]],
);

use Test;
plan +@test-cases;

for @test-cases {
  my $k = .key;
  {.[1..*-2]»[1..*-2] »=»0}( $k ); # <==
  ok $k eqv .value
}
1..8
ok 1 - 
ok 2 - 
ok 3 - 
ok 4 - 
ok 5 - 
ok 6 - 
ok 7 - 
ok 8 - 

{.[1..*-2]»[1..*-2]X=0}บันทึก 2 ไบต์
raiph

@raiph ไม่ปรากฏว่าใช้งานได้ในสองกรณีสุดท้าย
Brad Gilbert b2gills

3

JavaScript ES6, 69 66 57 ไบต์

Y=>Y.map((X,y)=>X.map((N,x)=>x*y&&X[x+1]+.5&&Y[y+1]?0:N))

มันทำงานอย่างไร

วิธีการแก้ปัญหานี้แมปผ่านดัชนี y yและดัชนีx xในแต่ละอินพุทและตัดสินใจว่าจะโยนทิ้งตามดัชนีทั้งสองนี้หรือไม่ มีสี่กรณีที่เราจำเป็นต้องเก็บ:

  • x คือ 0
  • y คือ 0
  • x เท่ากับความยาวของอาร์เรย์ภายในลบ 1
  • y เท่ากับความยาวของอาเรย์ด้านนอกลบ 1

เราสามารถดูแลสองตัวแรกด้วยการคูณเล็กน้อย: x*yส่งคืน0iff อย่างใดอย่างหนึ่งxหรือyเป็น 0 และจำนวนเต็มบวกเป็นอย่างอื่น ทีนี้สำหรับข้อที่สามเราสามารถตรวจสอบได้X.length>x+1แต่นั่นต้องใช้จำนวนมาก อีกวิธีหนึ่งในการทำเช่นนี้คือการตรวจสอบว่ารายการข้างหน้าเป็นเท็จหรือไม่นั่นundefinedคือสิ่งที่คุณได้รับเมื่อพยายามเข้าถึงรายการที่ไม่มีอยู่จริง อย่างไรก็ตามสิ่งนี้ยังตรงกันหากรายการถัดไปคือ0เราจึงเพิ่ม 0.5 เพื่อให้แน่ใจว่าจะไม่เกิดขึ้น:

1 + 0.5 = 1.5 (truthy)
0 + 0.5 = 0.5 (truthy)
-1 + 0.5 = -0.5 (truthy)
undefined + 0.5 = NaN (falsy)

ในที่สุดจุดที่สี่: เนื่องจากอาร์เรย์ด้านนอกมีอาร์เรย์ภายในเท่านั้นและอาร์เรย์ใด ๆ เป็นความจริงเราจึงสามารถตรวจสอบY[y+1]ได้ ตอนนี้?0:Nเราเปลี่ยนมันเป็น0ถ้าความจริงข้างต้นกลายเป็นจริง Nมิฉะนั้น. และนั่นมัน!


3

จอประสาทตา31 24 22

(?<=¶.+ )\S+(?= .*¶)
0

บันทึก 2 ไบต์ด้วยการสุ่ม

ลองออนไลน์!

อาจมีวิธีที่ดีกว่าในการทำเช่นนี้เป็นเพียงการเปลี่ยนหลายบรรทัดพื้นฐานสวย โดยพื้นฐานแล้วเราจะพบแต่ละหมายเลขที่ขึ้นต้นด้วยการขึ้นบรรทัดใหม่จำนวนอักขระและช่องว่างและตามด้วยช่องว่างทันทีจากนั้นและตามด้วยบรรทัดใหม่ในที่สุด ตัวเลขเหล่านี้จะถูกแทนที่ด้วย0ทั้งหมด

สิ่งนี้จะไม่รักษาการแพ็ดคอลัมน์ แต่ฉันไม่คิดว่าเป็นปัญหา


3

Java 8, เป็นฟังก์ชัน lambda: 82 83 95 chars / bytes

แลมบ์ดาลายเซ็น: int[][] -> (void)(เช่นConsumer<int[][]>)

(a)->{int[]v={1,1};while(++v[0]<a.length){while(++v[1]<a[0].length)a[v[0]-1][v[1]-1]=0;v[1]=1}}

แก้ไขทำผิดฉันคิดว่า [x, y] เป็นแถวที่ x และคอลัมน์ที่ y เห็นได้ชัดว่ามันควรจะเป็น [x] [y] แม้ว่า!

แก้ไขฉันลืมที่จะทดสอบรหัสและฉันต้องตั้งค่าคอลัมน์กลับเป็นศูนย์ทุกครั้งภายในลูป, +12 ไบต์ : /


3

Haskell, 59 58 ไบต์

k _[x]=[x]
k f(x:y)=x:(f<$>init y)++[last y]
f=k(k(\_->0))

ขยาย

onInner :: (a -> a) -> [a] -> [a]
onInner _ [x]    = [x]
onInner f (x:xs) = x : map f (init xs) ++ [last xs]

hollowOut :: [[Int]] -> [[Int]]
hollowOut = 
   onInner       -- leave first and last line alone 
     (onInner    -- leave first and last entry per line 
       (const 0) -- replace entries by 0
     )

คุณควรจะเปลี่ยน++[last y]เป็น:(last y)หรือ:last y
HEGX64

@ HEGX64: ไม่ผิดประเภท x : map f (…)ที่มีอยู่แล้วจากประเภท[a]และlast yมีประเภทในขณะที่a (:) :: a -> [a] -> [a]การเพิ่มองค์ประกอบที่ส่วนท้ายของรายการในประเภทของ Haskell เนื่องจากรายการเหล่านั้นเป็นรายการเชื่อมโยงไปข้างหน้าเดียว
ซีตา

ขออภัย ฉันรู้ว่าฉันควรลองด้วยตัวเองก่อนโพสต์ :)
HEGX64

1
คุณสามารถเปิดkเป็นผู้ประกอบการมัดสมมติว่า#และพลิกข้อโต้แย้งที่จะบันทึกหนึ่งไบต์: [x]#_=..., (x:y)#f=..., f=(#(# \_->0))และคุณสามารถวางชื่อของฟังก์ชั่นหลักของคุณคือf=อีกสองไบต์
nimi

2

Pyth, 18 ไบต์

Qjbm:dSttld0P.Qe.Q

คำอธิบาย

                   - autoassign Q=eval(input())
                   - autoassign .Q = map(eval, rest_of_input)
Q                  - imp_print(Q)
   m        P.Q    -  [V for d in .Q[:-1]]
      Sttld        -     range(1, len(d)-2+1)
    :d     0       -    assign_indexes(d, ^, 0)
 jb                - "\n".join(^)
               e.Q - imp_print(.Q[-1])

อาร์เรย์อินพุตถูกคั่นด้วยบรรทัดใหม่

ลองที่นี่


2

Groovy, 70 ไบต์

นี่ไม่ใช่ความคิดสร้างสรรค์ แต่มันสั้น!

g={a->for(i=1;i<a.size()-1;i++)for(j=1;j<a[i].size()-1;)a[i][j++]=0;a}

คำอธิบาย

ปิดด้วย arg หนึ่ง

g={a-> 

ทำซ้ำอาร์เรย์ภายในโดยข้ามองค์ประกอบแรกและสุดท้าย

for(i=1;i<a.size()-1;i++)

วนซ้ำรายการกลางในอาร์เรย์ภายใน

for(j=1;j<a[i].size()-1;)

ตั้งค่าองค์ประกอบเป็น0และย้อนกลับa

a[i][j++]=0;a}

การทดสอบ

assert g([[3]]) == [[3]]
assert g([[7, 2, 8]]) == [[7, 2, 8]]
assert g([[3], [5], [12], [-6]]) == [[3], [5], [12], [-6]]
assert g([[99, 98, 97], [88, 87, 86]]) == [[99, 98, 97], [88, 87, 86]]
assert g([[6, 7], [8, 9], [10, 11]]) == [[6, 7], [8, 9], [10, 11]]
assert g([[-1, -2, -3], [1, 2, 3], [5, 5, 5]]) == [[-1, -2, -3], [1, 0, 3], [5, 5, 5]]
assert g([[67, 4, -8, 5, 13], [9, 13, 42, 4, -7], [1, 1, 3, -9, 29], [16, 99, 8, 77, 0]]) == [[67, 4, -8, 5, 13], [9, 0, 0, 0, -7], [1, 0, 0, 0, 29], [16, 99, 8, 77, 0]]
assert g([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0]]) == [[0, 1, 0, 1, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 1, 0, 1, 0]]

2

R, 71 64 57 ไบต์

function(m){if(all((y<-dim(m)-1)>1))m[2:y[1],2:y[2]]=0;m}

แก้ไข -7 ไบต์โดยจัดการกับเมทริกซ์ <2 แถวหรือ <2 คอลัมน์อย่างชัดเจนแก้ไข 2-7ไบต์โดยกำหนดมิติของเมทริกซ์ขณะตรวจสอบขนาด


1

C ++ 80 79 ไบต์

คาดหวังอาร์เรย์เช่นเดียวint**กับขนาดที่กำหนดnและk:

void p(int**c,int n,int k){for(int j,i=1;1+i<n;++i)for(j=1;j+1<k;)c[i][j++]=0;}

ทางเลือกที่เหมาะกับประเภทใด ๆ ที่มีsize()และvalue_type & operator[](int)(98 ไบต์):

template<class C>void p(C&c){for(int j,i=1;1+i<c.size();++i)for(j=1;j+1<c[i].size();)c[i][j++]=0;}

รุ่นขยาย

template <class Container>
void hollowOut(Container & ctn){
    const auto size = ctn.size();

    for(typename Container::size_type i = 1; i + 1 < size; ++i) {
        const auto inner_size = ctn[i].size();

        for(decltype(inner_size) j = 1; j + 1 < inner_size; ++j) {
            ctn[i][j] = 0;
        }
    }
}

ดูเหมือนว่าการเพิ่มขนาดเมทริกซ์ให้กับอินพุตเป็นช่องโหว่มาตรฐาน
Aross

1

PHP, 82 81 80 71 ไบต์

function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};

ทำงานแบบนี้:

php -r '$f = function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};   $z=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; $f($z); print_r($z);'
  • บันทึกเป็นไบต์โดยสมมติว่าแถวมีขนาดคงที่ (ขอบคุณเพื่อการจัดการ)
  • บันทึกไบต์โดยทำให้เป็นฟังก์ชันที่ไม่ระบุชื่อ
  • บันทึก 7 ไบต์โดยใช้ความจริงของรายการอาเรย์ถัดไปเพื่อป้องกันการโทรออกcountซึ่งเป็นชื่อยาวเกินไปสำหรับ codegolf

ในการประมวลผลเมทริกซ์อาร์เรย์ย่อยทั้งหมดควรมีความยาวเท่ากัน ดังนั้นด้านในforจึงปลอดภัยที่จะย้ำcount($z[0])-1จนถึงตัวละคร 1 ตัวเสมอ
จัดการ

1

APL, 17 ไบต์ 15 ไบต์

{⍵×(⌽∨⊖)1∊¨⍳⍴⍵}

มันทำงานอย่างไร

  • ⍳⍴⍵ สร้างอาร์เรย์ 2D ที่เซลล์ทั้งหมดมีพิกัดของเซลล์ทั้งหมดของการโต้แย้ง
  • 1∊¨ค้นหาในแต่ละเซลล์ถ้ามี 1 และส่งคืน 1 ถ้าเป็นเช่นนั้นหรือ 0 เป็นอย่างอื่น สิ่งนี้จะสร้างเมทริกซ์โดยที่แถวแรกและคอลัมน์แรกคือ 1s และส่วนที่เหลือทั้งหมดเป็น 0
  • (⌽∨⊖) รวมกับตรรกะ "หรือ" เมทริกซ์สองเวอร์ชันหนึ่งอันย้อนกลับไปตามลำดับแรกและอีกหนึ่งกลับด้านตามแกนสุดท้าย
  • ⍵× คือการคูณมาตรฐาน

คุณสามารถทดแทน (⊣∨⊖∘⌽) ด้วย (⊖∨⌽) น้อยกว่าสองไบต์
Moris Zucca

ยอดเยี่ยม! ให้ฉันทำอย่างนั้น!
lstefano

0

Perl, 34 + 2 = 36 ไบต์

next if$.==1||eof;s/ .+?(?= )/ 0/g

ต้องการ-pธง:

$ perl -pE'next if$.==1||eof;s/ .+?(?= )/ 0/g' <<< $'1 2 3\n4 5 6\n7 8 9'
1 2 3
4 0 6
7 8 9

มันทำงานอย่างไร:

# '-p' Read each line into `$_` and auto prints
next if$.==1||eof; # `$.` is set to to the current line in file (1, 2, ..., n)
                   # and `eof` is true if its the last line
s/ .+?(?= )/ 0/g

0

Lua, 69 ไบต์

function f(a)for i=2,#a-1 do
for o=2,#a[i]-1 do
a[i][o]=0
end
end end

ถ้าเพียง แต่ฉันมีเครื่องมือจัดฟันแบบหยิกแทนที่จะทำแบบดอสและสิ้นสุด ...


0

SmileBASIC, 69 51 ไบต์

DEF H A,W,H
FOR I=1TO H-2FILL A,0,W*I+1,W-2NEXT
END

การเติมพื้นที่ 2 มิติในอาเรย์จะต้องใช้การเติมในการวนซ้ำ แต่การทำงานกับข้อมูล 2D บนหน้ากราฟิกนั้นทำได้ง่ายกว่าดังนั้นอันดับแรกจึงถูกคัดลอกไปที่นั่น

ฉันคิดว่าฉันฉลาดมากในการใช้คำสั่งกราฟิก ... แต่ปรากฎว่าการเรียก FILL หลายครั้งนั้นสั้นกว่าจริง

อย่างไรก็ตามฟังก์ชั่นอินพุทคืออาร์เรย์และความกว้าง / ความสูง (นี่เป็นมาตรฐานใน Smilebasic เพราะไม่มีทางที่จะตรวจสอบขนาดของอาเรย์)


0

APL (Dyalog Classic)ขนาด 12 ไบต์

⊢-(⍉01↓⌽)⍣4

ลองออนไลน์!

⍉⌽⍵ โดยปกติการหมุน (กลับในแนวนอนและไขว้)

ที่นี่เรารวมเข้าด้วยกัน0⍪1↓⍵ซึ่งจะแทนที่แถวแรกด้วยศูนย์ (ดรอปหนึ่งแถวจากนั้นต่อ 0 เข้ากับด้านบน) ลงในรถไฟขบวนเดียว:⍉0⍪1↓⌽

⍣4 ทำซ้ำ 4 ครั้ง

⊢- ลบออกจากเมทริกซ์ดั้งเดิม

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