Я играю в гольф?

18

Определение и правила

Golfy массив представляет собой массив целых чисел, где каждый элемент является выше , чем или равно средним арифметическим все предыдущими элементами. Ваша задача - определить, является ли массив положительных целых чисел, указанных в качестве входных данных, гольфием или нет.

Тестовые случаи и пример

Например, следующий массив:

[1, 4, 3, 8, 6]

Является массивом гольфа, потому что каждый член выше среднего арифметического числа предшествующих ему. Давайте разберемся пошагово:

Число -> Предшествующие элементы -> Среднее -> Следует ли правилу?

1 -> [] -> 0.0 -> 1 ≥ 0.0 (True)
4 -> [1] -> 1,0 -> 4 ≥ 1,0 (правда)
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 (верно)

Все элементы соответствуют условию, таким образом, это массив для гольфа. Обратите внимание, что для этой задачи мы будем предполагать, что среднее значение пустого списка ( []) равно 0.

Больше тестовых случаев:

Вход -> Выход

[3] -> Правда
[2, 12] -> Правда
[1, 4, 3, 8, 6] -> Верно
[1, 2, 3, 4, 5] -> Правда
[6, 6, 6, 6, 6] -> Правда
[3, 2] -> Ложь
[4, 5, 6, 4] -> Неверно
[4, 2, 1, 5, 7] -> Неверно
[45, 45, 46, 43] -> Ложь
[32, 9, 15, 19, 10] -> Ложь

Обратите внимание , что это головоломка 1 из CodeGolf-Hackathon и также размещена на Anarchy Golf (что одна сломана) - Повторно по histocrat , но я оригинальный автор на обоих сайтах, и , таким образом , разрешено перепечатывать их здесь.

Мистер Xcoder
источник
Всегда ли входные данные представляют собой список натуральных чисел?
Келли Лоудер
@KellyLowder Да.
мистер Xcoder
Это забавная проблема, я думал о том, чтобы опубликовать ее на Anarchy Golf с большим количеством тестовых случаев, но подумал, что вы, возможно, работаете над этим.
гистократ
@histocrat Пройдите репост на Anarchy Golf, я должен был подумать о том, что можно использовать в первую очередь. Я очень рад, что вы находите это интересным (кстати, пожалуйста, напишите мне здесь и дайте ссылку, если вы перепечатали это).
мистер Xcoder
3
@streetster Это эквивалентно. Sum / i> x - это то же самое, что Sum> xi - это то же самое, что Sum + x> x (i + 1) - это то же самое, что (Sum + x) / (i + 1)> x.
гистократ

Ответы:

13

Python 2 , 37 байт

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

Попробуйте онлайн!

Выходы через код выхода: вылеты (код выхода 1) для массивов для игры в гольф, просто выходы с кодом выхода 0 для массивов без игры в гольф. ovs и Джонатан Фрех сохранили 3 байта.

Python 2 , 44 байта

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

Попробуйте онлайн!

Более традиционный вариант, который возвращается Trueдля гольф-массивов, еще False. Джонатан Фрех спас 2 байта.

Линн
источник
1
Я думаю, что a==[]orможет быть a and.
Джонатан Фрех
2
Это на самом деле умно - это подходит sum(a)<=len(a)*a.pop()*[]для базового случая, который всегда так и есть int < list!
Линн
3
39 байт как функция, которая дает сбой при достоверном вводе.
овс
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.
Деннис
источник
6 байтов cairdcoinheringaahing (альтернатива):ÆmƤµ⁼Ṣ
Мистер Xcoder
@ Mr.Xcoder Гольф!
Деннис
Вау, это замечательно :-)
Мистер Xcoder
5

JavaScript (ES6), 33 32 байта

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

Код также работает с отрицательными значениями, такими как [-3, -2]. Возвращает falseдля массива гольфа, trueдля других массивов. Редактировать: 1 байт сохранен благодаря @JustinMariner.

Нил
источник
1
Вы можете отбросить, !поскольку спецификация запрашивает только два разных значения, поэтому возвращение, falseкогда это массив для гольфа, вполне подойдет.
Джастин Маринер
4

MATL , 9 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

Haskell , 53 50 48 байтов

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

Попробуйте онлайн!

Редактировать: -3 байта благодаря Zgarb!

объяснение

Вышеуказанная бессмысленная версия эквивалентна следующей программе:

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]. Список теперь golfy если попарно префиксные суммы меньше или равны индекс элементов раз, которые могут быть проверены путем архивирования как списки (<=)и убедившись , что все результаты Trueс and.

Laikoni
источник
1
Вы можете избежать ошибки типа, как это .
Згарб
@ 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;

Попробуйте онлайн!

chryslovelace
источник
2
Добро пожаловать на сайт! :)
DJMcMayhem
Вообще говоря, импортные заявления не считаются свободными в коде гольф. Поскольку для этого требуется оператор using System.Linq;, на самом деле это будет 89 байтов, иногда выражаемых как «71 + 18 = 89», чтобы показать, что 18 байтов требуются, но не являются частью решения, в то время как окончательное число будет последним числом в строке заголовка ( что полезно для некоторых автоматических парсеров).
Камил Дракари
3

APL (Dyalog) , 10 байт

Это анонимная функция с молчаливым префиксом (в терминах APL называется монадической последовательностью).

∧/⊢≥+⍳∘≢

Попробуйте все тестовые случаи на TIO!

Это

∧/ все правда, что

 элементы

 больше или равно

+\ совокупные суммы

÷ деленное на

   целые числа от 1 до

   the

   количество элементов

?

Адам
источник
APL имеет символ для "the" ??
user2390246
1
@ user2390246 связывает вместе вещи так же, как «the» связывает вместе в «count the cats». Это действительно называется Compose .
Адам
3

C (gcc) , 62 60 62 байта

  • Убраны две лишние скобки.
  • Добавлены два байта для исправления возможности повторного использования функции ( b=).
f(A,S,k,b)int*A;{for(S=k=b=0;*A;S+=*A++)b+=!(S<=*A*k++);b=!b;}

Попробуйте онлайн!

Джонатан Фрех
источник
3

05AB1E , 5 байтов

ηÅA÷W

Попробуйте онлайн!

Обширная помощь от Денниса и Аднана попала в эту уменьшенную версию. Также была исправлена ​​ошибка, чтобы сделать это возможным, еще раз спасибо вам, ребята. Я не очень благодарен за этот ответ.


05AB1E , 10 байтов

ηεÅA}ü.S_P

Попробуйте онлайн!


Длинный, потому что DgsO/это эквивалент «среднего» в 05AB1E.

По-видимому, ÅAэто среднее арифметическое.

Урна волшебного осьминога
источник
Чтобы вычислить средние значения, я бы использовал +\÷J(разделить совокупную сумму на индексы) в желе. Разве это не так просто в 05AB1E? Редактировать: фигу.
Деннис
@Dennis ах, накопленная сумма в 05AB1E не ü+то на самом деле нет divie другими , чем индексы , gчтобы получить длину массива, Lчтобы толчок 1,2,...,nи разделить , чтобы получить средние, который до сих пор по существу 5 байт.
Волшебная Урна Осьминога
.S_это длинный путь <=, если у кого-то есть идеи, lmk.
Волшебная Осьминог Урна
Будет ÷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. Устанавливает нашу $oпеременную utput 1. Затем проходит через $a. На каждой итерации мы (ab) используем неявное приведение PowerShell к *=результату логического сравнения с нашим $output. Логическое значение - это то, является ли текущее значение $_больше, -gчем eобычно для предыдущих терминов, $a[0..$i++]добавленных вместе ( -join'+'|iex), деленное на количество терминов, которые мы уже видели $i. Таким образом, если какой-либо шаг на этом пути неверен, то он $oбудет умножен на 0. Иначе оно останется 1повсюду.

Затем мы просто $oпомещаем в конвейер и вывод неявный. 1за правду и 0за фалси.

AdmBorkBork
источник
2

C # (.NET Core) , 74 байта

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

Попробуйте онлайн!

Возвращает 0 для false и 1 для true.

3 байт больше , чем ядро chryslovelaces ответа . Но всего несколько байт короче, потому что мой вариант не нуждается ни в каких usingутверждениях.

raznagul
источник
2

Cubix , 35 байт

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

Попробуйте онлайн!

Не самое эффективное использование пространства (6 запретных операций в коде). Не производит вывода для массива 1для гольфа, для массива не для гольфа.

Расширяется до следующего куба:

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

Объяснение готовится, но оно в основном переносит что-то вроде ответа MATL Луиса Мендо или ответа Джулии Денниса .

Смотреть это бежать!

Giuseppe
источник
2

Matlab и Octave, 41 36 байт

5 байт сохранено благодаря Луису Мендо

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

Попробуйте онлайн!

Леандер Мезингер
источник
@LuisMendo Это сломало бы это, если любой элемент aравен нулю. Но, тем не менее, это полезный трюк в подобных ситуациях, нужно помнить об этом.
Леандер Мезингер,
Читать сложно! Спасибо!
Леандер Мезингер
Случается со мной все время :-)
Луис Мендо
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);
Einacio
источник
1

Python 2 , 52 байта

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

Попробуйте онлайн!

Python 2 , 50 48 44 42 байта

  • Сохранено два байта путем вставки и использования and.
  • Благодаря г-ну Ксодеру удалось сэкономить два байта путем назначения цепочки S=k=0.
  • Сохранены два байта с использованием orи логическое значение сравнения в качестве kзначения приращения.
  • Сохранено два байта благодаря ovs ; повышение NameErrorс использованием неопределенной переменной вместо ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

Попробуйте онлайн!

Джонатан Фрех
источник
46 байт для вашей альтернативной версии.
Мистер Xcoder
@ Mr.Xcoder Спасибо.
Джонатан Фрех
42 байта
овс
@ovs Спасибо; аккуратный однобайтовый способ вызвать исключение.
Джонатан Фрех
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
streetster
источник
1

R , 38 34 байта

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

Попробуйте онлайн!

НГМ
источник
очень хорошо. Не знаю, почему не было ответа R раньше ...
Джузеппе
Вы все экономили легкий для меня.
НГМ
вместо определения yв аргументах функции cumsum(x)прямое использование на 4 байта короче. Это позор cummean, не существует в базе R.
Джузеппе
1

Добавить ++ , 54 байта

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

Попробуйте онлайн!

Неоригинальная версия, 30 байт

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

Попробуйте онлайн!

Оба выводят 1 для гольф-массивов и 0 в противном случае

Как они работают

Первая версия была создана мной, без проверки каких-либо других решений. Второй был вдохновлен комментарием Денниса , поэтому я менее доволен им.

Первая версия

еAAВзнак равно[1,,,,|A|]|A|AdbLR$[В,A]граммAВВграммграмм

D,g,@@#,BFB

2#BFAеИкс[,,,A,е],,,BеA

граммКgk2{...}IKUYZgkluw

граммИксAКК

D,k,@,¦+AbL/

¦+AbL/С

СA00[0]С0b]$С+

AAABcB]BczipС+

пA,QС+;п<Q¬(пQ)п,Q010ª!

Вторая версия

24A¬+[A0,A0+A1,A0+A1+A2,,,,,A0+,,,+Aя]JВзнак равно[1,,,|A|]|A|

AВBcB/0@0@B]С+

С+знак равно[0,A0,A0+A12,A0+A1+A23,,,,,A0+,,,+Aяя+1]

AС+

Caird Coneheringaahing
источник
0

Pyth , 11 10 байт

-1 байт благодаря мистеру Xcoder

.A.egb.O<Q

Попробуйте онлайн!

Дейв
источник
7 байтов: SI.OM._(решение Cairdcoinheringaahing от Jelly, Эрик Аутгольфер), или 10 байтов, используя ваш подход:.A.egb.O<Q
Mr. Xcoder
Разместите порт как себя, это совершенно другой подход!
Дейв
0

Java (OpenJDK 8) , 96 байт

Я знаю, что это не очень хороший язык для игры в гольф, но я все же попробовал!

Входной массив в качестве первого аргумента разделенных запятыми целых для проверки.

Возвращает 1 для истины, 0 для ложных.

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

Попробуйте онлайн!

Люк Стивенс
источник
0

Java 7, 100 байт

Golfed:

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

Попробуйте онлайн

Возвращает 0 для негольфии и 1 для массивов гольфа. Чуть дольше, чем Java 8 ответ.

Peech
источник
0

PHP, 44 байта

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

принимает входные данные из аргументов командной строки, выходит с помощью 0(ok) для массива гольфа, с помощью 1else.

Запустите -nrили попробуйте онлайн .

Titus
источник
0

J, 19 байт

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

+/\ % #\средние значения префиксов: #\производит 1..n

}:0, добавить 0 в начало и удалить последний

[>: исходный элемент списка по элементу> = сдвинутому списку средних?

*/являются все элементы больше, то есть, предыдущий список всех 1s?

Попробуйте онлайн!

Ион
источник
0

AWK , 39 байт

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

Попробуйте онлайн!

Обратите внимание, что ссылка TIO имеет 5 дополнительных байтов i=s=0для многострочного ввода.

Роберт Бенсон
источник
0

Japt , 10 байт

Придумали два 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
мохнатый
источник