มีเสียงก้องในชุดของฉัน ... สะท้อนในชุดของฉัน ... ชุดของฉัน


34

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

ตัวอย่างเช่นอาร์เรย์[ 422, 375, 527, 375, 859, 451, 754, 451 ]มีเสียงสะท้อนของตัวเองเช่น:

[ 422, 375, 527, 375, 859, 451, 754, 451 ] <-- array with echo (input)

[ 422, 375, 105,   0, 754, 451           ] <-- original array (output)
[           422, 375, 105,   0, 754, 451 ] <-- echo of original array

ตัวอย่างที่ 2:

[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ] <-- input

[ 321, 526,  751, 373, 5812, 425, 1226, 2877, 1806,  601            ] <-- output
[            321, 526,  751, 373, 5812,  425, 1226, 2877, 1806, 601 ]

อาจเป็นไปได้ว่าไม่มีเสียงสะท้อนในอาเรย์ซึ่งในกรณีนี้จะคืนอาเรย์เดิม:

ตัวอย่างที่ 3:

[ 623, 533, 494, 382 ] <-- input
[ 623, 533, 494, 382 ] <-- output

ท้าทาย:

รับอาร์เรย์ที่อาจมี echo ให้ลบออกแล้วส่งกลับอาร์เรย์โดยไม่มีเสียงสะท้อน

การป้อนข้อมูล:

  • อาร์เรย์รายการสตริงคั่นด้วยบัตรเจาะหรือเทียบเท่าแพลตฟอร์มที่เหมาะกับคุณที่มีสามหรือมากกว่าจำนวนเต็มในช่วง0n<10000มีอย่างน้อยหนึ่งองค์ประกอบ>0 0
  • เสียงสะท้อนไม่สามารถเริ่มได้ตั้งแต่แรกหรือหลังองค์ประกอบสุดท้าย
  • เสียงสะท้อนจะเกิดขึ้นเพียงครั้งเดียวหรือไม่เลยในอินพุต

เอาท์พุท:

  • 0n<10000
  • หากไม่มีเสียงสะท้อนให้ส่งคืนอาร์เรย์เดิม

กฎและเกณฑ์การให้คะแนน:

กรณีทดสอบ:

ด้วยเสียงสะท้อน:

[ 422, 375, 527, 375, 859, 451, 754, 451 ]
[ 422, 375, 105, 0, 754, 451 ]

[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ]
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]

[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 7109, 4171, 5349, 2675, 3056, 4702, 4229, 1726, 5423, 6039, 8076, 6047, 7088, 9437, 4894, 1946, 7501, 5331, 3625, 5810, 6289, 2858, 6610, 4063, 5565, 2200, 3493, 4573, 4906, 3585, 4147, 3748, 3488, 5625, 6173, 3842, 5671, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 2779, 423, 4986, 2540, 298, 1403, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]

[ 24, 12, 52, 125, 154, 3, 567, 198, 49, 382, 53, 911, 166, 18, 635, 213, 113, 718, 56, 811, 67, 94, 80, 241, 343, 548, 68, 481, 96, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 25, 370, 1, 786, 12, 15, 68, 15, 88, 348, 55, 25, 55, 79, 12, 226, 255, 200, 13, 456, 41 ]

[ 1, 3, 2 ]
[ 1, 2 ]

[ 0, 1, 3, 2, 0 ]
[ 0, 1, 2, 0 ]

ไม่มีเสียงสะท้อน:

[ 623, 533, 494, 382 ]
[ 623, 533, 494, 382 ]

[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]

[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]

[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]

[ 1, 1, 1, 1, 1 ]
[ 1, 1, 1, 1, 1 ]

3
เกิดอะไรขึ้นถ้ามีเอาต์พุตที่เป็นไปได้หลายอย่าง? อินพุต: [1, 2, 2, 2, 1]; ผลลัพธ์: [1, 1, 1, 1]vs.[1, 2, 1]
tsh

3
คือผลลัพธ์ที่คาดว่าจะเกิดอะไรขึ้น[1, 2, 3, 1, 2, 3], [1, 2, 3, 0, 1, 2, 3], [0, 1, 3, 2, 0]? คำตอบปัจจุบันไม่เห็นด้วยกับอินพุตเหล่านี้ทั้งหมด
tsh

@tsh สามารถยอมรับได้( [1, 1, 1, 1]เทียบกับ[1, 2, 1]) อย่างใดอย่างหนึ่ง ตอนแรกฉันมีกฎว่าต้องเลือกอะไร แต่เอาออกไปในกล่องทรายเพราะมันดูเหมือนจะใช้กับเคสขอบจำนวนเล็กน้อยเท่านั้น
640KB

@tsh [0, 1, 3, 2, 0]ควรเป็น[0, 1, 2, 0]- ฉันได้เพิ่มไปยังกรณีทดสอบ คำตอบที่คาดว่าในอีกสองอาจจะเป็นแม้ว่าฉันจะไม่พิจารณากรณีทดสอบเหล่านั้นที่ถูกต้องตั้งแต่ตามกฎ[1, 2, 3] the original array repeats itself somewhere in the middle
640KB

1
@nimi หนึ่งที่ดี ฉันจะบอกว่ามันคลุมเครือว่า[0,0,0](หรือ0อาร์เรย์ขนาดใดก็ได้) แทนเสียงสะท้อนของอะไรหรือถ้า[0,0,0](ไม่มีเสียงก้อง) ก็จะเป็นคำตอบที่ถูกต้องสำหรับกรณีพิเศษนี้เช่นกันเนื่องจากไม่มีข้อมูลเพียงพอที่จะพิจารณาว่า มันคือ. ฉันจะอัปเดตกฎเพื่อ จำกัด สิ่งนี้จากการป้อนข้อมูลที่ถูกต้องเนื่องจากจะไม่ทำให้ถูกต้องหรือแก้ไขคำตอบที่มีอยู่
640KB

คำตอบ:


8

MATL , 16 ไบต์

t"GX@WQB&Y-~?w]x

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

คำอธิบาย

ฝ่ายพหุนามชนะ!

t      % Implicit input. Duplicate
"      % For each (do the following as many times as input length)
  G    %   Push input again. This will be the output if no solution exists
  X@   %   Push current iteration index, k
  WQB  %   2 raised to that, add 1, convert to binary. Gives [1 0 ... 0 1] (k-1 zeros)
  &Y-  %   Two-output polynomial division (deconvolution). Gives quotient and remainder
  ~    %   Logical negate: transforms zeros into 1, nonzeros into 0
  ?    %   If all values are nonzero (i.e. if remainder was all zeros): solution found
    w  %      Swap. This moves the copy of the input to top (to be deleted)
  ]    %   End
  x    %   Delete. This deletes the quotient if it was not a solution, or else deletes
       %   the copy of the input
       % End (implicit). Since it is guaranteed that at most one solution exists, at this
       % point the stack contains either the solution or the input
       % Implicit display

ไม่มีผู้รับใน "eso" หรือ "ประวัติศาสตร์" ค่าหัวภาษานี้ ... ดังนั้นค่าหัวจึงได้รับความนิยม!
640KB

1
@ 640KB ฉันไม่รู้ว่ามีความท้าทายมากมายในนี้! ขอขอบคุณ!
Luis Mendo

7

Haskell , 167 ไบต์

[1,1],[1,0,1],[1,0,0,1],...ครั้งแรกมันเป็นสิ่งสำคัญที่จะแจ้งให้ทราบว่าถ้ามีเป็นปัจจุบันก้องแล้วเข้าแถวเป็นบิดของอาร์เรย์อื่นกับอาร์เรย์ของรูปแบบบางส่วน

หมายความว่าเราต้องตรวจสอบเรื่องนี้สำหรับอาร์เรย์ทั้งหมด แต่การแยกคอนโซ / deconvolution ไม่ต่อเนื่องเหมือนกับการหารพหุนาม / การหารยาวดังนั้นนี่เป็นเพียงการใช้พหุนามซึ่งแต่ละครั้งจะส่งผลหารหารถ้าเป็นไปได้

เคล็ดลับอย่างหนึ่งที่ทำให้ทุกสิ่งสั้นลงเล็กน้อยนอกเหนือไปจากอาร์เรย์ข้างต้นยังตรวจสอบ[1]ว่าเป็นกรณีพื้นฐานเพราะหากไม่มีอาร์เรย์อื่นทำงาน deconvolution ด้วย[1]จะทำงานและจะคืนพหุนามเดิม

import Math.Polynomial
import Data.Ratio
p=poly LE
c z=last[polyCoeffs LE q|k<-zipWith const[p(take k(1:repeat 0)++[1])|k<-[0..]]z,(q,r)<-[quotRemPoly(p z)k],r==zero] 

ลองออนไลน์!


เคล็ดลับดี ๆ กับเคสตัวฐาน! ฉันพยายามที่จะรวมเข้าไปในคำตอบของฉัน แต่ฉันสามารถย่อรหัสได้
Luis Mendo

4

JavaScript , 211 171 145 145 ไบต์

s=>{for(n=x=0,y=s.length;++x<y/2&!n;)for(n=s.slice(i=0,x);i+x<y-x&&n;)n=(n[i+x]=s[i+x]-n[i++])<0?0:n;return n&&n.slice(1-x)+''==s.slice(1-x)?n:s}

ลองออนไลน์

40 bytes จากKevin Cruijssen

อีก 26 ไบต์จากArnauld

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


1
ฉันไม่ได้มีฝีมือมากเกินไปกับ JavaScript แต่มี Golfs พื้นฐานบางอย่าง (เช่นการลบวงเล็บที่ไม่จำเป็นให้เปลี่ยนตำแหน่งของ++การเปลี่ยน&&ไป&ในการตรวจสอบครั้งแรกของการเปลี่ยนแปลงทั้ง.toString()การ+''ฯลฯ ) ผมได้รหัสของคุณลงไป181 ไบต์ หากคุณยังไม่ได้เห็นเคล็ดลับสำหรับการเล่นกอล์ฟใน JavaScriptและเคล็ดลับสำหรับการเล่นกอล์ฟในทุกภาษาอาจน่าสนใจสำหรับการอ่าน :)
Kevin Cruijssen

1
โอ้ลืมหนึ่ง ( function q(s)อาจจะs=>): 171 ไบต์ เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

ขอบคุณที่ฉันจะอ่าน ฉันไม่ค่อยมีประโยชน์กับ javascript แต่ฉันต้องทำอะไรเล็กน้อยเมื่อเร็ว ๆ นี้และคิดว่านี่อาจเป็นวิธีที่ดีในการหยุดทำงานในช่วงเวลาที่ไม่ดี
Levi Faid

1
อธิบายเพิ่มเติม (โดยไม่มีการทดสอบทั้งหมดเพื่อให้พอดีกับ URL โดยตรงในความคิดเห็นนี้)
Arnauld

1
ยินดีต้อนรับสู่ Code Golf SE! เราหวังว่าคุณจะสนุกกับการเล่นกอล์ฟที่นี่!
Giuseppe

3

Haskell, 112 111 110 ไบต์

l=length
(!)=splitAt
f a=last$a:[x|i<-[1..l a],let (h,t)=i!a;o=h++zipWith(-)t o;(x,y)=l t!o,all(>=0)o,sum y<1]

ลองออนไลน์!

f a=                
      i<-[1..l a]                -- for all indices 'i' of the input array 'a'
      (h,t)=i!a                  -- split 'a' at 'i' into 'h' and 't'
                                 -- e.g. a: [1,2,3,4], i: 1 -> h: [1], t:[2,3,4] 
      o=                         -- calculate the original array by
        h++                      --   prepended 'h' to
        zipWith(-)t o            --   the (element-wise) difference of
                                 --   't' and itself
      (x,y)=l t!o                -- split 'o' at position <length of t>
                                 --
                                 -- example:
                                 --      a: [0,1,3,2,0]
                                 --      h: [0]
                                 --      t: [1,3,2,0]
                                 --   now
                                 --      o: [0,1,2,0,0]
                                 --      x: [0,1,2,0]
                                 --      y: [0]
                                 --
    ,                            -- 'o' is valid, if
     all(>=0)o                   --   all elements of 'o' are not negative
    ,sum y<1                     --   and 'y' is all zeros
  [x|         ]                  -- keep 'x' (a valid echo array) if 'o' is valid

 last $ a :[  ]                  -- if there's no echo, the list of 'x's is empty
                                 -- and 'a' is picked, else the last of the 'x's 

3

ภาษา Wolfram (Mathematica) , 131 129 120 119 102 98 97 96 95 ไบต์

(w=#;Do[(w=v/.#)&/@Thread[#==PadLeft[v=Array[x,L-d],L]+v~PadRight~L]~Solve~v,{d,L=Tr[1^#]}];w)&

ลองออนไลน์!

−1 byte ขอบคุณattinat : เราสามารถเขียนL=Tr[1^#]แทนL=Length@#เมื่ออาร์กิวเมนต์เป็นรายการของตัวเลข

คำอธิบายรหัส: ทำซ้ำผ่านการหดตัวd(ความแตกต่างระหว่างความยาวของอินพุตและเอาต์พุต) สำหรับแต่ละรายการระยะเวลาในการส่งออกสร้างรายชื่อของราชวงศ์v={x[1],x[2],...,x[L-d]}และเพิ่มเข้าไปในตัวเองซ้ายเบาะและเบาะขวาความยาวL( PadLeft[v,L]+PadRight[v,L]) x[1]...x[L-d]จากนั้นตั้งค่าจำนวนนี้เท่ากับรายการป้อนข้อมูลและแก้ปัญหาสำหรับราชวงศ์ เลือกโซลูชันที่สั้นที่สุดซึ่งเป็นโซลูชันล่าสุดที่สร้างขึ้น: เพียงเขียนทับตัวแปรwทุกครั้งที่พบโซลูชัน

เวอร์ชันที่ไม่ตีกอล์ฟ:

F = Function[A,                                  (* A is the input list *)
  Module[{L = Length[A],                         (* length of A *)
          v,                                     (* list of unknowns *)
          x,                                     (* unknowns in v *)
          w = A},                                (* variable for solution, defaults to A *)
    Do[                                          (* loop over shrinkage: d = Length[A]-Length[output] *)
      v = Array[x, L - d];                       (* list of unknowns to be determined *)
      (w = v /. #) & /@                          (* overwrite w with every... *) 
        Solve[                                   (* ...solution of... *)
          Thread[PadLeft[v,L]+PadRight[v,L]==A], (* ...v added to itself, left-padded and right-padded, equals A *)
          v],                                    (* solve for elements of v *)
    {d, L}];                                     (* loop for shrinkage from 1 to L (the last case d=L is trivial) *)
    w]];                                         (* return the last solution found *)

-1 พร้อมTr[1^#]แทนLength@#
attinat

2

เยลลี่ , 25 24 ไบต์

ðsạ\FḣL_¥,+¥Ż⁹¡$µⱮLṪ⁼¥Ƈȯ

ลองออนไลน์!

ลิงก์ monadic ที่รับและส่งคืนรายการจำนวนเต็ม ในทางเทคนิคแล้วผลลัพธ์ที่ประสบความสำเร็จนั้นซ้อนอยู่ในสองรายการเพิ่มเติม แต่เมื่อเรียกใช้เป็นโปรแกรมแบบเต็มเอาต์พุตโดยนัยไปยัง stdout จะไม่สนใจรายการที่ซ้ำซ้อน


2

Python 2 , 113 123 128 127 123 122 ไบต์

def f(a,i=1):
 e=a[:i]
 for v in a[i:-i]:e+=v-e[-i],
 return i<=len(a)/2and(min(e)>=0<e[-i:]==a[-i:]and e or f(a,i+1))or a

ลองออนไลน์!

1 ไบต์ขอบคุณที่TFeld ; และ 1 ไบต์ขอบคุณไปเซบาสเตียน Kreft

ในแต่ละการเรียกร้องให้เราสร้างเสียงสะท้อนที่มีศักยภาพของความยาวf len(a)-iส่วนแรกเป็นเพียงiไบต์แรกของ a; ส่วนที่เหลือจะถูกคำนวณเพื่อให้ 'echoed sum' จะถูกต้องสำหรับส่วน 'ที่ทับซ้อนกัน' ของ echo sum (เช่น echo-sum นั้นถูกต้องสูงสุดa[:-i])

จากนั้นการเปรียบเทียบที่สั้นมากไม่ได้ตีกอล์ฟให้:

if i>=len(a)/2+1:
    return a # because it can't be that short, so there is no echo
else:
    if min(e)>=0                       # all elements are non-negative
                 and e[-i:]==a[-i:]:   # and the tails are the same
        return e                       # it's a match!
    else:
        return f(a,i+1)                # recurse

e+=[v-e[-i]]สามารถe+=v-e[-i],
TFeld

คุณสามารถโกนตัวละครได้อีกหนึ่งตัวโดยทำi<=len(a)/2
Sebastian Kreft

2

ภาษา Wolfram (Mathematica) , 93 ไบต์

(b=#;Do[a=#;Do[a[[i+j]]-=a[[j]],{j,2k}];a/.{__?(#>=0&),0}:>(b=a~Drop~-i),{i,k=Tr[1^#]/2}];b)&

ลองออนไลน์!

ส่งคืน echo ที่สั้นที่สุดในรายการ


ลักษณะเช่นนี้ล้มเหลวบนและ{1,1,1} {1,0,1}
โรมัน

@ Roman ไม่มีเสียงสะท้อนสำหรับกรณีใดกรณีหนึ่งหรือไม่
attinat

เพราะ{1,1,1}ไม่มีเสียงสะท้อนดังนั้นคุณต้องกลับอาร์เรย์เดิม สำหรับ{1,0,1}ฉันพูดก้อง{1}แต่ยอมรับว่ามันค่อนข้างชัดเจนว่าสิ่งที่เป็นกฎ
โรมัน

อ่าใช่มั้ย ขอบคุณสำหรับการจับ!
attinat

2

PHP , 124 ไบต์

function($a){while(!$z&&++$y<$c=count($b=$a))for($x=0;$x<$c&$z=0<=$b[$x+$y]-=$b[$x++];);return array_slice($b,0,$c-$y)?:$a;}

ลองออนไลน์!

คำอธิบาย:

>0

function( $a ) {
  // iterate through all possible offsets of echo
  while( ! $b && ++$y < $c = count( $b = $a ) ) {
    // create a copy of input array, iterate through all elements
    for( $x = 0; $b && $x < $c; ) {
      // if difference between the elements in the offset copy of 
      // the array is positive, subtract the value in the input array
      // from the offset array in the same column
      if ( ( $b[ $x+$y ] -= $b[ $x++ ] ) < 0 ) {
        // result is not valid, erase array and break out of loop
        $b = 0;
      }
    }
  }
  // truncate output array to correct size. if still contains values, 
  // it is a valid result. otherwise return the original array
  return array_slice( $b, 0, $c-$y ) ?: $a;
}

2

Python 3 , 111 ไบต์

def f(r,l=1):o=r[:l];o+=(v-o[-l]for v in r[l:]);return l<len(r)and(min(o)<any(o[-l:])and f(r,l+1)or o[:-l])or r

ลองออนไลน์!

โซลูชันใช้แนวคิดบางอย่างจากโซลูชันของ @Chas Brownเช่นโครงสร้างแบบเรียกซ้ำและการสร้างอาร์เรย์เอาต์พุต ในขณะเดียวกันก็ทำการเปลี่ยนแปลงบางอย่างในเกณฑ์การตัดสินรวมถึงการใส่ลูปในนิพจน์ตัวกำเนิดเพื่อให้โซลูชันบรรทัดเดียว เวอร์ชั่นที่ไม่ได้แสดงจะแสดงดังต่อไปนี้ ที่นี่อาเรย์outถูกคำนวณไปจนสุดทางของอาเรย์อินพุตจากนั้นเราตรวจสอบว่าlองค์ประกอบสุดท้ายของมันนั้นเป็นศูนย์ทั้งหมดหรือไม่ หากเป็นเช่นนั้นlen(arr)-lองค์ประกอบแรกจะถูกส่งกลับเป็นคำตอบหากองค์ประกอบทั้งหมดนั้นไม่เป็นลบ

เวอร์ชันที่ไม่ถูกเรียกซ้ำ

def remove_echo(arr):
    l = 1
    while l < len(arr):
        out = arr[:l]
        out += (v - out[-l] for v in arr[l:])
        if min(out) >= 0 and out[-l:] == [0] * l:
            return out[:-l]
        l += 1
    return arr

ลองออนไลน์!


1
@ 640KB ฉันตรวจสอบว่าคำตอบที่ส่งคืนนั้นตรงกับผลลัพธ์ที่คาดไว้ในรหัสของฉันและพิมพ์ข้อความเฉพาะเมื่อมีการยกเลิกการจับคู่ ดังนั้นไม่มีผลลัพธ์หมายความว่าทุกอย่างถูกต้อง ฉันยอมรับว่าสิ่งนี้อาจทำให้สับสนในการมองแวบแรกและฉันจะอัปเดตในภายหลังเพื่อพิมพ์ "แก้ไข" ในการแข่งขัน
โจเอล

1
@ 640KB อัปเดตแล้ว
โจเอล

1

ถ่าน , 62 ไบต์

≔⁰ζF⊘Lθ«≔E⊕ι⁰ηFLθ§≔ηκ⁻§θκ§ηκ¿⬤η¬κ≔⊕ιζ»F⁻Lθζ⊞υ⁻§θι∧ζ∧¬‹ιζ§υ±ζIυ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁰ζ

สมมติว่าไม่มีเสียงสะท้อน

F⊘Lθ«

ลองใช้จุดเริ่มต้นที่เป็นไปได้ทั้งหมดของเสียงสะท้อน หมายเหตุ: ฉันอาจมีคำถามที่ผิดและอาจไม่ได้ลองขนาดที่เพียงพอของ echo ซึ่งในกรณีนี้ไม่จำเป็น

≔E⊕ι⁰η

เริ่มต้นด้วยอาเรย์ของศูนย์ขนาดเดียวกันกับจุดเริ่มต้นของ echo

FLθ§≔ηκ⁻§θκ§ηκ

สำหรับแต่ละองค์ประกอบในอาร์เรย์ดั้งเดิมให้ลบองค์ประกอบในอาร์เรย์ echo ทุกวัน แต่ละองค์ประกอบในอาร์เรย์ echo จึงสร้างผลรวมสลับขององค์ประกอบที่อยู่ห่างกัน

¿⬤η¬κ≔⊕ιζ»

หากผลรวมทั้งหมดเป็นศูนย์ให้บันทึกเป็นจุดเริ่มต้นที่เป็นไปได้ (ดังนั้นหากมีความเป็นไปได้มากกว่าหนึ่งจุดจะใช้จุดเริ่มต้นที่ใหญ่ที่สุด)

F⁻Lθζ⊞υ⁻§θι∧ζ∧¬‹ιζ§υ±ζ

สร้างอาร์เรย์ echoing โดยการลบองค์ประกอบหลังจากจุดเริ่มต้นจากองค์ประกอบที่คำนวณไว้ก่อนหน้านี้ที่เหมาะสม

Iυ

ส่งไปยังสตริงสำหรับเอาต์พุตโดยนัยในบรรทัดแยก

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