私はゴルフ場ですか?


18

定義と規則

golfyアレイは、各要素が整数の配列であり、より高いまたは等しいすべての前の要素の算術平均。あなたの仕事は、入力として与えられた正の整数の配列がゴルフかどうかを判断することです。

テストケースと例

たとえば、次の配列:

[1, 4, 3, 8, 6]

各項がその前の項の算術平均よりも高いため、ゴルフ配列です。段階的に解決しましょう:

数->前の要素->平均->ルールに従いますか?

1-> []-> 0.0-> 1≥0.0(True)
4-> [1]-> 1.0-> 4≥1.0(True)
3-> [1、4]-> 2.5-> 3≥2.5(True)
8-> [1、4、3]-> 2.(6)-> 8≥2.(6)(True)
6-> [1、4、3、8]-> 4.0-> 6≥4.0(True)

すべての要素が条件を尊重するため、これはゴルフの配列です。このチャレンジのために、空のリスト([])の平均はであると仮定することに注意してください0

その他のテストケース:

入力->出力

[3]-> True
[2、12]-> True
[1、4、3、8、6]-> True
[1、2、3、4、5]-> True
[6、6、6、6、6]-> True
[3、2]-> False
[4、5、6、4]-> False
[4、2、1、5、7]-> False
[45、45、46、43]-> False
[32、9、15、19、10]-> False

これがあることに注意してくださいパズル1からCodeGolf-ハッカソンともに掲載されてアナーキーゴルフ(1が壊れていること) - 転載によりhistocratが、私は両方のサイトで原作者だので、ここではそれらを再投稿することができました。


入力は常に正の整数のリストですか?
ケリーロウダー

@KellyLowderはい。
ミスターXcoder

それは楽しい問題です。テストケースを増やしてアナーキーゴルフに再投稿することを考えていましたが、あなたはそれに取り組んでいるのではないかと思いました。
-histocrat

@histocrat先に進み、それをアナーキーゴルフに再投稿します。最初に悪用される可能性のあるものについて考えるべきでした。おもしろいと思います(再投稿する場合は、ここでpingを実行し、リンクをお願いします)。
ミスターXcoder

3
@streetsterこれらは同等です。Sum / i> xはSumと同じです。xiはSum + xと同じです。x(i + 1)は(Sum + x)/(i + 1)> xと同じです。
-histocrat

回答:


13

Python 2、37バイト

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

オンラインでお試しください!

終了コードを介した出力:ゴルフィーアレイではクラッシュ(終了コード1)、ゴルフィー以外のアレイでは終了コード0で終了します。ovsとJonathan Frechは3バイト節約しました。

Python 2、44バイト

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

オンラインでお試しください!

より伝統的なバリアント。Trueゴルフィーアレイに戻りますFalse。Jonathan Frechは2バイトを節約しました。


1
a==[]orできると思いますa and
ジョナサンフレッチ

2
それは実際には賢明です-それはsum(a)<=len(a)*a.pop()*[]ベースケースのために出てきます、それは常にそうint < listです!
リン

3
真実の入力に対してクラッシュする関数としての39バイト
-ovs

1
命令関数を使用した@ovs 37バイト
ジョナサンフレッチ

11

ゼリー6 5バイト

<ÆmƤE

オンラインでお試しください!

使い方

<Æ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.

cairdcoinheringaahingの6バイト(代替):ÆmƤµ⁼Ṣ
Xcoder氏

@ Mr.Xcoder Golfed!
デニス

うわー、それは素晴らしいです:-)
Mr. Xcoder

5

JavaScript(ES6)、33 32バイト

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

コードは、などの負の値でも機能します[-3, -2]。他の配列のfalse場合、ゴルフ配列を返しますtrue。編集:@JustinMarinerのおかげで1バイト保存されました。


1
!仕様では2つの異なる値しか要求されないため、ドロップすることができます。そのためfalse、ゴルフの配列であるときに戻るのは問題ありません。
ジャスティンマリナー


4

MATL9 8バイト

tYstf/<a

それ以外の場合は0、ゴルフ配列の出力1

オンラインでお試しください!

説明

入力を検討してください[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

Haskell53 50 48バイト

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

オンラインでお試しください!

編集: Zgarbのおかげで-3バイト!

説明

上記のポイントフリーバージョンは、次のプログラムと同等です。

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

入力s=[1,4,3,8,6]を指定scanl1(+)sすると、接頭辞の合計[1,5,8,16,22]を計算しzipWith(*)[1..](tail s)て最初の要素を削除し、他のすべての要素にインデックス:を乗算します[4,6,24,24]。ペアごとにプレフィックスの合計が要素の時間インデックス以下である場合、リストはゴルフのようになります。これは、両方のリストを(<=)で圧縮し、すべての結果がTrueであるかどうかをチェックすることで確認できますand


1
このようなタイプエラーを回避できます。
-Zgarb

@Zgarb後知恵では、これは明らかな解決策です。指摘してくれてありがとう!
ライコニ

3

C#(Visual C#コンパイラー)、71 + 18 = 89バイト

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

追加の18バイト using System.Linq;

オンラインでお試しください!


2
サイトへようこそ!:)
DJMcMayhem

一般的に、コードのゴルフでは輸入申告は無料とは見なされません。これはステートメントを必要とするため、using System.Linq;実際には89バイトであり、「71 + 18 = 89」と表現されることもあります。これは一部の自動パーサーに役立ちます)。
カミルドラカリ

3

APL(Dyalog)、10バイト

これは匿名の暗黙の接頭辞関数です(APL用語ではモナド列と呼ばれます)。

∧/⊢≥+⍳∘≢

TIOですべてのテストケースをお試しください!

それは...ですか

∧/ その真実

 要素

 より大きいか等しい

+\ 累積合計

÷ で割った

   整数1から

   その

   要素数


APLには「the」のシンボルがありますか??
-user2390246

1
@ user2390246 は、「the」が「count the cats」で一緒にバインドするのと同じ方法で物を一緒にバインドします。本当にComposeと呼ばれます。
アダム


3

05AB1E、5バイト

ηÅA÷W

オンラインでお試しください!

デニスとアドナンからの広範な支援は、この縮小版に到達しました。また、これを可能にするためにバグが修正されました。私はこの答えをほとんど信用していません。


05AB1E、10バイト

ηεÅA}ü.S_P

オンラインでお試しください!


DgsO/05AB1Eの「平均」に相当するため、長い。

どうやらÅA算術平均です。


平均を計算するには、+\÷JJellyで(累積合計をインデックスで除算する)を使用します。05AB1Eではそれほど簡単ではありませんか?編集:ネバーマインド。
デニス

@Dennisああ、05AB1Eの累積合計はü+g配列の長さを取得し、Lプッシュ1,2,...,nおよび除算して平均を取得する以外のインデックスによる分割は実際にはありません。
魔法のタコUr

.S_<=誰かがlmkのアイデアを持っているなら、に進む長い方法です。
魔法のタコUr

÷Wの代わりに働きますかü.S_P
デニス

1
ああ、@ Adnanはのベクトル化を修正したÅAので、今はηÅA÷W動作します。
デニス


2

PowerShell、60バイト

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

オンラインでお試しください!

リテラル配列(例えば、などの入力を取り@(1, 4, 3, 8, 6)に)$a$output変数をに設定します1。その後、ループし$aます。各反復で、(ab)PowerShellの暗黙的なキャストを使用*=して、$o出力に対するブール比較の結果を使用しています。ブールは、現在の値がいるかどうかで$_ある-greater-より-または- e以前の条件にQUAL $a[0..$i++]一緒に(追加-join'+'|iex我々はすでに見てきたどのように多くの用語で割った値)$i。そのため、途中のステップがfalseの場合、$oが乗算され0ます。それ以外の場合は、1全体に残ります。

次に$o、パイプラインに配置するだけで、出力は暗黙的になります。1真実と偽りの0ために。




2

Cubix、35バイト

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

オンラインでお試しください!

スペースの最も効率的な使用ではありません(コードで6回の操作なし)ゴルフ場の配列、ゴルフ場1ではない配列の出力は生成されません。

次のキューブに展開します。

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

説明は近日中にリリースされますが、基本的には、ルイスメンドMATL回答またはデニスのジュリア回答のようなものが移植されます

走るのを見て!


2

MatlabおよびOctave、41 36バイト

5バイトがthxをLuis Mendoに保存しました

all([a inf]>=[0 cumsum(a)./find(a)])

オンラインでお試しください!


@LuisMendoの要素aがゼロの場合、それは壊れます。しかし、それは同様の状況で便利なトリックですが、それを覚えておく必要があります。
リアンダーMoesinger

読むのは難しい!THX!
リアンダーモージンガー

いつも私
ルイスメンドー

2

SQL(MySQL)、68バイト

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

オンラインでお試しください!

ゴルフィアレイの場合は1を返し、それ以外の場合は0を返します。以下からの入力を受け取り、指定したテーブルt。を作成するにはt、次を実行します。

CREATE TABLE t(i SERIAL,n INT)

値をロードするには:

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


1

Python 2、52バイト

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

オンラインでお試しください!

パイソン250の 48 44 42バイト

  • インライン化と使用により2バイトを節約 and
  • チェーン割り当てによりMr. Xcoderのおかげで2バイト節約S=k=0
  • を使用orして2バイトを保存し、比較のブール値をkの増分値。
  • ovsのおかげで2バイト節約されました。のNameError代わりに未定義の変数を使用してを発生させますZeroDivisionError
S=k=0
for j in input():k+=S<=j*k or J;S+=j

オンラインでお試しください!


代替バージョンでは46バイト
ミスターXcoder

@ Mr.Xcoderありがとう。
ジョナサンフレッチ


@ovsありがとう。例外を発生させるきちんとした1バイトの方法。
ジョナサンフレッチ

1

q / kdb +、14バイト

解決:

min x>=avgs x:

例:

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

説明:

avgs組み込みの非常にシンプルな:

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

R38 34バイト

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

オンラインでお試しください!


非常に素晴らしい。ダンノがなぜ以前にRの回答がなかったのか...-
ジュゼッペ

あなたはすべて私のために簡単なものを保存していました。
ngm

y関数の引数で定義する代わりに、cumsum(x)直接使用する方が4バイト短くなります。cummeanベースRには存在しないのは残念です
ジュゼッペ

1

Add ++、54バイト

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

オンラインでお試しください!

非オリジナルバージョン、30バイト

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

オンラインでお試しください!

ゴルフィーアレイの場合は1、それ以外の場合は0の両方を出力します

仕組み

最初のバージョンは、他のソリューションをチェックせずに私が作成しました。2番目はデニスのコメントに触発されたので、私はあまり満足していません。

最初のバージョン

fAAB:=[1|A|]|A|AdbLR$[BA]gABBgg

D,g,@@#,BFB

2#BFAeバツ[Ae]BeA

:関数名gkgk2{...}IKUYZgkluw

いつ gバツAkk

D,k,@,¦+AbL/

¦+AbL/C

CA00[0]C0b]$C+

AAABcB]BczipC+

pAqC+;p<q¬pqpq010ª!

2番目のバージョン

24A¬+[A0A0+A1A0+A1+A2A0++A]J indiciesにB:=[1|A|]|A|

ABBcB/0@0@B]C+

C+:=[0A0A0+A12A0+A1+A23A0++A+1]

AC+


0

Pyth11 10バイト

Xcoder氏のおかげで-1バイト

.A.egb.O<Q

オンラインでお試しください!


7バイト:SI.OM._(Jellyからのcairdcoinheringaahingのソリューションのポート、Erik the Outgolferによる)、またはアプローチを使用した10バイト:.A.egb.O<Q
Mr. Xcoder

あなた自身としてポートを投稿してください、それは全く異なるアプローチです!
デイブ


0

Java 7、100バイト

ゴルフ:

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;}

ゴルフをしていない:

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;
}

オンラインで試す

ungolfyの場合は0、golfy配列の場合は1を返します。Java 8の回答より少し長い。



0

J、19バイト

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

+/\ % #\プレフィックスの平均:#\1..nを生成します

}:0, 先頭に0を追加し、最後を削除します

[>: 要素ごとの元のリスト要素は、シフトされた平均のリストにありますか?

*/あるすべての要素が大きい、すなわち、前のリストがすべてです1の?

オンラインでお試しください!



0

Japt、10バイト

2つの10バイトソリューションが登場しましたが、それを改善することはできません。

eȨU¯Y x÷Y

それを試してみてください


説明

               :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

代替案

eÈ*°Y¨(T±X

それを試してみてください

               :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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.