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


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 , но я оригинальный автор на обоих сайтах, и , таким образом , разрешено перепечатывать их здесь.


Всегда ли входные данные представляют собой список натуральных чисел?
Келли Лоудер

@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.


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;

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


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

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за фалси.




2

Cubix , 35 байт

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

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

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

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

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

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

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


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


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 Спасибо.
Джонатан Фрех


@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


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С+


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 ответ.


0

PHP, 44 байта

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

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

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


0

J, 19 байт

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

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

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

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

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

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



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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.