Czy jestem golfistą?

18

Definicja i zasady

Tablica golfy to tablica liczb całkowitych, w której każdy element jest większy lub równy średniej arytmetycznej wszystkich poprzednich elementów. Twoim zadaniem jest ustalenie, czy tablica dodatnich liczb całkowitych podanych jako dane wejściowe jest golfowa, czy nie.

Przypadki testowe i przykład

Na przykład następująca tablica:

[1, 4, 3, 8, 6]

Jest tablicą golfową, ponieważ każdy termin jest wyższy niż średnia arytmetyczna z tych poprzedzających. Przećwiczmy to krok po kroku:

Liczba -> Poprzedzające elementy -> Średnia -> Przestrzega reguły?

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

Wszystkie elementy spełniają warunek, dlatego jest to tablica golfowa. Zauważ, że dla celów tego wyzwania założymy, że średnia z pustej listy ( []) wynosi 0.

Więcej przypadków testowych:

Wejście -> Wyjście

[3] -> Prawda
[2, 12] -> Prawda
[1, 4, 3, 8, 6] -> Prawda
[1, 2, 3, 4, 5] -> Prawda
[6, 6, 6, 6, 6] -> Prawda
[3, 2] -> Fałsz
[4, 5, 6, 4] -> Fałsz
[4, 2, 1, 5, 7] -> Fałsz
[45, 45, 46, 43] -> Fałsz
[32, 9, 15, 19, 10] -> Fałsz

Należy pamiętać, że jest to logiczne 1 z CodeGolf-maraton hakerski a także zamieszczone na Anarchy Golf (że jeden jest uszkodzony) - Reposted przez histocrat , ale jestem oryginalny autor po obu stronach, a więc wolno odśwież je tutaj.

Pan Xcoder
źródło
Czy dane wejściowe są zawsze listą liczb całkowitych dodatnich?
Kelly Lowder
@KellyLowder Tak.
Pan Xcoder,
To zabawny problem, myślałem o ponownym opublikowaniu go na Anarchy Golf z większą liczbą przypadków testowych, ale pomyślałem, że możesz nad tym popracować.
histocrat
@histocrat Śmiało i opublikuj to na Anarchy Golf, powinienem pomyśleć o rzeczach, które można wykorzystać w pierwszej kolejności. Cieszę się, że uważasz to za interesujące (Btw, proszę pinguj mnie tutaj i podaj link, jeśli go opublikujesz).
Pan Xcoder,
3
@streetster Są one równoważne. Sum / i> x jest taki sam jak Sum> xi jest taki sam jak Sum + x> x (i + 1) jest taki sam jak (Sum + x) / (i + 1)> x.
histocrat

Odpowiedzi:

13

Python 2 , 37 bajtów

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

Wypróbuj online!

Wyjścia za pomocą kodu wyjścia: awarie (kod wyjścia 1) dla tablic golfowych, po prostu wyjście z kodem wyjścia 0 dla tablic innych niż golfy. ovs i Jonathan Frech zapisali 3 bajty.

Python 2 , 44 bajty

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

Wypróbuj online!

Bardziej tradycyjny wariant, który powraca Truedo tablic golfowych False. Jonathan Frech zapisał 2 bajty.

Lynn
źródło
1
Myślę, że a==[]ormoże być a and.
Jonathan Frech
2
To jest naprawdę sprytne - wychodzi na to sum(a)<=len(a)*a.pop()*[]w przypadku skrzynki podstawowej, co zawsze jest prawdą int < list!
Lynn
3
39 bajtów jako funkcja, która ulega awarii dla prawdziwych danych wejściowych.
ovs
1
@ovs 37 bajtów przy użyciu funkcji rozkazującej.
Jonathan Frech
11

Galaretka , 6 5 bajtów

<ÆmƤE

Wypróbuj online!

Jak to działa

<Æ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
źródło
6-bajter cairdcoinheringaahing (alternatywa):ÆmƤµ⁼Ṣ
Pan Xcoder
@ Mr.Xcoder Golfed!
Dennis
Wow, to jest wspaniałe :-)
Mr. Xcoder
5

JavaScript (ES6), 33 32 bajty

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

Kod działa również na wartościach ujemnych, takich jak [-3, -2]. Zwraca falsetablicę golfową truedla innych tablic. Edycja: Zapisano 1 bajt dzięki @JustinMariner.

Neil
źródło
1
Możesz porzucić, !ponieważ specyfikacja prosi tylko o dwie różne wartości, więc powracanie, falsegdy jest to golfowa tablica, jest w porządku.
Justin Mariner
4

Wolfram Language (Mathematica) , 35 bajtów

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

Wypróbuj online!

Wyjścia Falsedla tablic golfowych i Trueinnych.

Martin Ender
źródło
1
Widzę, że relacja fałsz / prawda jest odwrócona, ale to w porządku
Kelly Lowder
4

MATL , 9 8 bajtów

tYstf/<a

Wyjścia 0dla tablic golfowych, w 1przeciwnym razie.

Wypróbuj online!

Wyjaśnienie

Rozważ wejście [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
źródło
4

Haskell , 53 50 48 bajtów

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

Wypróbuj online!

Edycja: -3 bajty dzięki Zgarb!

Wyjaśnienie

Powyższa wersja bez punktów jest odpowiednikiem następującego programu:

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

Biorąc pod uwagę wejście s=[1,4,3,8,6], scanl1(+)soblicza sumy przedrostków [1,5,8,16,22]i zipWith(*)[1..](tail s)spadnie pierwszy element i mnoży wszystkie inne elementy o indeksie: [4,6,24,24]. Lista jest teraz Golfy jeśli prefiks parami kwoty są mniejsze lub równe wskaźnikowi elementy razy, które mogą być sprawdzone przez skompresowanie obie listy z (<=)i sprawdzając, czy wszystkie wyniki są Truez and.

Laikoni
źródło
1
Możesz uniknąć takiego błędu typu .
Zgarb
@Zgarb Z perspektywy czasu jest to oczywiste rozwiązanie. Dzięki za wskazanie!
Laikoni
3

C # (kompilator Visual C #) , 71 + 18 = 89 bajtów

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

dodatkowe 18 bajtów dla using System.Linq;

Wypróbuj online!

chryslovelace
źródło
2
Witamy na stronie! :)
DJMcMayhem
Ogólnie rzecz biorąc, wyciągi importowe nie są uważane za darmowe w golfie kodowym. Ponieważ wymaga to stwierdzenia using System.Linq;, w rzeczywistości będzie to 89 bajtów, czasami wyrażonych jako „71 + 18 = 89”, aby pokazać, że 18 bajtów jest wymaganych, ale nie stanowi części rozwiązania, a jednocześnie końcowa liczba będzie ostatnią liczbą w linii tytułowej ( co jest pomocne w przypadku niektórych automatycznych parserów).
Kamil Drakari,
3

APL (Dyalog) , 10 bajtów

Jest to anonimowa ukryta funkcja prefiksu (nazywana monadycznym pociągiem w kategoriach APL).

∧/⊢≥+⍳∘≢

Wypróbuj wszystkie przypadki testowe w TIO!

Czy to jest

∧/ to prawda

 elementy

 są większe lub równe

+\ sumy skumulowane

÷ podzielony przez

   liczby całkowite od 1 do

   the

   liczba elementów

?

Adám
źródło
APL ma symbol „the”?
user2390246,
1
@ user2390246 wiąże rzeczy w ten sam sposób, w jaki „łączą się” w „policz koty”. To naprawdę nazywa się Compose .
Adám,
3

C (gcc) , 62 60 62 bajtów

  • Usunięto dwa zbędne nawiasy.
  • Dodano dwa bajty, aby naprawić możliwość ponownego użycia funkcji ( b=).
f(A,S,k,b)int*A;{for(S=k=b=0;*A;S+=*A++)b+=!(S<=*A*k++);b=!b;}

Wypróbuj online!

Jonathan Frech
źródło
3

05AB1E , 5 bajtów

ηÅA÷W

Wypróbuj online!

Szeroka pomoc Dennisa i Adnana dotarła do tej zredukowanej wersji. Naprawiono także błąd, aby to umożliwić, jeszcze raz dziękuję wam. Nie podoba mi się ta odpowiedź.


05AB1E , 10 bajtów

ηεÅA}ü.S_P

Wypróbuj online!


Długi, ponieważ DgsO/jest odpowiednikiem „średniej” w 05AB1E.

Najwyraźniej ÅAjest to średnia arytmetyczna.

Urna Magicznej Ośmiornicy
źródło
Aby obliczyć średnie, użyłbym +\÷J(podzielę sumę skumulowaną przez indeksy) w galarecie. Czy to nie jest takie proste w 05AB1E? Edycja: Nevermind.
Dennis
@Dennis ah, suma skumulowana w 05AB1E jest ü+wtedy tak naprawdę, że nie ma żadnych podziałów według indeksów innych niż guzyskanie długości tablicy, Lwypychanie 1,2,...,ni dzielenie w celu uzyskania średniej, która wciąż wynosi zasadniczo 5 bajtów.
Magic Octopus Urn
.S_jest DŁUGĄ drogą <=, jeśli ktoś ma jakieś pomysły.
Magic Octopus Urn
Czy ÷Wdziałałby zamiast ü.S_P?
Dennis
1
Och, @Adnan właśnie naprawił wektoryzację ÅA, więc ηÅA÷Wdziała teraz.
Dennis
2

APL (Dyalog) , 15 bajtów

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

Wypróbuj online!

W jaki sposób?

            ,\  all prefixes
           ¨    for each
      +/÷≢      calculate arithmetic mean
  ⊢≥            element wise comparison
∧/              logically and the result
Uriel
źródło
2

PowerShell , 60 bajtów

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

Wypróbuj online!

Staje wejście w dosłownym matrycy (na przykład @(1, 4, 3, 8, 6)) do $a. Ustawia naszą $ozmienną utput na 1. Następnie zapętla się $a. Każdej iteracji używamy (ab) niejawnego rzutowania PowerShell *=na wynik porównania logicznego z naszym $output. Boolean polega na tym, czy bieżąca wartość $_jest -gpowtórzona ewzględem poprzednich warunków zsumowanych $a[0..$i++]( -join'+'|iex) podzielona przez liczbę terminów, które już widzieliśmy $i. Tak więc, jeśli jakikolwiek krok na drodze jest fałszywy, $ozostanie pomnożony przez 0. W przeciwnym razie pozostanie 1przez cały czas.

Następnie po prostu umieszczamy $ona rurociągu i wynik jest niejawny. 1za prawdę i 0za falsey.

AdmBorkBork
źródło
2

C # (.NET Core) , 74 bajty

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

Wypróbuj online!

Zwraca 0 dla wartości false i 1 dla wartości true.

3 bajty dłuższe niż rdzeń chryslovelaces odpowiedzi . Ale w sumie kilka bajtów jest krótszych, ponieważ mój wariant nie wymaga żadnych usinginstrukcji.

raznagul
źródło
2

Cubix , 35 bajtów

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

Wypróbuj online!

Nie jest to najbardziej wydajne wykorzystanie miejsca (6 no-ops w kodzie) Nie wytwarza danych wyjściowych dla tablicy golfowej, 1dla tablicy innej niż golfowa.

Rozwija się do następującej kostki:

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

Wyjaśnienie wkrótce, ale w zasadzie zawiera coś w rodzaju odpowiedzi MATL Luisa Mendo lub odpowiedzi Dennisa Julii .

Zobacz, jak działa!

Giuseppe
źródło
2

Matlab i Octave, 41 36 bajtów

5 bajtów zaoszczędzonych dzięki Luisowi Mendo

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

Wypróbuj online!

Leander Moesinger
źródło
@LuisMendo To by je zepsuło, gdyby jakikolwiek element wynosił azero. Ale to przydatna sztuczka w podobnych sytuacjach, trzeba o tym pamiętać.
Leander Moesinger
Czytanie jest trudne! Dzięki!
Leander Moesinger
Cały czas mi się to zdarza :-)
Luis Mendo
2

SQL (MySQL), 68 bajtów

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

Wypróbuj online!

Zwraca 1 dla tablic golfowych, a 0 w przeciwnym razie. Zajmuje wejście od nazwie tabeli , t. Aby utworzyć t, uruchom:

CREATE TABLE t(i SERIAL,n INT)

i aby załadować wartości:

truncate table t;insert into t(n)values(3),(2);
Einacio
źródło
1

Rubinowy , 30 bajtów

->a{0until a.pop*a.size<a.sum}

Wypróbuj online!

Zainspirowany odpowiedzią Lynn . Rzuty NoMethodErrordla golfy, w nilprzeciwnym razie zwraca .

Przekąska
źródło
1

Python 2 , 52 bajty

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

Wypróbuj online!

Python 2 , 50 48 44 42 bajtów

  • Zaoszczędzono dwa bajty, wstawiając i używając and.
  • Zaoszczędził dwa bajty dzięki Panu Xcoderowi , łącząc zadania S=k=0.
  • Zaoszczędzono dwa bajty za pomocą, ora wartość logiczna porównania jako kwartość przyrostowa.
  • Zaoszczędzono dwa bajty dzięki ovs ; podnoszenie NameErrorza pomocą niezdefiniowanej zmiennej zamiast a ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

Wypróbuj online!

Jonathan Frech
źródło
46 bajtów dla twojej alternatywnej wersji.
Pan Xcoder,
@ Mr.Xcoder Thanks.
Jonathan Frech
42 bajty
ovs
@ovs Thanks; zgrabny jednobajtowy sposób na zgłoszenie wyjątku.
Jonathan Frech
1

q / kdb + , 14 bajtów

Rozwiązanie:

min x>=avgs x:

Przykłady:

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

Wyjaśnienie:

Dość proste dzięki avgswbudowanemu:

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
źródło
1

R , 38 34 bajtów

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

Wypróbuj online!

ngm
źródło
bardzo dobrze. Nie wiem, dlaczego wcześniej nie było odpowiedzi R ...
Giuseppe
Wszyscy oszczędzaliście mi łatwy.
ngm
zamiast definiować yw argumentach funkcji cumsum(x)bezpośrednie użycie jest o 4 bajty krótsze. Szkoda, cummeanże nie istnieje w bazie R.
Giuseppe
1

Dodaj ++ , 54 bajty

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

Wypróbuj online!

Wersja nieoryginalna, 30 bajtów

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

Wypróbuj online!

Oba wyjścia 1 dla tablic golfowych, a 0 w przeciwnym razie

Jak oni pracują

Pierwsza wersja została stworzona przeze mnie, bez sprawdzania innych rozwiązań. Drugi został zainspirowany przez Dennisa komentarzem , więc jestem mniej zadowolony.

Pierwsza wersja

faZAZAb: =[1,...|ZA|]|ZA|ZAdbLR$[b,ZA]solZAbbsolsol

D,g,@@#,BFB

2)#BFZAmix[...ZA,mi]...BmiZA i zwraca listę zawierającą te elementy.

solkgk2){...}IKUYZgklu i w.

solxZAkk

D,k,@,¦+AbL/

¦+AbL/do

doZA00[0]do0b]$do+ .

ZAZAABcB]Bczipdo+

pZA,qdo+;p<q¬(pq)p,q010 z ª!i powrotu tej wartości.

Druga wersja

24ZA¬+[ZA0,ZA0+ZA1,ZA0+ZA1+ZA2),...,ZA0+...+ZAja]Jb: =[1...|ZA|]|ZA|

ZAbBcB/0@0@B]do+

do+: =[0,ZA0,ZA0+ZA12),ZA0+ZA1+ZA2)3),...,ZA0+...+ZAjaja+1]

ZAdo+

Cairney Coheringaahing
źródło
0

Pyth , 11 10 bajtów

-1 bajt dzięki Mr. Xcoder

.A.egb.O<Q

Wypróbuj online!

Dave
źródło
7 bajtów: SI.OM._(port rozwiązania cairdcoinheringaahing z Jelly, autorstwa Erika the Outgolfer), lub 10 bajtów przy twoim podejściu:.A.egb.O<Q
Pan Xcoder,
Opublikuj port jak sam, to zupełnie inne podejście!
Dave
0

Java (OpenJDK 8) , 96 bajtów

Wiem, że to nie jest dobry język golfowy, ale wciąż próbowałem!

Tablica wejściowa jako pierwszy argument liczb całkowitych oddzielonych przecinkami do przetestowania.

Zwraca 1 dla wartości true, 0 dla wartości false.

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

Wypróbuj online!

Luke Stevens
źródło
0

Java 7, 100 bajtów

Gra w golfa:

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

Nie golfowany:

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

Wypróbuj online

Zwraca 0 dla tablic golfowych i 1 dla tablic golfowych. Nieco dłużej niż odpowiedź Java 8.

brzoskwinia
źródło
0

PHP, 44 bajty

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

pobiera dane z argumentów wiersza poleceń, wychodzi z 0(ok) dla tablicy golfy, z 1innym.

Uruchom -nrlub wypróbuj online .

Tytus
źródło
0

J, 19 bajtów

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

+/\ % #\średnie z przedrostków: #\daje 1..n

}:0, dodaj 0 na początku i usuń ostatni

[>: czy oryginalny element listy element po elemencie = = do przesuniętej listy średnich?

*/czy wszystkie elementy są większe, tzn. czy poprzednia lista to 1s?

Wypróbuj online!

Jonasz
źródło
0

AWK , 39 bajtów

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

Wypróbuj online!

Zauważ, że łącze TIO ma 5 dodatkowych bajtów, i=s=0aby umożliwić wprowadzanie wielu wierszy.

Robert Benson
źródło
0

Japt , 10 bajtów

Wymyślono dwa 10-bajtowe rozwiązania, które nie wydają się poprawiać.

eȨU¯Y x÷Y

Spróbuj


Wyjaśnienie

               :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

Alternatywny

eÈ*°Y¨(T±X

Spróbuj

               :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
Kudłaty
źródło