Eu sou um campo de golfe?

18

Definição e Regras

Uma matriz golfy é uma matriz de números inteiros, em que cada elemento é maior ou igual à média aritmética de todos os elementos anteriores. Sua tarefa é determinar se uma matriz de números inteiros positivos fornecida como entrada é de golfe ou não.

Casos de teste e exemplo

Por exemplo, a seguinte matriz:

[1, 4, 3, 8, 6]

É uma matriz de golfe, porque cada termo é maior que a média aritmética dos anteriores. Vamos trabalhar passo a passo:

Número -> Elementos precedentes -> Média -> Segue a regra?

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

Todos os elementos respeitam a condição, portanto, esta é uma matriz de golfe. Observe que, para o propósito deste desafio, assumiremos que a média de uma lista vazia ( []) é 0.

Mais casos de teste:

Entrada -> Saída

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

Observe que este é o quebra - cabeça 1 do CodeGolf-Hackathon e também é publicado no Anarchy Golf (que está quebrado) - Reeditado por histocrat , mas eu sou o autor original dos dois sites e, portanto, posso repassá- los aqui.

Mr. Xcoder
fonte
A entrada é sempre uma lista de números inteiros positivos?
Kelly Lowder
@KellyLowder Sim.
Xcoder 18/10/19
É um problema divertido, eu estava pensando em publicá-lo no Anarchy Golf com mais casos de teste, mas pensei que você poderia estar trabalhando nisso.
histocrat
@histocrat Vá em frente e repassá-lo no Anarchy Golf, eu deveria ter pensado nas coisas que poderiam ser exploradas primeiro. Estou bastante satisfeito por você achar interessante (Btw, por favor, faça ping aqui e dê um link se você o repassar).
Sr. Xcoder 18/10/19
3
@ streetster Esses são equivalentes. Soma / i> x é o mesmo que Soma> xi é o mesmo que Soma + x> x (i + 1) é o mesmo que (Soma + x) / (i + 1)> x.
histocrat

Respostas:

13

Python 2 , 37 bytes

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

Experimente online!

Saídas via código de saída: trava (código de saída 1) para matrizes de golfe, apenas sai com o código de saída 0 para matrizes que não são de golfe. ovs e Jonathan Frech salvou 3 bytes.

Python 2 , 44 bytes

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

Experimente online!

Uma variante mais tradicional, que retorna Truepara matrizes de golfe, além disso False. Jonathan Frech salvou 2 bytes.

Lynn
fonte
1
Eu acho que a==[]orpode ser a and.
Jonathan Frech
2
Isso é realmente inteligente - trata-se sum(a)<=len(a)*a.pop()*[]do caso base, que é sempre verdadeiro como int < list!
Lynn
3
39 bytes como uma função que trava para entradas verdadeiras.
ovs 18/10/19
1
@ovs 37 bytes usando uma função imperativa.
Jonathan Frech
11

Gelatina , 6 5 bytes

<ÆmƤE

Experimente online!

Como funciona

<Æ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
fonte
6-byter de cairdcoinheringaahing (alternativa):ÆmƤµ⁼Ṣ
Sr. Xcoder 18/17
@ Mr.Xcoder Golfed!
Dennis
Uau, isso é brilhante :-)
Mr. Xcoder
5

JavaScript (ES6), 33 32 bytes

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

O código também funciona com valores negativos, como [-3, -2]. Retorna falsepara uma matriz de golfe, truepara outras matrizes. Edit: Salvo 1 byte graças a @JustinMariner.

Neil
fonte
1
Você pode soltar o valor, !já que a especificação pede apenas dois valores diferentes; portanto, retornar falsequando é uma matriz de golfe é bom.
Justin Mariner
4

Wolfram Language (Mathematica) , 35 bytes

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

Experimente online!

Saídas Falsepara matrizes de golfe e Trueoutros.

Martin Ender
fonte
1
Vejo que o relacionamento falso / verdadeiro é revertido, mas tudo bem #
Kelly Lowder
4

MATL , 9 8 bytes

tYstf/<a

Saídas 0para matrizes de golfe, 1caso contrário.

Experimente online!

Explicação

Considere entrada [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
fonte
4

Haskell , 53 50 48 bytes

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

Experimente online!

Edit: -3 bytes graças ao Zgarb!

Explicação

A versão sem pontos acima é equivalente ao seguinte programa:

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

Dada uma entrada s=[1,4,3,8,6], scanl1(+)scalcula as somas de prefixo [1,5,8,16,22]e zipWith(*)[1..](tail s)deixa cair o primeiro elemento e multiplica-se todos os outros elementos, com o seu índice de: [4,6,24,24]. A lista agora está ativa se, em pares, as somas do prefixo forem menores ou iguais ao índice de elementos e tempos, que pode ser verificado zipando ambas as listas (<=)e verificando se todos os resultados estão Truecom and.

Laikoni
fonte
1
Você pode evitar o erro de tipo assim .
Zgarb 18/10/19
@ Zgarb Em retrospectiva, esta é a solução óbvia. Obrigado por apontar!
Laikoni 18/10/19
3

C # (Compilador Visual C #) , 71 + 18 = 89 bytes

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

18 bytes adicionais para using System.Linq;

Experimente online!

chryslovelace
fonte
2
Bem vindo ao site! :)
DJMcMayhem
De um modo geral, as instruções de importação não são consideradas livres no código de golfe. Como isso requer a declaração using System.Linq;, na verdade seriam 89 bytes, às vezes expressos como "71 + 18 = 89" para mostrar que 18 bytes são necessários, mas não fazem parte da solução, enquanto a contagem final ainda é o último número na linha de título ( o que é útil para alguns analisadores automáticos).
Kamil Drakari 18/10/19
3

APL (Dyalog) , 10 bytes

Esta é uma função de prefixo tácito anônimo (chamado de trem monádico em termos de APL).

∧/⊢≥+⍳∘≢

Experimente todos os casos de teste no TIO!

É isso

∧/ totalmente verdade que

 os elementos

 são maiores ou iguais a

+\ as somas acumuladas

÷ dividido por

   os inteiros de 1 a

   a

   número de elementos

?

Adão
fonte
APL tem um símbolo para "the" ??
user2390246
1
@ user2390246 une as coisas da mesma forma que "o" une em "contar os gatos". É realmente chamado de composição .
Adám 19/10/19
3

C (gcc) , 62 60 62 bytes

  • Removidos dois parênteses supérfluos.
  • Adicionado dois bytes para corrigir a reutilização da função ( b=).
f(A,S,k,b)int*A;{for(S=k=b=0;*A;S+=*A++)b+=!(S<=*A*k++);b=!b;}

Experimente online!

Jonathan Frech
fonte
3

05AB1E , 5 bytes

ηÅA÷W

Experimente online!

A extensa ajuda de Dennis e Adnan chegou a esta versão reduzida. Também foi corrigido um erro para tornar isso possível, obrigado novamente a vocês. Tomo pouco crédito por esta resposta.


05AB1E , 10 bytes

ηεÅA}ü.S_P

Experimente online!


Longo porque DgsO/é o equivalente a "médio" em 05AB1E.

Aparentemente ÅAé a média aritmética.

Urna de polvo mágico
fonte
Para calcular os meios, eu usaria +\÷J(divida a soma acumulada por índices) no Jelly. Não é tão fácil no 05AB1E? Edit: Deixa pra lá.
Dennis
@ Dennis ah, a soma cumulativa em 05AB1E é ü+que, na verdade, não há divisão por índices além de gobter o comprimento da matriz, Lpressionar 1,2,...,ne dividir para obter a média, que ainda é essencialmente 5 bytes.
Magic Octopus Urn
.S_é um longo caminho a percorrer <=, se alguém tiver alguma idéia lmk.
Magic Octopus Urn
Iria ÷Wtrabalhar em vez de ü.S_P?
Dennis
1
Ah, o @Adnan acabou de corrigir a vetorização de ÅA, então ηÅA÷Wfunciona agora.
Dennis
2

APL (Dyalog) , 15 bytes

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

Experimente online!

Quão?

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

PowerShell , 60 bytes

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

Experimente online!

Leva a entrada como uma matriz literal (por exemplo, @(1, 4, 3, 8, 6)) para $a. Define nossa $ovariável utput como 1. Então faz um loop $a. A cada iteração, estamos (ab) usando a conversão implícita do PowerShell para *=o resultado de uma comparação booleana em relação à nossa $oprodução. O booleano é se o valor atual $_é igual -gou superior eaos termos anteriores $a[0..$i++]somados ( -join'+'|iex) dividido por quantos termos já vimos $i. Portanto, se qualquer passo no caminho for falso, ele $oserá multiplicado por 0. Caso contrário, ele permanecerá por 1toda parte.

Simplesmente colocamos $ono pipeline e a saída está implícita. 1por verdade e 0por falsey.

AdmBorkBork
fonte
2

C # (.NET Core) , 74 bytes

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

Experimente online!

Retorna 0 para falso e 1 para verdadeiro.

Resposta de 3 bytes a mais do que o núcleo dos chryslovelaces . Mas, no total, vários bytes mais curtos porque minha variante não precisa de nenhuma instrução.using

raznagul
fonte
2

Cubix , 35 bytes

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

Experimente online!

Não é o uso mais eficiente do espaço (6 não operações no código) Não produz saída para uma matriz de golfe, 1para uma matriz que não seja de golfe.

Expande para o seguinte cubo:

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

Explicação a seguir , mas basicamente contém algo como a resposta MATL de Luis Mendo ou a resposta Julia de Dennis .

Assista correr!

Giuseppe
fonte
2

Matlab e Octave, 41 36 bytes

5 bytes salvos thx em Luis Mendo

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

Experimente online!

Leander Moesinger
fonte
@LuisMendo Isso quebraria se qualquer elemento de afosse zero. Mas esse é um truque útil, em situações semelhantes, que você deve ter em mente.
Leander Moesinger
Ler é difícil! Valeu!
Leander Moesinger
Acontece comigo o tempo todo :-)
Luis Mendo
2

SQL (MySQL), 68 bytes

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

Experimente online!

Retorna 1 para matrizes de golfe e 0 caso contrário. Toma a entrada de uma tabela chamada , t. Para criar t, execute:

CREATE TABLE t(i SERIAL,n INT)

e para carregar os valores:

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

Ruby , 30 bytes

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

Experimente online!

Inspirado pela resposta de Lynn . Joga NoMethodErrorpara o golfe, retorna nilcaso contrário.

Lanche
fonte
1

Python 2 , 52 bytes

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

Experimente online!

Python 2 , 50 48 44 42 bytes

  • Salva dois bytes inlining e usando and.
  • Economizou dois bytes graças ao Sr. Xcoder , encadeando a atribuição S=k=0.
  • Salva dois bytes usando ore o valor booleano da comparação como kvalor de incremento.
  • Economizou dois bytes graças ao ovs ; aumentando a NameErrorusando uma variável indefinida em vez de a ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

Experimente online!

Jonathan Frech
fonte
46 bytes para sua versão alternativa.
Xcoder
@ Mr.Xcoder Obrigado.
Jonathan Frech
42 bytes
ovs 18/10/10
@ovs Obrigado; maneira simples de um byte para gerar uma exceção.
Jonathan Frech
1

q / kdb + , 14 bytes

Solução:

min x>=avgs x:

Exemplos:

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

Explicação:

Bastante simples com o avgsbuilt-in:

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
rua
fonte
1

R , 38 34 bytes

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

Experimente online!

ngm
fonte
muito agradável. Não sei por que não havia uma resposta R antes ...
Giuseppe
Vocês estavam salvando um fácil para mim.
ngm
em vez de definir ynos argumentos da função, usar cumsum(x)diretamente é 4 bytes mais curto. É uma pena cummeannão existe na base de R.
Giuseppe
1

Adicione ++ , 54 bytes

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

Experimente online!

Versão não original, 30 bytes

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

Experimente online!

A saída 1 para matrizes de golfe e 0 de outra forma

Como eles trabalham

A primeira versão foi criada por mim, sem verificar outras soluções. O segundo foi inspirado no comentário de Dennis , então estou menos feliz com isso.

A primeira versão

fAAB:=[1,...|A|]|A|AdbLR$[B,A]gABBgg

D,g,@@#,BFB

2#BFAex[...A,e]...BeA

gkgk2{...}IKUYZgkluw

gxAkk

D,k,@,¦+AbL/

¦+AbL/C

CA00[0]C0b]$C+

AAABcB]BczipC+

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

A segunda versão

24A¬+[A0,A0+A1,A0+A1+A2,...,A0+...+Ai]JB:=[1...|A|]|A|

ABBcB/0@0@B]C+

C+:=[0,A0,A0+A12,A0+A1+A23,...,A0+...+Aii+1]

AC+

caird coinheringaahing
fonte
0

Pitão , 11 10 bytes

-1 byte graças ao Sr. Xcoder

.A.egb.O<Q

Experimente online!

Dave
fonte
7 bytes: SI.OM._(porto de solução de cairdcoinheringaahing de Jelly, por Erik o Outgolfer), ou 10 bytes usando a sua abordagem:.A.egb.O<Q
Sr. Xcoder
Poste a porta como você mesmo, é uma abordagem totalmente diferente!
Dave
0

Java (OpenJDK 8) , 96 bytes

Sei que não é uma boa linguagem para o golfe, mas ainda assim!

Matriz de entrada como primeiro argumento de ints separados por vírgula para testar.

Retorna 1 para verdadeiro, 0 para falso.

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

Experimente online!

Luke Stevens
fonte
0

Java 7, 100 bytes

Golfe:

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

Experimente online

Retorna 0 para ungolfy e 1 para matrizes de golfe. Um pouco mais que a resposta java 8.

peech
fonte
0

PHP, 44 bytes

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

recebe entrada dos argumentos da linha de comando, sai com 0(ok) para uma matriz de golfe, com 1mais.

Corra com -nrou experimente online .

Titus
fonte
0

J, 19 bytes

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

+/\ % #\médias dos prefixos: #\produz 1..n

}:0, adicione 0 ao começo e remova o último

[>: é o elemento da lista original por elemento> = para a lista deslocada de médias?

*/são todos os elementos de maior, ou seja, a lista anterior é todos os 1s?

Experimente online!

Jonah
fonte
0

AWK , 39 bytes

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

Experimente online!

Observe que o link TIO possui 5 bytes extras i=s=0para permitir a entrada de várias linhas.

Robert Benson
fonte
0

Japonês , 10 bytes

Chegou com duas soluções de 10 bytes, parece que não consegue melhorar isso.

eȨU¯Y x÷Y

Tente


Explicação

               :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

Alternativo

eÈ*°Y¨(T±X

Tente

               :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
Shaggy
fonte