Tôi có phải là một mảng golf?


18

Định nghĩa và quy tắc

Một mảng golfy là một mảng các số nguyên, trong đó mỗi phần tử là cao hơn hoặc tương đương với giá trị trung bình cộng của tất cả các yếu tố trước đó. Nhiệm vụ của bạn là xác định xem một mảng các số nguyên dương được đưa ra làm đầu vào có phải là golf hay không.

Các trường hợp thử nghiệm & ví dụ

Ví dụ mảng sau:

[1, 4, 3, 8, 6]

Là một mảng golf, bởi vì mỗi thuật ngữ cao hơn trung bình số học của những người đi trước nó. Chúng ta hãy làm từng bước một:

Số -> Các yếu tố trước -> Trung bình -> Theo quy tắc?

1 -> [] -> 0,0 -> 1 0,0 (Đúng)
4 -> [1] -> 1.0 -> 4 1.0 (Đúng)
3 -> [1, 4] -> 2.5 -> 3 2.5 (Đúng)
8 -> [1, 4, 3] -> 2. (6) -> 8 ≥ 2. (6) (Đúng)
6 -> [1, 4, 3, 8] -> 4.0 -> 6 4.0 (Đúng)

Tất cả các yếu tố tôn trọng điều kiện, do đó đây là một mảng golf. Lưu ý rằng với mục đích của thử thách này, chúng tôi sẽ giả sử rằng trung bình của một danh sách trống ( []) là 0.

Nhiều trường hợp thử nghiệm:

Đầu vào -> Đầu ra

[3] -> Đúng
[2, 12] -> Đúng
[1, 4, 3, 8, 6] -> Đúng
[1, 2, 3, 4, 5] -> Đúng
[6, 6, 6, 6, 6] -> Đúng
[3, 2] -> Sai
[4, 5, 6, 4] -> Sai
[4, 2, 1, 5, 7] -> Sai
[45, 45, 46, 43] -> Sai
[32, 9, 15, 19, 10] -> Sai

Lưu ý rằng đây là Puzzle 1 từ CodeGolf-Hackathon và cũng được đăng tải trên Anarchy Golf (mà một bị tổn thương) - Đăng lại bởi histocrat , nhưng tôi tác giả ban đầu trên cả hai trang web, và do đó được phép đăng lại chúng ở đây.


Là đầu vào luôn luôn là một danh sách các số nguyên dương?
Kelly Lowder

@KellyLowder Có.
Ông Xcoder

Đó là một vấn đề thú vị, tôi đã nghĩ đến việc đăng lại nó trên Anarchy Golf với nhiều trường hợp thử nghiệm hơn nhưng nghĩ rằng bạn có thể đang làm việc với điều đó.
lịch sử

@histocrat Hãy tiếp tục và đăng lại nó trên Anarchy Golf, tôi nên nghĩ về những thứ có thể khai thác trước. Tôi khá vui vì bạn thấy nó thú vị (Btw vui lòng ping tôi ở đây và cung cấp một liên kết nếu bạn đăng lại nó).
Ông Xcoder

3
@streetster Đó là tương đương. Sum / i> x giống với Sum> xi giống với Sum + x> x (i + 1) giống với (Sum + x) / (i + 1)> x.
lịch sử

Câu trả lời:


13

Python 2 , 37 byte

def g(a):sum(a)>len(a)*a.pop()or g(a)

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

Đầu ra thông qua mã thoát: sự cố (mã thoát 1) cho các mảng golf, chỉ thoát ra với mã thoát 0 cho các mảng không chơi gôn. ovs và Jonathan Frech đã lưu 3 byte.

Python 2 , 44 byte

f=lambda a:a and sum(a)<=len(a)*a.pop()*f(a)

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

Một biến thể truyền thống hơn, trả về Truecho mảng golf, khác False. Jonathan Frech đã lưu 2 byte.


1
Tôi nghĩ rằng a==[]orcó thể a and.
Jonathan Frech

2
Điều đó thực sự thông minh - nó được đưa ra sum(a)<=len(a)*a.pop()*[]cho trường hợp cơ sở, điều này luôn đúng như int < list!
Lynn

3
39 byte là một hàm gặp sự cố cho đầu vào trung thực.
trứng

1
@ovs 37 byte sử dụng hàm bắt buộc.
Jonathan Frech

11

Thạch , 6 5 byte

<ÆmƤE

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

Làm thế nào nó hoạt động

<ÆmƤE  Main link. Argument: A (integer array)

 ÆmƤ   Compute the arithmetic means (Æm) of all prefixes (Ƥ) of A.
<      Perform element-wise comparison. Note that the leftmost comparison always
       yields 0, as n is equal to the arithmetic mean of [n].
    E  Test if all elements of the resulting array are equal, which is true if and
       only if all comparisons yielded 0.

6 -terter của cairdcoinheringaahing (thay thế):ÆmƤµ⁼Ṣ
Ông Xcoder

@ Mr.Xcoder đã chơi gôn!
Dennis

Wow thật tuyệt vời :-)
Ông Xcoder

5

JavaScript (ES6), 33 32 byte

a=>a.some(e=>e*++i<(s+=e),s=i=0)

Mã cũng hoạt động trên các giá trị âm như [-3, -2]. Trả về falsecho một mảng golf, truecho các mảng khác. Chỉnh sửa: Đã lưu 1 byte nhờ @JustinMariner.


1
Bạn có thể loại bỏ !thông số kỹ thuật chỉ yêu cầu hai giá trị khác nhau, do đó, trả về falsekhi đó là một mảng golf là tốt.
Justin Mariner


4

MATL , 9 8 byte

tYstf/<a

Đầu ra 0cho mảng golf, 1nếu không.

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

Giải trình

Xem xét đầu vào [1, 4, 3, 8, 6].

t    % Implicit input. Duplicate
     % STACK: [1, 4, 3, 8, 6], [1, 4, 3, 8, 6]
Ys   % Cumulative sum
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22]
t    % Duplicate
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22], [1, 5, 8, 16, 22]
f    % Find: indices of nonzeros. Gives [1, 2, ..., n], where n is input size
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22], [1, 2, 3, 4, 5]
/    % Divide, element-wise
     % STACK: [1, 4, 3, 8, 6], [1, 2.5, 2.6667, 4, 4.4]
<    % Less than?, element-wise
     % STACK: [0, 0, 0, 0, 0]
a    % Any: true if and only there is some nonzero. Implicit display
     % STACK: 0

4

Haskell , 53 50 48 byte

and.(z(<=).scanl1(+)<*>z(*)[1..].tail)
z=zipWith

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

Chỉnh sửa: -3 byte nhờ Zgarb!

Giải trình

Phiên bản miễn phí ở trên tương đương với chương trình sau:

f s = and $ zipWith(<=) (scanl1(+)s) (zipWith(*)[1..](tail s))

Đưa ra một đầu vào s=[1,4,3,8,6], scanl1(+)stính toán tổng tiền tố [1,5,8,16,22]zipWith(*)[1..](tail s)bỏ phần tử đầu tiên và nhân tất cả các phần tử khác với chỉ mục của chúng : [4,6,24,24]. Danh sách bây giờ là golf nếu cặp tiền tố tổng nhỏ hơn hoặc bằng chỉ số lần yếu tố, có thể được kiểm tra bằng cách nén cả hai danh sách (<=)và kiểm tra xem tất cả các kết quả Trueand.


1
Bạn có thể tránh được lỗi loại như thế này .
Zgarb

@Zgarb Nhìn nhận lại đây là giải pháp rõ ràng. Cảm ơn đã chỉ ra!
Laikoni

3

C # (Trình biên dịch Visual C #) , 71 + 18 = 89 byte

x=>x.Select((n,i)=>new{n,i}).Skip(1).All(y=>x.Take(y.i).Average()<=y.n)

thêm 18 byte cho using System.Linq;

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


2
Chào mừng đến với trang web! :)
DJMcMayhem

Nói chung, báo cáo nhập khẩu không được coi là miễn phí trong mã golf. Bởi vì điều này đòi hỏi câu lệnh using System.Linq;thực sự sẽ là 89 byte, đôi khi được biểu thị là "71 + 18 = 89" để chỉ ra rằng 18 byte là bắt buộc nhưng không phải là một phần của giải pháp trong khi vẫn có số cuối cùng là số cuối cùng trong dòng tiêu đề ( hữu ích cho một số trình phân tích cú pháp tự động).
Kamil Drakari

3

APL (Dyalog) , 10 byte

Đây là một hàm tiền tố ẩn danh ẩn danh (được gọi là một tàu đơn âm theo thuật ngữ APL).

∧/⊢≥+⍳∘≢

Hãy thử tất cả các trường hợp thử nghiệm trên TIO!

Là nó

∧/ hoàn toàn đúng

 các yếu tố

 lớn hơn hoặc bằng

+\ các khoản tiền tích lũy

÷ chia

   các số nguyên từ 1 đến

   các

   số phần tử

?


APL có ký hiệu cho "the" ??
dùng2390246

1
@ user2390246 liên kết mọi thứ với nhau theo cùng một cách "the" liên kết với nhau trong "đếm những con mèo". Nó thực sự được gọi là Sáng tác .
Adám


3

05AB1E , 5 byte

ηÅA÷W

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

Sự giúp đỡ sâu rộng từ Dennis và Adnan đã có phiên bản rút gọn này. Ngoài ra một lỗi đã được sửa để biến điều này thành có thể, cảm ơn các bạn một lần nữa. Tôi mất ít tín dụng cho câu trả lời này.


05AB1E , 10 byte

ηεÅA}ü.S_P

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


Dài vì DgsO/tương đương với "trung bình" trong 05AB1E.

Rõ ràng ÅAlà số học có nghĩa.


Để tính toán phương tiện, tôi sẽ sử dụng +\÷J(chia tổng số tích lũy cho các chỉ số) trong Jelly. Nó không phải là dễ dàng trong 05AB1E? Chỉnh sửa: Nevermind.
Dennis

@Dennis ah, tổng tích lũy trong 05AB1E ü+sau đó thực sự không có divie bởi các chỉ số ngoài gviệc lấy độ dài mảng, Lđẩy 1,2,...,nvà chia để lấy giá trị trung bình, về cơ bản vẫn là 5 byte.
Bạch tuộc ma thuật Urn

.S_là một cách lâu dài để đi <=, nếu bất cứ ai có bất kỳ ý tưởng lmk.
Bạch tuộc ma thuật Urn

Sẽ ÷Wlàm việc thay vì ü.S_P?
Dennis

1
Ồ, @Adnan chỉ sửa lỗi vector hóa ÅA, nên ηÅA÷Wgiờ hoạt động.
Dennis


2

PowerShell , 60 byte

param($a)$o=1;$a|%{$o*=$_-ge($a[0..$i++]-join'+'|iex)/$i};$o

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

Đưa đầu vào dưới dạng một mảng bằng chữ (ví dụ @(1, 4, 3, 8, 6):) vào $a. Đặt $obiến utput của chúng tôi là 1. Sau đó vòng qua $a. Mỗi lần lặp lại, chúng tôi (ab) sử dụng phép ẩn ngầm của PowerShell cho *=kết quả so sánh Boolean so với dự đoán của chúng tôi $o. Các Boolean là liệu giá trị hiện tại $_-greater hơn hay- equal với các điều khoản trước đó $a[0..$i++]vào với nhau ( -join'+'|iex) chia cho bao nhiêu từ ngữ chúng ta đã thấy $i. Vì vậy, nếu bất kỳ bước nào trên đường đi là sai, thì $osẽ được nhân với 0. Nếu không, nó sẽ vẫn còn 1trong suốt.

Chúng tôi sau đó chỉ cần đặt $ovào đường ống và đầu ra là ẩn. 1cho sự thật và 0cho chim ưng.




2

Khối , 35 byte

/I?/\+psu0^.\)*sqs;-\;;U;O1.....?@^

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

Không phải là cách sử dụng không gian hiệu quả nhất (6 no-op trong mã) Tạo ra không có đầu ra cho một mảng golf, 1 cho một mảng không chơi gôn.

Mở rộng đến khối sau:

      / I ?
      / \ +
      p s u
0 ^ . \ ) * s q s ; - \
; ; U ; O 1 . . . . . ?
@ ^ . . . . . . . . . .
      . . .
      . . .
      . . .

Giải thích sắp tới, nhưng về cơ bản, nó có nội dung giống như câu trả lời MATL của Luis Mendo hoặc câu trả lời của Dennis ' Julia .

Xem nó chạy!



2

SQL (MySQL), 68 byte

select min(n>=(select ifnull(avg(n),1)from t s where s.i<t.i))from t

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

Trả về 1 cho mảng golf và 0 nếu không. Lấy đầu vào từ một bảng được đặt tên , t. Để tạo t, hãy chạy:

CREATE TABLE t(i SERIAL,n INT)

và để tải các giá trị:

truncate table t;insert into t(n)values(3),(2);


1

Python 2 , 52 byte

lambda A:all(k*j>=sum(A[:j])for j,k in enumerate(A))

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

Python 2 , 50 48 44 42 byte

  • Lưu hai byte bằng cách nội tuyến và sử dụng and.
  • Đã lưu hai byte nhờ ông Xcoder bằng cách gán chuỗi S=k=0.
  • Đã lưu hai byte bằng cách sử dụng orvà giá trị boolean của phép so sánh là giá trị kgia tăng của.
  • Lưu hai byte nhờ vào ovs ; tăng a NameErrorbằng cách sử dụng một biến không xác định thay vì a ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

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


46 byte cho phiên bản thay thế của bạn.
Ông Xcoder

@ Mr.Xcoder Cảm ơn.
Jonathan Frech


@ovs Cảm ơn; cách gọn gàng một byte để đưa ra một ngoại lệ.
Jonathan Frech

1

q / kdb + , 14 byte

Giải pháp:

min x>=avgs x:

Ví dụ:

q)min x>=avgs x:1 4 3 8 6
1b                           / truthy
q)min x>=avgs x:4 2 1 5 7
0b                           / falsey

Giải trình:

Khá đơn giản với tích avgshợp:

min x>=avgs x: / solution
            x: / store input in variable x
       avgs    / calculate running averages
    x>=        / array comparison, x greater than running average
min            / take minimum of list of booleans


1

R , 38 34 byte

function(x)any(cumsum(x)/seq(x)>x)

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


rất đẹp. Tại sao không có câu trả lời R trước ...
Giuseppe

Tất cả các bạn đều tiết kiệm một cách dễ dàng cho tôi.
ngm

thay vì xác định ytrong các đối số hàm, sử dụng cumsum(x)trực tiếp ngắn hơn 4 byte. Thật xấu hổ cummeankhông tồn tại trong căn cứ R.
Giuseppe

1

Thêm ++ , 54 byte

D,g,@@#,BFB
D,k,@,¦+AbL/
D,f,@,dbLR$€g€k0b]$+ABcB]£>ª!

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

Phiên bản không nguyên gốc, 30 byte

D,f,@,¬+AbLRBcB/@0@B]ABcB]£>ª!

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

Cả hai đầu ra 1 cho mảng golf và 0 nếu không

Chúng hoạt động như thế nào

Phiên bản đầu tiên được tạo bởi tôi, mà không kiểm tra bất kỳ giải pháp nào khác. Thứ hai được lấy cảm hứng từ bình luận của Dennis , vì vậy tôi ít hài lòng với nó.

Phiên bản đầu tiên

fMộtMộtB: =[1,...|Một|]|Một|MộtdbLR$[B,Một]gMộtBBgg

D,g,@@#,BFB

2#BFMộtex[...Một,e]...BeMột

gkgk2{...}IKUYZgkluw

gxMộtkk

D,k,@,¦+AbL/

¦+AbL/C

CMột00[0]C0b]$C+

MộtMộtABcB]BczipC+

pMột,qC+;p<q¬(pq)p,q010ª!

Phiên bản thứ hai

24Một¬+[Một0,Một0+Một1,Một0+Một1+Một2,...,Một0+...+MộtTôi]J chỉ dẫnB: =[1...|Một|]|Một|

MộtBBcB/0@0@B]C+

C+: =[0,Một0,Một0+Một12,Một0+Một1+Một23,...,Một0+...+MộtTôiTôi+1]

MộtC+


0

Bình thường , 11 10 byte

-1 byte nhờ ông Xcoder

.A.egb.O<Q

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


7 byte: SI.OM._(cổng giải pháp của cairdcoinheringaahing từ Jelly, bởi Erik the Outgolfer) hoặc 10 byte sử dụng phương pháp của bạn:.A.egb.O<Q
Ông Xcoder

Đăng cổng như chính bạn, đó là một cách tiếp cận hoàn toàn khác!
Dave

0

Java (OpenJDK 8) , 96 byte

Tôi biết đó không phải là một ngôn ngữ chơi golf tốt, nhưng tôi vẫn cho nó đi!

Mảng đầu vào là đối số đầu tiên của dấu phẩy được phân tách bằng dấu phẩy để kiểm tra.

Trả về 1 cho đúng, 0 cho sai.

a->{int i=1,j,r=1,s=0;for(;i<a.length;i++,s=0){for(j=0;j<i;s+=a[j++]);r=s/i>a[i]?0:r;}return r;}

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


0

Java 7, 100 byte

Chơi gôn

int g(int[]a){int i=1,m=0,s=m,r=1;for(;i<a.length;){s+=a[i-1];m=s/i;r-=a[i++]<m&&r>0?1:0;}return r;}

Ung dung:

int golfy(int[]a)
{
    int i = 1, m = 0, s = m, r = 1;
    for (; i < a.length;)
    {
        s += a[i-1];
        m = s / i;
        r -= a[i++] < m && r>0? 1 : 0;
    }
    return r;
}

Dùng thử trực tuyến

Trả về 0 cho ungolfy và 1 cho mảng golf. Hơi dài hơn câu trả lời java 8.


0

PHP, 44 byte

while($n=$argv[++$i])$n<($s+=$n)/$i&&die(1);

lấy đầu vào từ các đối số dòng lệnh, thoát với 0(ok) cho một mảng golf, với các mảng 1khác.

Chạy với -nrhoặc thử trực tuyến .


0

J, 19 byte

[:*/[>:[:}:0,+/\%#\

+/\ % #\trung bình của các tiền tố: #\tạo ra 1..n

}:0, thêm 0 vào đầu và xóa cái cuối cùng

[>: là phần tử danh sách ban đầu theo phần tử> = vào danh sách trung bình đã dịch chuyển?

*/tất cả các yếu tố lớn hơn, ví dụ, danh sách trước đó là tất cả các 1s?

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



0

Japt , 10 byte

Đến với hai giải pháp 10 byte, dường như không thể cải thiện điều đó.

eȨU¯Y x÷Y

Thử nó


Giải trình

               :Implicit input of array U
eÈ             :Is every element, at 0-based index Y
  ¨            :Greater than or equal to
   U¯Y         :U sliced from index 0 to index Y
        ÷Y     :Divide each element by Y
       x       :Reduce by addition

Thay thế

eÈ*°Y¨(T±X

Thử nó

               :Implicit input of array U
eÈ             :Is every element X (at 0-based index Y)
  *°Y          :Multiplied by Y incremented by 1
     ¨         :Greater than or equal to
      (T±X     :T (initially 0) incremented by X
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.