В математике одним из способов выяснить, какой тип данного отношения (линейный, квадратичный и т. Д.) Является вычисление различий. Для этого вы берете список значений y, для которых промежуток между соответствующими значениями x одинаков, и вычитаете каждое из числа над числом над ним, создавая список чисел на один короче предыдущего списка. Если результирующий список полностью состоит из одинаковых чисел, то отношение имеет разность 1 (оно является линейным). Если они не идентичны, то вы повторите процедуру в новом списке. Если они теперь идентичны, отношение имеет разность 2 (она квадратичная). Если они не идентичны, вы просто продолжаете этот процесс, пока они не будут идентичны. Например, если у вас есть список значений y [1,6,15,28,45,66] для постепенно увеличивающихся значений x:
First Differences:
1
6 1-6 =-5
15 6-15 =-9
28 15-28=-13
45 28-45=-17
66 45-66=-21
Second differences:
-5
-9 -5+9 =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4
As these results are identical, this relation has a difference of 2
Твое задание:
Напишите программу или функцию, которая, когда в качестве входных данных передается массив целых чисел, возвращает разницу отношения, описанного массивом, как описано выше.
Входные данные:
Массив целых чисел, который может иметь любую длину> 1.
Выход:
Целое число, представляющее разность отношений, описываемых входными данными.
Тестовые случаи:
Input => Output
[1,2,3,4,5,6,7,8,9,10] => 1
[1,4,9,16,25,36] => 2
[1,2,1] => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World" => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1] => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6
Подсчет очков:
Это код-гольф , на этом языке выигрывает наименьшая оценка в байтах на каждом языке. Самая низкая оценка в целом получает зеленую галочку.
источник
[1,2,1]
дать 2?[1,2,1] -> [1,-1] -> [-2]
[1,3,9,26,66,150,313,610]
->6
если хотитеОтветы:
Шелуха , 6 байт
Спасибо Лео за предоставленную мне возможность использовать его версию, которая работает для
[1,1,1,1,1,1]
Попробуйте онлайн!
объяснение
источник
[1,1,1,1]
, могу ли я использовать твой?JavaScript (ES6), 47 байт
Контрольные примеры
Показать фрагмент кода
источник
MATL , 8 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Это вычисляет последовательные различия итеративно, пока результат не будет нулем или пустым. На выходе получается требуемое количество итераций минус 1.
источник
R ,
5044 байтаПопробуйте онлайн!
Принимает
diff
изl
, устанавливает егоl
, и проверяет , если результат содержит значения , отличные от нуля. Если это произойдет, приращениеF
(инициализируется какFALSE
неявно), и возвращается ,F*1
чтобы преобразоватьFALSE
в0
в том случае, если всеl
идентично уже.источник
+F
трюк на 5 байтов . Аккуратный ответ, кстати!Mathematica, 49 байтов
спасибо @alephalpa за -6 байт и @hftf -1 байт
а вот еще один подход от @hftf
Mathematica, 49 байтов
источник
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
UnsameQ[1,2,1]
является ложным;!SameQ[1,2,1]
правда. Я не думаю, что ручной цикл также сохраняет символы:Length@NestWhileList[Differences,#,!SameQ@@#&]-1&
уже такой же длины, как у вас, после заменыUnsameQ
на!SameQ
.Желе , 7 байт
Попробуйте онлайн!
объяснение
источник
IÐĿE€ċ0
Джапт ,
107 байтПопробуйте онлайн!
Полагается на то, что результат гарантированно будет в пределах длины входного массива.
объяснение
В конце концов, это будет отображать массив
[1, 3, 9, 26, 66, 150, 313, 610]
в[true, true, true, true, true, true, false, false]
,который содержит
6
true
s.Предыдущая 10-байтовая версия
Попробуйте онлайн!
источник
Perl 6 , 37 байт
Попробуйте онлайн!
Объяснение: Функция принимает входные данные как один список. Затем он создает рекурсивную последовательность следующим образом: первый элемент является исходным списком (
$_
), следующие элементы возвращаются при{@(@$_ Z- .[1..*])}
вызове предыдущего элемента, и это повторяется до тех пор, пока условие не*.none
станет истинным, что происходит только тогда, когда список либо пусто или содержит только нули (или, технически, другие значения фальси). Затем мы берем список и вычитаем 2 из него, что приводит его сначала к числовому контексту (а списки в числовом контексте равны количеству их элементов) и, в конце, возвращает на 2 меньше, чем количество элементов в список.Странный блок
{@(@$_ Z- .[1..*])}
просто берет заданный список (.[]
- так называемый фрагмент дзен - индексирование с пустыми скобками дает весь список), упаковывает его с помощью оператора минус (Z-
) с тем же списком без первого элемента (.[1..*]
) и выводит его в список (@(...)
- нам это нужно, потому что zip возвращает только Seq, который в основном является односторонним списком, который может повторяться только один раз. Это то, что нам не нравится.) И это все.источник
@(.[] Z- .[1..*])
к[.[] Z-.[1..*]]
необходимо сохранить два байта.Java 8,
191 + 58 = 249198140 байт.Спасибо PunPun1000 за 51 байт.
Спасибо Невею за 58 байт.
Попробуйте онлайн!
Попробуйте онлайн (198 байт)
Итак, это мой первый пост здесь, в PPCG (и первый раз, когда я выполняю соревнования по коду). Любая конструктивная критика приветствуется и ценится. Я старался следовать правилам публикации, если что-то не так, не стесняйтесь указывать на это.
Украшенная версия:
источник
java.util.stream.IntStream k = java.util.Arrays.stream(a);
public
не нужно включать в число байтов. 2) Вы не должны принимать второй параметр, но его удаление может реально сохранить байты. 3) там можно убрать ненужные скобкиHaskell, 46 байтов
это просто рекурсы -
zipWith(-)l$last l
это список различийl
. иg
является функцией, которая отвечает на вопрос.источник
Котлин , 77 байт
первый пост, пытался редактировать последний ответ на kotlin 2 раза; D
принял участие в тестировании от @jrtapsell
TryItOnline
источник
APL (Dyalog Classic) ,
2217 байтовПопробуйте онлайн!
Спасибо @ngn за -5 байтов!
Как?
{ ... }
, функция1=≢∪⍵:0
, если каждый элемент равен в аргументе, вернуть0
1+∇2-/⍵
в противном случае вернуть 1 +n
различий (то естьn-1
, добавив к нему одно, вы получитеn
)источник
{1=≢∪⍵:0⋄1+∇2-/⍵}
Желе , 7 байт
Попробуйте онлайн!
объяснение
-1 байт благодаря Джонатану Аллану
источник
IÐĿEÐḟL
для семи (я вижу, Майлз также нашел семерку, используя рекурсию).05AB1E , 7 байтов
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6), 58 байт
источник
Python 2 , 65 байт
-7 байт благодаря Джонатану Аллану.
Попробуйте онлайн!
источник
c
в1
, уменьшающееся , а затем с помощьюprint-c
.f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
max(...,0)
чтобы пройти[1, 1, 1, 1, ...]
тестовые случаи.Дьялог АПЛ, 19 байт
Объяснение:
источник
≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
к , 21 байт
Это работает в k, но не в oK, потому что цикл while в oK выполняется перед проверкой условия (в отличие от первой проверки условия, а затем запуска кода). Таким образом, в ок,
1 1 1 1 1
пример не будет работать должным образом.Попробуй ОК онлайн!
Объяснение:
источник
~&/1_=':
->1<#?
Haskell ,
666160 байтПопробуйте онлайн!
Сохранено 5 байтов благодаря Christian Sievers
Сохранено 1 байт благодаря гордому haskeller
iterate(z(-))
вычисляет списки различий.or.z(/=)
проверяет, есть ли в этих списках неравные элементы.length.takeWhile
подсчитывает списки различий с неравными элементами.источник
or.z(/=)
z=(=<<tail).zipWith
, один байт корочеJava (OpenJDK 8) ,
9894 байтаПопробуйте онлайн!
источник
Japt , 7 байт
Тот же подход (но независимо получаемый), как у Джастина с другой реализацией.
Попробуй это
объяснение
Неявный ввод массива
U
.Карта над каждым элементом.
Возьмите каждую последовательную пару (
ä
) элементовU
и уменьшите ее на абсолютную разницу (a
).Переназначить этот массив на
U
.Count (
è
) количество подмассивов, которые возвращают true (т. Е. Не ноль) при уменьшении путем сложения.источник
TI-Basic, 19 байтов
По умолчанию переменные начинаются с нуля. Кроме того, никогда не думал, что буду использовать
IS>(
что-нибудь полезное.источник
C # (.NET Core) ,
7069 + 18 байт-1 байт благодаря Кевину Круйссену
Должно быть дано 0 при вызове для правильной работы. Также включено в число байтов:
Попробуйте онлайн!
Объяснение:
Итерационная версия 84 + 18 байт:
Попробуйте онлайн!
источник
(y,z)=>y-z
. Но хороший ответ, +1 от меня.Clojure, 62 байта
Хорошо
=
может принимать любое количество аргументов, и один аргумент идентичен «самому себе».(apply = [1 2 3])
исполняется как(= 1 2 3)
.источник
Pyth , 15 байт
Проверьте все контрольные примеры.
Как?
Объяснение № 1
источник
Wtl{Q=hZ=.+Q)Z
WP{Q=hZ=.+Q)Z
. Благодарность!Perl 5 , 83 + 1 (-a) = 84 байта
Попробуйте онлайн!
Введите в виде списка чисел, разделенных одним пробелом.
источник
Пайк , 11 байт
Попробуй это здесь!
источник
Pyth, 10 байт
Если мы можем индексировать от 1, мы можем сохранить байт, удалив ведущий
t
.Попробуйте онлайн
объяснение
источник
Котлин , 83 байта
украшенный
Тест
TryItOnline
источник
lang-kotlin
не простоkotlin
в подсказках.Swift 4 , 90 байт
Альтернативная реализация на основе замыкания:
контрольные примеры:
источник