Bin ich ein Golf-Array?

18

Definition und Regeln

Ein Golfy-Array ist ein Array von ganzen Zahlen, wobei jedes Element höher oder gleich dem arithmetischen Mittel aller vorherigen Elemente ist. Ihre Aufgabe ist es zu bestimmen, ob eine Reihe von positiven ganzen Zahlen als Eingabe golfen hat oder nicht.

Testfälle & Beispiel

Zum Beispiel das folgende Array:

[1, 4, 3, 8, 6]

Ist ein Golf-Array, weil jeder Term höher ist als das arithmetische Mittel der vorangegangenen. Lassen Sie es uns Schritt für Schritt ausarbeiten:

Zahl -> Vorgängerelemente -> Durchschnitt -> Folgt die Regel?

1 -> [] -> 0,0 -> 1 ≥ 0,0 (wahr)
4 -> [1] -> 1,0 -> 4 ≥ 1,0 (wahr)
3 -> [1, 4] -> 2,5 -> 3 ≥ 2,5 (Wahr)
8 -> [1, 4, 3] -> 2. (6) -> 8 ≥ 2. (6) (Wahr)
6 -> [1, 4, 3, 8] -> 4,0 -> 6 ≥ 4,0 (Wahr)

Alle Elemente respektieren die Bedingung, also ist dieses eine golfy Reihe. Beachten Sie, dass wir für den Zweck dieser Herausforderung annehmen, dass der Durchschnitt einer leeren Liste ( []) ist 0.

Weitere Testfälle:

Eingabe -> Ausgabe

[3] -> Richtig
[2, 12] -> Richtig
[1, 4, 3, 8, 6] -> Wahr
[1, 2, 3, 4, 5] -> Wahr
[6, 6, 6, 6, 6] -> Richtig
[3, 2] -> Falsch
[4, 5, 6, 4] -> Falsch
[4, 2, 1, 5, 7] -> Falsch
[45, 45, 46, 43] -> Falsch
[32, 9, 15, 19, 10] -> Falsch

Beachten Sie, dass dies Puzzle 1 von CodeGolf-Hackathon ist und auch auf Anarchy Golf gepostet wird (dieses ist defekt) - Reposted von Histocrat , aber ich bin der ursprüngliche Autor auf beiden Seiten und darf sie daher hier reposten.

Mr. Xcoder
quelle
Ist die Eingabe immer eine Liste positiver Ganzzahlen?
Kelly Lowder
@ KellyLowder Ja.
Mr. Xcoder
Es ist ein lustiges Problem, ich habe darüber nachgedacht, es auf Anarchy Golf mit mehr Testfällen neu zu veröffentlichen, aber ich dachte, Sie könnten daran arbeiten.
Histokrat
@histocrat Mach weiter und poste es erneut auf Anarchy Golf. Ich hätte darüber nachdenken sollen, welche Dinge zuerst ausgenutzt werden könnten. Ich bin ziemlich froh, dass du es interessant findest.
Mr. Xcoder
3
@streetster Das sind äquivalente. Summe / i> x ist dasselbe wie Summe> xi ist dasselbe wie Summe + x> x (i + 1) ist dasselbe wie (Summe + x) / (i + 1)> x.
Histokrat

Antworten:

13

Python 2 , 37 Bytes

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

Probieren Sie es online!

Ausgabe über Exit-Code: Crashes (Exit-Code 1) für Golf-Arrays, Exit-Code 0 für Nicht-Golf-Arrays. ovs und Jonathan Frech sparten 3 Bytes.

Python 2 , 44 Bytes

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

Probieren Sie es online!

Eine eher traditionelle Variante, die Truesonst für Golf-Arrays zurückkehrt False. Jonathan Frech hat 2 Bytes gespeichert.

Lynn
quelle
1
Ich denke a==[]orkann sein a and.
Jonathan Frech
2
Das ist eigentlich schlau - es kommt auf sum(a)<=len(a)*a.pop()*[]den Basisfall an, der wie immer gilt int < list!
Lynn
3
39 Bytes als eine Funktion, die für wahrheitsgemäße Eingaben abstürzt.
OVS
1
@ovs 37 Bytes unter Verwendung einer Imperativfunktion.
Jonathan Frech
11

Gelee , 6 5 Bytes

<ÆmƤE

Probieren Sie es online!

Wie es funktioniert

<Æ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.
Dennis
quelle
cairdcoinheringaahings 6-Byte (alternativ):ÆmƤµ⁼Ṣ
Mr. Xcoder
@ Mr.Xcoder Golfen!
Dennis
Wow, das ist genial :-)
Mr. Xcoder
5

JavaScript (ES6), 33 32 Bytes

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

Code funktioniert auch mit negativen Werten wie [-3, -2]. Gibt falsefür ein Golf-Array und truefür andere Arrays zurück. Bearbeiten: 1 Byte dank @JustinMariner gespeichert.

Neil
quelle
1
Sie können das löschen, !da die Spezifikation nur nach zwei verschiedenen Werten fragt, so falsedass es in Ordnung ist , zurückzukehren, wenn es sich um ein Golf-Array handelt.
Justin Mariner
4

Wolfram Language (Mathematica) , 35 Byte

Max[Accumulate@#-Range@Tr[1^#]#]>0&

Probieren Sie es online!

Ausgänge Falsefür Golf-Arrays und Truesonstiges.

Martin Ender
quelle
1
Ich sehe, dass das Verhältnis falsch / wahr umgekehrt ist, aber das ist in Ordnung
Kelly Lowder
4

MATL , 9 8 Bytes

tYstf/<a

0Ansonsten Ausgänge für Golf-Arrays 1.

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe [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
Luis Mendo
quelle
4

Haskell , 53 50 48 Bytes

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

Probieren Sie es online!

Edit: -3 Bytes dank Zgarb!

Erläuterung

Die obige punktfreie Version entspricht dem folgenden Programm:

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

Bei einem gegebenen Eingangs s=[1,4,3,8,6], scanl1(+)sberechnet die Präfixsumme [1,5,8,16,22]und zipWith(*)[1..](tail s)fällt auf das erste Element und multipliziert alle anderen Elemente mit ihren Index: [4,6,24,24]. Die Liste ist jetzt golfen, wenn die Präfixsummen paarweise kleiner oder gleich dem Index für die Anzahl der Elemente (<=)sind . Dies kann überprüft werden, indem Sie beide Listen mit komprimieren und überprüfen, ob alle Ergebnisse Truemit sind and.

Laikoni
quelle
1
Sie können den Typ Fehler vermeiden , wie diese .
Zgarb
@Zgarb Im Nachhinein ist dies die naheliegende Lösung. Danke für den Hinweis!
Laikoni
3

C # (Visual C # -Compiler) , 71 + 18 = 89 Byte

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

zusätzliche 18 Bytes für using System.Linq;

Probieren Sie es online!

Chryslovelace
quelle
2
Willkommen auf der Seite! :)
DJMcMayhem
Im Allgemeinen werden Import-Anweisungen im Code-Golf nicht als kostenlos angesehen. Da dies die Anweisung erfordert, sind using System.Linq;es tatsächlich 89 Bytes, manchmal ausgedrückt als "71 + 18 = 89", um zu zeigen, dass 18 Bytes erforderlich sind, aber nicht Teil der Lösung sind, während die endgültige Zählung immer noch die letzte Zahl in der Titelzeile ist ( das ist hilfreich für einige automatische Parser).
Kamil Drakari
3

APL (Dyalog) , 10 Bytes

Dies ist eine anonyme implizite Präfixfunktion (in APL-Begriffen als monadischer Zug bezeichnet).

∧/⊢≥+⍳∘≢

Probieren Sie alle Testfälle auf TIO!

Ist es

∧/ alles wahr, dass

 die Elemente

 sind größer als oder gleich

+\ die kumulierten Summen

÷ geteilt durch

   die ganzen Zahlen von 1 bis

   das

   Anzahl der Elemente

?

Adam
quelle
APL hat ein Symbol für "die"?
User2390246
1
@ user2390246 bindet Dinge auf dieselbe Weise zusammen, wie "the" in "count the cats" zusammenhält. Es heißt wirklich Compose .
Adám
3

C (gcc) , 62 60 62 Bytes

  • Zwei überflüssige Klammern wurden entfernt.
  • Zwei Bytes hinzugefügt, um die Wiederverwendbarkeit der Funktion zu korrigieren ( b=).
f(A,S,k,b)int*A;{for(S=k=b=0;*A;S+=*A++)b+=!(S<=*A*k++);b=!b;}

Probieren Sie es online!

Jonathan Frech
quelle
3

05AB1E , 5 Bytes

ηÅA÷W

Probieren Sie es online!

Umfassende Hilfe von Dennis und Adnan zu dieser reduzierten Version. Es wurde auch ein Fehler behoben, um dies zu ermöglichen. Nochmals vielen Dank, Leute. Ich nehme diese Antwort kaum zur Kenntnis.


05AB1E , 10 Bytes

ηεÅA}ü.S_P

Probieren Sie es online!


Lange, weil DgsO/ist das Äquivalent von "Mittelwert" in 05AB1E.

Anscheinend ÅAist arithmetisches Mittel.

Magische Kraken-Urne
quelle
Um die Mittelwerte zu berechnen, würde ich +\÷Jin Jelly verwenden (kumulative Summe durch Indizes teilen). Ist es nicht so einfach in 05AB1E? Bearbeiten: Nevermind.
Dennis
@Dennis ah, kumulative Summe in 05AB1E ist, dass es ü+dann wirklich keine Division durch Indizes gibt, außer gArray-Länge zu erhalten, Lzu pushen 1,2,...,nund zu dividieren, um den Mittelwert zu erhalten, der immer noch im Wesentlichen 5 Bytes beträgt.
Magic Octopus Urn
.S_ist ein langer Weg <=, wenn jemand irgendwelche Ideen hat.
Magic Octopus Urn
Würde das ÷Wfunktionieren statt ü.S_P?
Dennis
1
Oh, @Adnan hat gerade die Vektorisierung von behoben ÅA, ηÅA÷Wfunktioniert also jetzt.
Dennis
2

APL (Dyalog) , 15 Bytes

∧/⊢≥((+/÷≢)¨,\)

Probieren Sie es online!

Wie?

            ,\  all prefixes
           ¨    for each
      +/÷≢      calculate arithmetic mean
  ⊢≥            element wise comparison
∧/              logically and the result
Uriel
quelle
2

PowerShell , 60 Byte

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

Probieren Sie es online!

Übernimmt Eingaben als literales Array (zB @(1, 4, 3, 8, 6)) in $a. Setzt unsere $oAusgangsvariable auf 1. Dann durchschleift $a. Bei jeder Iteration verwenden wir (ab) das implizite Casting von PowerShell, um *=das Ergebnis eines Booleschen Vergleichs mit unserer $oAusgabe zu erhalten. Die Boolesche ist , ob der aktuelle Wert $_ist -größere-als-oder - equal zu den bisherigen Bedingungen $a[0..$i++]addiert ( -join'+'|iex) dividiert durch , wie viele Begriffe , die wir bereits gesehen haben $i. Wenn also ein Schritt auf dem Weg falsch ist, $owird er mit multipliziert 0. Ansonsten bleibt es 1durchgehend erhalten.

Wir platzieren dann einfach $oin der Pipeline und die Ausgabe ist implizit. 1für wahr und 0für falsch.

AdmBorkBork
quelle
2

C # (.NET Core) , 74 Byte

x=>{for(int i=1,s=0;i<x.Count;)if(x[i]<(s+=x[i-1])/i++)return 0;return 1;}

Probieren Sie es online!

Gibt 0 für falsch und 1 für wahr zurück.

3 Bytes länger als der Kern der Chryslovelaces antworten . Insgesamt aber einige Bytes kürzer, da meine Variante keine usingAnweisungen benötigt.

Rasnagul
quelle
2

Cubix , 35 Bytes

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

Probieren Sie es online!

Nicht die effizienteste Nutzung des Speicherplatzes (6 No-Ops im Code) Erzeugt keine Ausgabe für ein Golf-Array, 1für ein Nicht-Golf-Array.

Wird auf den folgenden Würfel erweitert:

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

Erklärung in Kürze, aber es enthält im Grunde genommen so etwas wie Luis Mendos MATL-Antwort oder Dennis ' Julia-Antwort .

Schau es dir an!

Giuseppe
quelle
2

Matlab und Octave, 41 36 Bytes

5 Bytes gespeichert dank Luis Mendo

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

Probieren Sie es online!

Leander Moesinger
quelle
@ LuisMendo Das würde es brechen, wenn ein Element von aNull ist. Aber das ist ein praktischer Trick, den man sich in ähnlichen Situationen merken muss.
Leander Moesinger
Lesen ist schwer! Danke!
Leander Moesinger
Passiert mir die ganze Zeit :-)
Luis Mendo
2

SQL (MySQL), 68 Byte

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

Probieren Sie es online!

Gibt 1 für Golf-Arrays und 0 für andere Arrays zurück . Nimmt eine Eingabe von einem benannten Tabelle , t. tFühren Sie zum Erstellen Folgendes aus:

CREATE TABLE t(i SERIAL,n INT)

und um die Werte zu laden:

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

Python 2 , 52 Bytes

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

Probieren Sie es online!

Python 2 , 50 48 44 42 Bytes

  • Zwei Bytes durch Inlinen und Verwenden von gespeichert and.
  • Zwei Bytes dank Mr. Xcoder durch Verketten der Zuweisung eingespartS=k=0 .
  • Mit orund dem booleschen Wert des Vergleichs als kInkrementwert wurden zwei Bytes gespeichert .
  • Zwei Bytes dank ovs gespart ; Erhöhen von a NameErrordurch Verwenden einer undefinierten Variablen anstelle von a ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

Probieren Sie es online!

Jonathan Frech
quelle
46 Bytes für Ihre alternative Version.
Mr. Xcoder
@ Mr.Xcoder Danke.
Jonathan Frech
42 Bytes
Ovs
@ovs Danke; Ordentlicher Ein-Byte-Weg, um eine Ausnahme auszulösen.
Jonathan Frech
1

q / kdb + 14 Bytes

Lösung:

min x>=avgs x:

Beispiele:

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

Erläuterung:

Ziemlich einfach mit dem avgseingebauten:

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
Streetster
quelle
1

R , 38 34 Bytes

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

Probieren Sie es online!

ngm
quelle
Sehr schön. Keine Ahnung, warum es vorher keine R-Antwort gab ...
Giuseppe
Ihr habt mir alle ein leichtes erspart.
ngm
Anstatt yin den Funktionsargumenten zu definieren , ist die Verwendung von cumsum(x)direkt 4 Byte kürzer. Es ist eine Schande cummean, nicht in der Basis R.
Giuseppe
1

Add ++ , 54 Bytes

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

Probieren Sie es online!

Unoriginal Version, 30 Bytes

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

Probieren Sie es online!

Beide geben 1 für Golf-Arrays und 0 sonst aus

Wie sie arbeiten

Die erste Version wurde von mir erstellt, ohne andere Lösungen zu prüfen. Der zweite wurde von Dennis ' Kommentar inspiriert , daher bin ich weniger zufrieden damit.

Die erste Version

fEINEINB: =[1,...|EIN|]|EIN|EINdbLR$[B,EIN]GEINBBGG

D,g,@@#,BFB

2#BFEINex[...EIN,e]...BeEIN

Gkgk2{...}IKUYZgkluw

GxEINkk

D,k,@,¦+AbL/

¦+AbL/C

CEIN00[0]C0b]$C+

EINEINABcB]BczipC+

pEIN,qC+;p<q¬(pq)p,q010ª!

Die zweite Version

24EIN¬+[EIN0,EIN0+EIN1,EIN0+EIN1+EIN2,...,EIN0+...+EINich]J Jellys indiciesB: =[1...|EIN|]|EIN|

EINBBcB/0@0@B]C+

C+: =[0,EIN0,EIN0+EIN12,EIN0+EIN1+EIN23,...,EIN0+...+EINichich+1]

EINC+

Caird Coinheringaahing
quelle
0

Pyth , 11 10 Bytes

-1 Byte danke an Herrn Xcoder

.A.egb.O<Q

Probieren Sie es online!

Dave
quelle
7 Bytes: SI.OM._(Port von cairdcoinheringaahing's Lösung von Jelly, von Erik the Outgolfer) oder 10 Bytes mit Ihrem Ansatz:.A.egb.O<Q
Mr. Xcoder
Veröffentlichen Sie den Hafen als Sie selbst, es ist ein völlig anderer Ansatz!
Dave
0

Java (OpenJDK 8) , 96 Byte

Ich weiß, dass es keine gute Golfsprache ist, aber ich habe es trotzdem versucht!

Eingabearray als erstes Argument der zu testenden kommagetrennten Ints.

Gibt 1 für wahr, 0 für falsch zurück.

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

Probieren Sie es online!

Luke Stevens
quelle
0

Java 7, 100 Bytes

Golf gespielt:

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

Ungolfed:

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

Probieren Sie es online aus

Gibt 0 für ungolfy und 1 für golfy Arrays zurück. Etwas länger als Java 8 Antwort.

peech
quelle
0

PHP, 44 Bytes

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

0Nimmt Eingaben von Befehlszeilenargumenten entgegen, beendet sich mit (ok) für ein Golf-Array, mit 1else.

Laufen Sie mit -nroder versuchen Sie es online .

Titus
quelle
0

J, 19 Bytes

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

+/\ % #\Durchschnittswerte der Präfixe: #\Erzeugt 1..n.

}:0, füge am Anfang 0 hinzu und entferne die letzte

[>: ist die ursprüngliche Liste Element für Element> = zur verschobenen Liste der Durchschnitte?

*/Sind alle Elemente größer, dh ist die vorherige Liste alle 1s?

Probieren Sie es online!

Jona
quelle
0

AWK , 39 Bytes

{for(;i++*$i>=s&&i<=NF;s+=$i);$0=i>NF}1

Probieren Sie es online!

Beachten Sie, dass die TIO-Verbindung über 5 zusätzliche Bytes verfügt i=s=0, um eine mehrzeilige Eingabe zu ermöglichen.

Robert Benson
quelle
0

Japt , 10 Bytes

Ich bin auf zwei 10-Byte-Lösungen gekommen und kann mich anscheinend nicht verbessern.

eȨU¯Y x÷Y

Versuch es


Erläuterung

               :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

Alternative

eÈ*°Y¨(T±X

Versuch es

               :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
Zottelig
quelle