ทำให้กราฟเส้นเรียบ


13

กำหนดอินพุตของจำนวนเต็มnและรายการจำนวนเต็มบวกm 1 , m 2 , ... , แสดงรายการรายการจำนวนเต็มm 1 ' , m 2 ' , ... โดยที่m x 'ถูกกำหนดเป็นค่าเฉลี่ยของ m xnผ่านม. x n +

เมื่อคำนวณค่าเฉลี่ยเหล่านี้ให้ละเว้นดัชนีที่อยู่นอกขอบเขต (และปรับสิ่งที่คุณหารผลรวมด้วย) nจะเป็น≥ 1 เสมอ แต่จะไม่ยาวครึ่งหนึ่งของความยาวm (ปัดลง) หรือมากกว่า ซึ่งหมายความว่าความยาวต่ำสุดของmคือ 4 องค์ประกอบในmจะเป็นจำนวนเต็มบวก แต่ผลลัพธ์จะต้องมีความถูกต้องถึงตำแหน่งทศนิยมอย่างน้อย 3 ตำแหน่ง

องค์ประกอบอินพุต / เอาต์พุตที่เป็นรายการอาจเป็นสตริงที่คั่นด้วยช่องว่างหรือคั่นด้วยเครื่องหมายจุลภาคหรืออาร์เรย์ / รายการ / ฯลฯ สำหรับอินพุตถ้าโซลูชันของคุณเป็นฟังก์ชันคุณอาจใช้อาร์กิวเมนต์แรกของnและอาร์กิวเมนต์เพิ่มเติมเป็นm x (ซึ่งจะใช้กับอาร์กิวเมนต์บรรทัดคำสั่งด้วย)

นี่คือการแสดงภาพของn=1:

1 4 5 7 10
__/ | | |
L avg(1,4) = 2.5
    | | |
\___/ | |
  L avg(1,4,5) = 3.333
      | |
  \___/ |
    L avg(4,5,7) = 5.333
        |
    \___/
      L avg(5,7,10) = 7.333

      \___
        L avg(7,10) = 8.5

Final output: 2.5 3.333 5.333 7.333 8.5

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ ( ทำด้วยตนเองโปรดแจ้งให้ฉันทราบถึงข้อผิดพลาด ):

In                             Out
----------------------------------------------------------------------
n=1, m=12 6 3 9                9 7 6 6
n=1, m=1 4 5 7 10              2.5 3.333 5.333 7.333 8.5
n=1, m=1 3 3 7 4 2 4 2         2 2.333 4.333 4.666 4.333 3.333 2.666 3
n=2, m=1 3 5 9 10 14 15 16 23  3 4.5 5.6 8.2 10.6 12.8 15.6 17 18
n=3, m=1 1 1 1 1 1 1 1         1 1 1 1 1 1 1 1
n=3, m=1 2 3 4 5 6 7 8         2.5 3 3.5 4 5 5.5 6 6.5

เพื่อความชัดเจนนี่คือสิ่งเดียวกับการเติมและต่อท้ายเลขศูนย์แล้วคำนวณหาวิธีการเรียงตามลำดับของความยาว 3 ที่ต่อเนื่องกัน
El'endia Starman

@ El'endiaStarman เลขที่ไม่ได้เป็นเช่นเดียวกับavg(0,1,2) avg(1,2)สำหรับ "edge cases" (ฮ่า) คุณไม่ควรเฉลี่ยเท่ากับองค์ประกอบของรายการอินพุต
Doorknob

อาใช่ฉันเห็นแล้ว
El'endia Starman


นี่จะเป็นความท้าทายที่ดีกว่าโดยไม่มีข้อ จำกัด ว่าสิ่งที่m_iเป็นบวก
Peter Taylor

คำตอบ:


1

Pyth, 20 ไบต์

m.O:vzeS,0-dQh+dQUvz

ชุดทดสอบ

ตรงไปตรงมาสวยเพียงแค่แบ่งส่วนที่เหมาะสมออกจากรายการแล้วค่าเฉลี่ย


@ThomasKwa ฉันลองแล้ว แต่ดูเหมือนว่าคุณต้องเก็บไว้Eนอกแผนที่เพราะมันจะพยายามอ่านค่าใหม่ถ้ามันอยู่ข้างใน สิ่งนี้ทำให้ใช้จำนวนไบต์เท่ากัน
FryAmTheEggman

3

MATL , 30 28 26 24 ไบต์

2*1+:g2X53$X+1Mbgbb3$X+/

ทดสอบบน Matlab และ Octave ใช้เวอร์ชันปัจจุบัน (9.1.0)ของภาษา / คอมไพเลอร์

[1 4 5 7 10]การป้อนข้อมูลเป็นครั้งแรกจำนวนการควบคุมระยะเวลาในหน้าต่างก็อาร์เรย์ที่มีรูปแบบ

แก้ไข (20 พฤษภาคม 2559): ลองออนไลน์! รหัสในลิงค์ได้X+ถูกแทนที่ด้วยY+เพื่อให้สอดคล้องกับรุ่น 18.0.0 ของภาษา

ตัวอย่าง

>> matl
 > 2*1+:g2X53$X+1Mbgbb3$X+/
 >
> 1
> [1 4 5 7 10]
2.5 3.333333333333333 5.333333333333333 7.333333333333333               8.5

>> matl
 > 2*1+:g2X53$X+1Mbgbb3$X+/
 >
> 2
> [1 3 5 9 10 14 15 16 23]
3               4.5               5.6 8.199999999999999              10.6               2.8              15.6        17                18

คำอธิบาย

รหัส Matlab ที่เทียบเท่าจะเป็น

n = 1; %// first input: number controlling window length
x = [1 4 5 7 10]; %// second input: array
result = conv(x,ones(1,2*n+1),'same')./conv(ones(size(x)),ones(1,2*n+1),'same');

รหัส MATL ใช้ประโยชน์จากคุณสมบัติที่เพิ่มเข้ามาล่าสุดของคลิปบอร์ดการป้อนข้อมูลโดยนัยและคลิปบอร์ดฟังก์ชั่นป้อนข้อมูลอัตโนมัติ:

2*1+          % get implicit input "n". Multipliy by 2 and add 1
:g            % create a vector of 2*n+1 "true" values (will act as "one" values)
2X5           % 'same' string literal
3$X+          % get implicit input "x" (array). Convolution using three inputs
1M            % push all three inputs from last function
bgbb          % convert first input to "true" values. Will act as "one" values
3$X+          % convolution using three inputs
/             % divide element-wise. Implicitly print

2

CJam, 31 30 ไบต์

ri_S*l~1$++\2*)ew{S-_:+\,d/}%`

n [m1 m2 ... mx]รูปแบบอินพุตเป็น

เรียกใช้กรณีทดสอบทั้งหมด (แปลงชุดทดสอบเป็นรูปแบบอินพุตที่ต้องการโดยอัตโนมัติ)

สิ่งนี้ทำงานได้ทั้งก่อนและต่อท้ายnช่องว่างจากนั้นรับความยาวของสตริงย่อยทั้งหมด2n+1และลบช่องว่างอีกครั้งก่อนที่จะคำนวณหาวิธีการ


1

Julia, 57 ไบต์

f(n,m)=[mean(m[max(1,i-n):min(end,i+1)])for i=1:endof(m)]

นี่คือฟังก์ชั่นที่รับจำนวนเต็มสองจำนวนและส่งกลับอาร์เรย์แบบลอย

วิธีการที่นี่ตรงไปตรงมามาก เราสร้างอาเรย์ใหม่โดยการหาค่าเฉลี่ยของส่วนต่างๆของอาเรย์อินพุตโดยตัดทอนที่ด้านหน้าและด้านหลัง


0

Haskell, 97 95 ไบต์

import Data.List
n#x|t<-2*n+1=[sum a/sum(1<$a)|a<-take t<$>take t(inits x)++tails x,length a>n]

ตัวอย่างการใช้งาน: ->2 # [1,3,5,9,10,14,15,16,23][3.0,4.5,5.6,8.2,10.6,12.8,15.6,17.0,18.0]

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

t<-2*n+1                      -- assign t to the maximum number of elements of a
                              -- of sublist
     take t(inits x)          -- build the sublists from t elements of the inits
                ++tails x     -- of the input and the tails of the input,
                              -- e.g. x=[1,2,3,4], t=3:
                              -- [[],[1],[1,2]] ++ [[1,2,3,4],[2,3,4],[3,4],[4],[]]
  a<-take t<$>                -- take at most t elements from every sublist
                ,length a>n   -- keep those with a minimum length of n+1
sum a/sum(1<$a)               -- calculate average, "sum(1<$a)" is the length of a

0

Pyth, 22 ไบต์

.OMsM.:++J*]YKE]MQJhyK

คำอธิบาย:

.OM sM .: +               Means of flattens of sublists of length 2K+1 of
            + J *         
                  ] Y     J is E copies of [].
                  K E     Save E to a variable to use it later.
               ]MQ        the input
            J             Put J on both sides of ]MQ.
          h y K           2K+1

ลองมันนี่


0

JavaScript (ES6), 104

ขนาดตัวอย่างทั้งหมด / กำลังรันอยู่ ใน Javascript การอ่านค่านอกขอบเขตของอาเรย์จะไม่ได้กำหนดซึ่งสามารถแปลงเป็น 0 โดยใช้ ~~

(l,n,p=0)=>l.map((v,i)=>(p+=~l[i-n-1]-~l[i+n])/(n+1+Math.min(n,l.length-1-i,i)),l.map((v,i)=>p+=i<n&&v))

Ungolfed

(l, n) => {
    p = 0;
    for (i = 0; i < n; i++) p += v;
    r = [];
    for (i = 0; i < l.length; i++) {
        p += (l[i + n] || 0) - (i > n ? l[i - n - 1] : 0);
        r.push(p / Math.min(n, l.length - i - 1, i);
    }
    return r;
}

ทดสอบ

f=(n,l,p=0)=>l.map((v,i)=>(p+=~l[i-n-1]-~l[i+n])/(n+1+Math.min(n,l.length-1-i,i)),l.map((v,i)=>p+=i<n&&v))

console.log=x=>O.textContent+=x+'\n';


;[
  [1,[12,6,3,9],[9,7,6,6]]
, [1,[1,4,5,7,10],[2.5,3.333,5.333,7.333,8.5]]
, [1,[1,3,3,7,4,2,4,2],[2,2.333,4.333,4.667,4.333,3.333,2.667,3]]
, [2,[1,3,5,9,10,14,15,16,23],[3,4.5,5.6,8.2,10.6,12.8,15.6,17,18]]
, [3,[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]]
, [3,[1,2,3,4,5,6,7,8],[2.5,3,3.5,4,5,5.5,6,6.5]]
].forEach(t=>{
  var n=t[0],l=t[1],x=t[2],r=f(n,l)
  // verify (limited to 3 decimals)
  var ok = r.every((v,i)=>v.toFixed(3)==x[i].toFixed(3))
  
  console.log((ok?'OK   ':'Fail ')+n+' '+l+' -> '+r+' ('+x+')')
})
<pre id=O></pre>


0

JavaScript (ES6), 82 ไบต์

รหัส:

F=(n,a)=>a.map((e,i)=>(s=a.slice(i<n?0:i-n,i+n+1))&&s.reduce((l,c)=>l+c)/s.length)

ทดสอบ:

F=(n,a)=>a.map((e,i)=>(s=a.slice(i<n?0:i-n,i+n+1))&&s.reduce((l,c)=>l+c)/s.length)

document.write('<pre>' +
  [
    [1, [12, 6, 3, 9], [9, 7, 6, 6] ],
    [1, [1, 4, 5, 7, 10], [2.5, 3.333, 5.333, 7.333, 8.5] ],
    [1, [1, 3, 3, 7, 4, 2, 4, 2], [2, 2.333, 4.333, 4.667, 4.333, 3.333, 2.667, 3] ],
    [2, [1, 3, 5, 9, 10, 14, 15, 16, 23], [3, 4.5, 5.6, 8.2, 10.6, 12.8, 15.6, 17, 18] ],
    [3, [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1] ],
    [3, [1, 2, 3, 4, 5, 6, 7, 8], [2.5, 3, 3.5, 4, 5, 5.5, 6, 6.5] ]
  ].map(t => {
    var [n, m, e] = t;
    var r = F(n, m);
    // verify to precision of 3 decimals
    var test = r.every((v, i) => v.toPrecision(3) === e[i].toPrecision(3));

    return 'F(' + n + ', [' + m + '])\t' + (test ? 'Pass' : 'Fail') +
      '\n\t{' + r + '} ' + (test ? '=' : '≠') + ' {' + e + '}';
  }).join('\n\n') +
  '</pre>');

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