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.


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.


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.

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.


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

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

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.


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!


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

?


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!


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.


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

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.




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!



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


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!


46 bajtów dla twojej alternatywnej wersji.
Pan Xcoder,

@ Mr.Xcoder Thanks.
Jonathan Frech


@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


1

R , 38 34 bajtów

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

Wypróbuj online!


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+


0

Pyth , 11 10 bajtów

-1 bajt dzięki Mr. Xcoder

.A.egb.O<Q

Wypróbuj online!


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!


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.


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 .


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!



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.