Điểm thi đấu Olympic [đã đóng]


9

Thách thức là viết một chương trình mã golf, với n số thực dương từ 0 đến 10 (định dạng xy, y chỉ có thể là 0 hoặc 5: 0, 0,5, 1, 1.5, 2, 2.5, 9.5 và 10), loại bỏ các giá trị thấp nhất và cao nhất (chỉ một, mặc dù chúng được lặp lại) và hiển thị trung bình của phần còn lại, ở định dạng xy (y có thể là 0 hoặc 5, làm tròn đến gần nhất), tương tự như một số điểm của Thế vận hội Olympic.

Ví dụ: Đầu vào -> Đầu ra

6 -> 6

6,5, 9 -> 8

9, 7, 8 -> 8

6, 5, 7, 8, 9 -> 7

5, 6.5, 9, 8, 7 -> 7

6,5, 6,5, 9,5, 8, 7 -> 7

5, 6.5, 7.5, 8.5, 9.5 -> 7.5

Lưu ý: Nếu đầu vào chỉ có hai số, không loại bỏ bất kỳ, chỉ cần trung bình chúng. Nếu đầu vào là một số, đầu ra là như nhau.

Làm rõ quy tắc làm tròn (xin lỗi, ít nhầm lẫn):

x.01 đến x.25 làm tròn đến x.0

x.26 đến x.75 vòng đến x.5

x.76 đến x.99 làm tròn thành x + 1.0


2
Ví dụ thứ hai (6.5, 9 => 8) hợp lệ như thế nào? Nếu bạn ném ra mức cao và mức thấp, không còn giá trị nào để trung bình?
Jeff Zeitlin

2
Chào mừng bạn đến với Code Golf SE!
admBorkBork

6
Tôi đề nghị chúng tôi không xử lý đầu vào không hợp lệ, Thế vận hội sẽ có số lượng thẩm phán cố định lớn hơn hai cho một sự kiện như vậy. (Lặn loại bỏ bốn chi từ bảy ví dụ)
Jonathan Allan

7
Ví dụ của bạn 6.5, 9không đồng ý với thông số kỹ thuật của bạn cho biết x75 làm tròn thành x.5.
Nick Kennedy

7
Cho đến khi làm tròn được sắp xếp, tôi đã bỏ phiếu để đóng.
Nick Kennedy

Câu trả lời:


5

Thạch , 12 byte

ṢṖḊȯµÆmḤær0H

Hãy thử trực tuyến!

    µ           Take
Ṣ               the input sorted,
 Ṗ              without its last
  Ḋ             or first element,
   ȯ            or the unchanged input if that's empty,
     Æm         then calculate the mean,
       Ḥ        double it,
        ær      round it to the nearest multiple of
          0     10^-0 (= 1),
           H    and halve it.

Một phiên bản làm tròn một nửa xuống, phù hợp với thông số kỹ thuật với chi phí của trường hợp thử nghiệm thứ hai:

Thạch , 12 byte

ṢṖḊȯµÆmḤ_.ĊH

Hãy thử trực tuyến!

Phương pháp làm tròn ở đây gần với Jonathan Allan hơn:

Ḥ        Double,
 _       subtract
  .      one half,
   Ċ     round up,
    H    and halve.

Tình cờ cũng vô tình tuân thủ bản cập nhật cho thông số kỹ thuật
Chuỗi không liên quan

@NickKennedy Nếu tôi không làm tròn , trường hợp đó tạo ra 6.8, sẽ làm tròn đến 7 theo thông số kể từ 6.75 <6.8 ≤ 7.
Chuỗi không liên quan

1
xin lỗi một hai nhiều 7s. Ý tôi là[1,10,6,7,7,7]
Nick Kennedy

1
Ồ, vâng, nó làm điều đó sai.
Chuỗi không liên quan

4

Võng mạc , 86 byte

\.5
__
\d+
*4*__
O`_+
_+ (.+) _+
$1
O`.
^ *
$.&*__:
(_+):(\1{4})*(\1\1)?_*
$#2$#3*$(.5

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

\.5
__
\d+
*4*__

Vì Retina không thể dễ dàng xử lý các số phân số hoặc số 0, mỗi số được biểu thị dưới dạng đơn vị bằng 1 hơn 4 lần giá trị. Các .5do đó mở rộng đến 2 _s, trong khi *4*_áp dụng cho một phần số nguyên và một thức _được hậu tố.

O`_+

Sắp xếp các số theo thứ tự.

_+ (.+) _+
$1

Nếu có ít nhất ba số, loại bỏ số đầu tiên (nhỏ nhất) và cuối cùng (lớn nhất).

O`.

Sắp xếp các không gian để bắt đầu, do đó cũng tổng hợp các số.

^ *
$.&*__:

Đếm số lượng khoảng trắng và thêm _và dấu phân cách. Điều này sau đó đại diện cho số lượng chúng ta phải chia cho.

(_+):(\1{4})*(\1\1)?_*
$#2$#3*$(.5

Chia tổng cho số lượng số, cho phép thực tế là chúng ta đang làm việc với bội số gấp 4 lần số ban đầu, để có thể trích xuất trực tiếp các số nguyên và số thập phân. Đây là một phép cắt ngắn, nhưng may mắn thay vì chúng tôi đã thêm một số phụ _cho mỗi số, kết quả có hiệu quả bao gồm thêm 0,25, do đó cho chúng tôi làm tròn số mà chúng tôi muốn.


3

EDIT: Câu trả lời này đã trở thành không hợp lệ. Nó có giá trị trong khoảng nửa phút sau khi được đăng.

Thạch , 10 byte

ṢḊṖȯƊÆmḤḞH

Hãy thử trực tuyến!


dường như tạo ra kết quả sai cho [6.5,9].
Chuỗi không liên quan

1
@UnrelatedString Tại thời điểm tôi đăng bài này, đó là đầu ra chính xác. Có vẻ như OP đã thay đổi quy tắc ngay bây giờ.
Erik the Outgolfer

1
Vâng, tôi đã làm một mớ hỗn độn, xin lỗi :(
JuanCa

1
Theo nhận xét của tôi dưới bài đăng của Arnauld, về cơ bản tôi cũng có thuật toán này, vì vậy, sau khi làm rõ các quy tắc, tôi đã đăng bài của mình :)
Jonathan Allan

1
@Jonathan ALLan Giống như Chuỗi không liên quan. : P
Erik the Outgolfer



3

JavaScript (V8) , 213 211 189 176 byte

Chỉnh sửa: -2 byte bởi vì tôi đã kết thúc ;\n}khi tôi có thể kết thúc bằng một }lỗi ngớ ngẩn.

Chỉnh sửa 2: -22 nhiều byte hơn bằng cách đọc về các mẹo chơi gôn chung của JS. Tôi đã xoay sở để loại bỏ các dấu ngoặc đơn từ các ternary lồng nhau của mình trong rhàm làm tròn và sử dụng các phép toán bitwise để tránh sử dụng Math.floorMath.ceil

Chỉnh sửa 3: -13 byte vì tôi có thể thay thế a.lengthchức năng phím tắt chỉ bằng các cuộc gọi trực tiếp a.lengthđể lưu 4 byte. Tôi cũng đã chuyển hàm g () trực tiếp vào câu lệnh return, vì nó chỉ được sử dụng một lần, loại bỏ phần còn lại của các byte.

a=>{s=i=>a.splice(i,1)
e=_=>a.reduce((t,i)=>t+=i)/a.length
r=n=>(m=n%1,m<0.75?m>0.25?~~(n)+0.5:~~(n):n%1?-~n:n)
return a.length>2?r((a.sort((x,y)=>x-y),s(0),s(-1),e())):r(e())}

Hãy thử trực tuyến!

Tôi chắc chắn rằng nó có thể được cải thiện vì tôi khá mới, nhưng thật vui khi giải quyết vấn đề này. Tôi tin rằng những điều chính có thể được cải thiện là logic / phương pháp làm tròn của tôi và thực tế là hàm chính sử dụng một thân hàm ( { }return).

Có một điều trong câu hỏi không phù hợp với các ví dụ và tôi không thực sự chắc chắn làm thế nào để xử lý nó. Tôi đã triển khai nó sao cho phù hợp với các ví dụ, nhưng nó không phản ánh chính xác các quy tắc làm tròn được chỉ định, đây là ví dụ tôi thấy không nhất quán:

6,5, 9 -> 8

Bạn nói nó phải là 8, mặc dù trung bình là 7,75. Trong quy tắc làm tròn, bạn nói rằng nó phải có ít nhất 0,7 để đi +1. Tôi đã chọn phản ánh các ví dụ thay vì quy tắc làm tròn của bạn, vì vậy> = 0,75 để đi +1 và <= 0,25 để đi -1, trong khoảng 0,25 đến 0,75 (loại trừ) cho 0,5. Nếu thông số kỹ thuật làm tròn thay đổi, mã của tôi sẽ có thể thích ứng mà không thay đổi số byte, chỉ bằng cách thay đổi số trong hàm làm trònr và có thể là thứ tự của câu lệnh ternary tùy thuộc vào quy tắc.

Hơi khó hiểu với lời giải thích (các phép toán đã được thay đổi thành phép toán bitwise và g () trực tiếp trong câu lệnh return)

a => { // a is the input array
    s = i=>a.splice(i, 1); // shortcut to remove index i for 1 element
    e = _=>a.reduce((t, i) => t += i) / a.length; // get array avg
    g = _=>(a.sort((x,y)=>x-y), s(0), s(-1), e()); // what to execute when > 2: sort, remove 1st/last, get avg
    t = n=>Math.floor(n); // Math.floor shortcut

    // apply olympic rounding to number by checking the value of n%1
    r = n=>(m=n%1,m < 0.75 ? (m > 0.25 ? t(n) + 0.5 : t(n)) : Math.ceil(n));

    // if arr length > 2: round g(), otherwise round e()
    return a.length > 2 ? r(g()) : r(e());
}

1
Tôi đã đăng một bình luận về câu hỏi về sự khác biệt giữa ví dụ và thông số kỹ thuật.
Nick Kennedy

1
tại sao bạn không sử dụng l = a.length và mọi lúc bạn muốn có một độ dài chỉ cần gọi l, ở đây tôi không biết tại sao bạn lại sử dụng chức năng ở đây
Châu Giang

@chaugiang Điều đó sẽ lưu giá trị, không phải là tham chiếu a.length, vì vậy tôi đang sử dụng nó trước & sau các hoạt động sửa đổi mảng, lsẽ trở nên không hợp lệ ngay khi mảng được thay đổi. LMK nếu sai. Hóa ra nó thực sự sẽ tiết kiệm cho tôi 3 byte ngay bây giờ để chỉ thay thế điều này bằng các a.lengthcuộc gọi trực tiếp . Khi tôi lần đầu tiên viết nó, tôi không biết rằng JS cho phép bạn sử dụng các số âm cho mối nối, vì vậy ban đầu mối nối thứ hai của tôi s(l()-1)thay vì chỉ s(-1)và khi tôi có 3 lần gọi, nó đã lưu các byte để có phím tắt này. Bây giờ nó không còn giá trị nữa. Cảm ơn, sẽ cập nhật!
Matsyir

2

Thạch , 12 byte

ṢṖḊȯ⁸ÆmḤ+.ḞH

Một liên kết đơn âm chấp nhận một danh sách các số mang lại một số.

Hãy thử trực tuyến!

Làm sao?

ṢṖḊȯ⁸ÆmḤ+.ḞH - Link, list of numbers, X
Ṣ            - sort X
 Ṗ           - remove the right-most
  Ḋ          - remove the left-most
    ⁸        - chain's left argument, X
   ȯ         - logical OR (if we have nothing left use X instead)
     Æm      - arithmetic mean
       Ḥ     - double
         .   - literal half
        +    - add
          Ḟ  - floor
           H - halve

1
@NickKennedy 34/5> 6,75
Jonathan Allan

1
Xin lỗi có nghĩa là 1,10,7,7,7,6nơi 27/4 = 6,75
Nick Kennedy

1
Không có vấn đề là làm tròn hơi khác thường trong thông số kỹ thuật. Trên thực tế, câu trả lời của bạn cũng bị [1,10,7,6,6,6] sai (nên là 6 chứ không phải 6,5), trong khi phiên bản gốc của @ UnrelatedString có được điều đó đúng bởi vì Python làm tròn số chẵn (vì vậy 12,5 vòng xuống còn 12 ). Như bây giờ tôi đã chỉ ra trong một nhận xét về câu hỏi, một trong những ví dụ cũng vi phạm thông số làm tròn. Cũng lưu ý rằng phân số của lũy thừa 2 không phải là một vấn đề cho tính không chính xác của dấu phẩy động bởi vì chúng có biểu diễn nhị phân chính xác.
Nick Kennedy

1
Tôi cảm thấy như thông số kỹ thuật là vụng về và có thể vô tình. (X.251 làm tròn đến, v.v., là các ranh giới bao gồm, độc quyền hay tùy thuộc vào chúng ta?) ... và sau đó có nhận xét "Tôi nhận ra rằng nó hơi khó hiểu, hãy làm tròn chúng đến gần nhất , tùy thuộc vào nền tảng ". Có lẽ chúng ta nên VTC như không rõ ràng?
Jonathan Allan

1
có, đồng ý VTC ngay bây giờ
Nick Kennedy


2

Swift , 203 byte

func a(b:[Double])->Void{var r=0.0,h=0.0,l=11.0
b.forEach{(c)in h=c>h ?c:h;l=c<l ?c:l;r+=c}
var d=Double(b.count)
r=d>2 ?(r-h-l)/(d-2.0):r/d
d=Double(Int(r))
r=r-d<=0.25 ?d:r-d<=0.75 ?d+0.5:d+1
print(r)}

Hãy thử trực tuyến!


2

PHP , 110 byte

Có vẻ như PHP có một số hàm dựng sẵn tốt cho việc này. Tôi chỉ mảng_sum toàn bộ, sau đó nếu có nhiều hơn hai phần tử, hãy trừ các giá trị min () và max () và chia cho 2 ít hơn độ dài của mảng.

Để làm tròn, tôi sử dụng hàm round () với cờ PHP_ROUND_HALF_DOWN (which = 2) trên gấp đôi trung bình, sau đó chia cho 2 để tăng theo 0,5

EDIT: đối với trường hợp [6.5, 9] Tôi đang tuân theo quy tắc đã nêu rằng 7,75 vòng thành 7,5 chứ không phải 8 như trong ví dụ ban đầu được đưa ra.

function s($s){$c=count($s);$t=array_sum($s);if($c>2){$c-=2;$t-=min($s)+max($s);}return round($t/$c*2,0,2)/2;}

Hãy thử trực tuyến!


1
Làm tốt! Tôi muốn đăng một câu trả lời PHP nhưng các quy tắc có nhiều sai sót hoặc thay đổi mà tôi vừa từ bỏ! Tôi đã tinh chỉnh mã của bạn một chút và lưu 10 byte: Hãy thử trực tuyến!
Đêm2

2

Zsh , 141 136 byte

thử trực tuyến!   141byte

setopt FORCE_FLOAT
m=$1 n=$1 a=$#
for x ((t+=x))&&m=$[x>m?x:m]&&n=$[x<n?x:n]
s=$[2*(a>2?(t-m-n)/(a-2):t/a)]
<<<$[(s^0+(s-s^0>.5?1:0))/2]

Giải pháp theo thông số kỹ thuật mới nhất. Đã lưu một vài byte bằng cách sử dụng ẩn($@) .

Chúng tôi ngầm lặp đi lặp lại các đối số for xvà xây dựng tổng cộng đang chạy tvà cũng tìm cực đại, cực tiểu m, n. Nếu số lượng đối số alớn hơn 2, chúng tôi sẽ loại bỏ mntừ mức trung bình. slà gấp đôi trung bình kết quả. Nếu lớp phủ của slớn hơn 0,5, làm tròn slên, nếu không thì cắt ngắn bằng s^0. Cuối cùng, chia cho 2 và đầu ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.