Я голісний масив?


18

Визначення та правила

Golfy масив являє собою масив цілих чисел, де кожен елемент є вище , ніж або дорівнює середнім арифметичним все попередніми елементами. Ваше завдання - визначити, чи є масив додатних цілих чисел, поданих як вхідний, чи ні.

Випробування та приклад

Наприклад такий масив:

[1, 4, 3, 8, 6]

Це масивий масив, оскільки кожен доданок вище середнього арифметичного тих, що передували йому. Давайте попрацюємо покроково:

Кількість -> Попередні елементи -> Середня -> Дотримується правила?

1 -> [] -> 0,0 -> 1 ≥ 0,0 (вірно)
4 -> [1] -> 1.0 -> 4 ≥ 1.0 (вірно)
3 -> [1, 4] -> 2,5 -> 3 ≥ 2,5 (Вірно)
8 -> [1, 4, 3] -> 2. (6) -> 8 ≥ 2. (6) (Правда)
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, я мав би подумати про речі, які можна було б використати першими. Я дуже радий, що вам це здається цікавим (Btw, будь ласка, напишіть мені тут і дайте посилання, якщо ви його репостуєте).
Містер 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) для масивів golfy, просто виходи з кодом виходу 0 для масивів, що не входять в гольф. ovs та Jonathan Frech зберегли 3 байти.

Python 2 , 44 байти

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

Спробуйте в Інтернеті!

Більш традиційний варіант, який повертається Trueдля масивів golfy 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-байт (альтернатива) ÆmƤµ⁼Ṣ
cairdcoinheringaahing

@ Mr.Xcoder Golfed!
Денніс

Вау, це геніально :-)
Містер Xcoder

5

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

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

Код також працює на негативних значеннях, таких як [-3, -2]. Повертає falseдля масиву golfy, 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 (Діалог) , 10 байт

Це анонімна негласна префіксальна функція (називається монадичним поїздом в APL-термінах).

∧/⊢≥+⍳∘≢

Спробуйте всі тестові випадки на TIO!

Є це

∧/ все правда, що

 елементи

 більше або дорівнює

+\ сукупні суми

÷ ділиться на

   цілі числа 1 наскрізь

   то

   кількість елементів

?


APL має символ для "??"
користувач2390246

1
@ user2390246 пов'язує речі однаково "the" пов'язує разом у "рахують котів". Це дійсно називається Compose .
Адам


3

05AB1E , 5 байт

ηÅA÷W

Спробуйте в Інтернеті!

Широка допомога Денніса та Аднана отримала цю зменшену версію. Також було виправлено помилку, щоб зробити це можливим, ще раз дякую, хлопці. Я мало беру на себе відповідальність за цю відповідь.


05AB1E , 10 байт

ηεÅA}ü.S_P

Спробуйте в Інтернеті!


Довго, тому що DgsO/це еквівалент "середній" у 05AB1E.

Мабуть, ÅAце середнє арифметичне.


Щоб обчислити засоби, я б використав +\÷J(розділити сукупну суму на індекси) в Jelly. Хіба це не так просто в 05AB1E? Edit: Nevermind.
Денніс

@Dennis ах, сукупна сума в 05AB1E - ü+це насправді немає ділення за індексами, окрім gяк отримати довжину масиву, Lнатиснути 1,2,...,nі розділити, щоб отримати середнє значення, яке, по суті, становить 5 байт.
Magic Octopus Urn

.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 до *=результату булевого порівняння з нашим $oвисловом. Boolean є поточне значення $_є -gля більшої, ніж чи- eякост в колишніх умовах $a[0..$i++]підсумовуються ( -join'+'|iex) , розділене на скільки членів ми вже бачили $i. Отже, якщо будь-який крок на цьому шляху є помилковим, то $oотримаємо помножений на 0. Інакше воно залишиться1 протягом усього часу.

Потім просто розміщуємо $oна трубопровід, і вихід неявний. 1для триті та 0фальси.



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 для помилкових та 1 для істинних.

3 байти довше, ніж ядро хризалесових відповідей . Але загалом на кілька байт коротше, оскільки мій варіант не потребує жодних usingтверджень.


2

Cubix , 35 байт

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

Спробуйте в Інтернеті!

Не найефективніше використання простору (6 кодів без коду) Не дає виводу для масиву golfy, 1 для not golfy.

Розгортається на наступний куб:

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

Пояснення найближче, але воно в основному є портом чимось як відповідь Луїса Мендо MATL або відповідь Денніса Джулії .

Дивіться, як це працює!


2

Матлаб і Октав, 41 36 байт

5 байт збережено THX для Луїса Мендо

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

Спробуйте в Інтернеті!


@LuisMendo Це порушило б його, якщо будь-який елемент aдорівнює нулю. Але це корисна хитрість, проте в подібних ситуаціях потрібно пам’ятати про це.
Leander Moesinger

Читання важко! Дякую!
Leander Moesinger

Мені трапляється весь час :-)
Луїс Мендо

2

SQL (MySQL), 68 байт

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

Спробуйте в Інтернеті!

Повертає 1 для масивів golfy, а 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.
  • Збережено два байти завдяки містеру Xcoder за допомогою ланцюгового завдання S=k=0.
  • Збережено два байти, використовуючи orбулеве значення порівняння як значення kприросту.
  • Збережено два байти завдяки ovs ; підвищення a NameErrorза допомогою невизначеної змінної замість a 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

Пояснення:

Fairly simple with the avgs built-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


1

R, 38 34 bytes

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

Try it online!


very nice. Dunno why there wasn't an R answer before...
Giuseppe

You were all saving an easy one for me.
ngm

instead of defining y in the function arguments, using cumsum(x) directly is 4 bytes shorter. It's a shame cummean doesn't exist in base R.
Giuseppe

1

Add++, 54 bytes

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

Try it online!

Unoriginal version, 30 bytes

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

Try it online!

Both output 1 for golfy arrays and 0 otherwise

How they work

The first version was created by me, without checking any other solutions. The second was inspired by Dennis' comment, so I'm less happy with it.

The first version

Here, we define our main function f that computes the golfiness of our input array, A. First, we need to yield the suffixes of A, which is done by first generating the range B:=[1,...|A|], where |A| denotes the length of A. This is done with the code dbLR$, which leaves [B,A] as the stack. We then iterate the dyadic function g over these two lists. Being dyadic, the function binds its left argument as A for each iterated element. It then iterates over the range B, which each element from B being the right argument provided to g. g is defined as

D,g,@@#,BFB

which is a dyadic function (i.e. takes 2 arguments), and pushes its arguments to the stack in reversed order (#) before execution. BF then flattens the two arguments. We'll assume that the arguments are A and ex. This leaves the stack as [...A,e], where ... represents an array splat. Finally, B takes the first e elements of A and returns a list containing those elements.

Note : The function names g and k aren't chosen randomly. If the commands given to an operator (such as ) doesn't currently have a function (which g and k don't), then the named functions are searched for a matching function. This saves 2 bytes, as normally the function would have to wrapped in {...} to be recognised as a user-defined function. At the time of writing, the currently unused single byte commands are I, K, U, Y, Z, g, k, l, u and w.

When g is applied over the elements of a range x, this returns a list of prefixes for A. We then map our second helper function k over each of these prefixes. k is defined as

D,k,@,¦+AbL/

which is the standard implementation of the arithmetic mean. ¦+ calculates the sum of the argument, AbL calculates its length, then / divides the sum by the length. This calculates the arithmetic mean of each prefix, yielding a new array, C.

Unfortunately, C contains the mean of A as its final element, and does not include the mean of the empty list, 0. Therefore, we would have to remove the final element, and prepend a 0, but popping can be skipped, saving two bytes, for reasons explained in a second. Instead, we push [0] underneath C with 0b]$, then concatenate the two arrays forming a new array, C+.

Now, we need to check each element as being less than its corresponding element in A. We push A once again and zip the two arrays together with ABcB]. This is the reason we don't need to pop the final element: Bc is implemented with Python's zip function, which truncates the longer arrays to fit the length of the shortest array. Here, this removes the final element of C+ when creating the pairs.

Finally, we starmap pA,qC+;p<q¬(pq) over each pair p,q to obtain an array of all 0s if the array is golfy, and array containing at least a single 1 if otherwise. We then check that all elements are falsey i.e. are equal to 0 with ª! and return that value.

The second version

This takes advantage of Dennis' approach to remove 24 bytes, by eliminating the helper functions. Given our input array of A, we first compute the cumulative sums with ¬+, i.e the array created from [A0,A0+A1,A0+A1+A2,...,A0+...+Ai]. We then generate Jelly's equivalent of J (indicies), by calculating the range B:=[1...|A|] where |A| once again means the length of the array.

Next, we divide each element in A by the corresponding index in B with BcB/ and prepend 0 with @0@B]. This results in a new array, C+, defined as

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

The final part is identical to the first version: we push and zip A with C+, then starmap inequality over each pair before asserting that all elements in the resulting array were falsy.


0

Pyth, 11 10 bytes

-1 byte thanks to Mr. Xcoder

.A.egb.O<Q

Try it online!


7 bytes: SI.OM._ (port of cairdcoinheringaahing's solution from Jelly, by Erik the Outgolfer), or 10 bytes using your approach: .A.egb.O<Q
Mr. Xcoder

Post the port as yourself, it's a totally different approach!
Dave

0

Java (OpenJDK 8), 96 bytes

I know it's not a good golfing language, but I still gave it a go!

Input array as first argument of comma separated ints to test.

Returns 1 for true, 0 for 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;}

Try it online!


0

Java 7, 100 bytes

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

Try it online

Returns 0 for ungolfy and 1 for golfy arrays. Slightly longer than java 8 answer.


0

PHP, 44 bytes

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

takes input from command line arguments, exits with 0 (ok) for a golfy array, with 1 else.

Run with -nr or try it online.


0

J, 19 bytes

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

+/\ % #\ averages of the prefixes: #\ produces 1..n

}:0, add 0 to the beginning and remove the last

[>: is the original list element by element >= to the shifted list of averages?

*/ are all the elements greater, ie, the previous list is all 1s?

Try it online!



0

Japt, 10 bytes

Came up with two 10 byte solutions, can't seem to improve on that.

eȨU¯Y x÷Y

Try it


Explanation

               :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

Alternative

eÈ*°Y¨(T±X

Try it

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