Ваша задача сегодня состоит в том, чтобы написать программу или функцию, которая принимает массив целых чисел и подсчитывает, сколько раз, читая его слева направо, изменяется значение. Это проще показать на примере:[1 1 1 2 2 5 5 5 5 17 3] => [1 1 1 **2** 2 **5** 5 5 5 **17** **3**] => 4
Прецедент:
Input | Output
[] | 0
[0] | 0
[0 1] | 1
[0 0] | 0
[1 2 3 17] | 3
[1 1 1 2 2 3] | 2
[-3 3 3 -3 0] | 3
Это код-гольф , побеждает меньше байтов!
False
равен 0, печатается вместо него?2+False
и это ошибки, это не хорошо, но если я получу2
, это нормально.0
приемлемым?Ответы:
MATL , 2 байта
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Python 3 , 38 байт
Попробуйте онлайн!
источник
maximum recursion depth exceeded
.y>()
он оценивается как False , поэтому следующий кодand
не выполняется.Haskell , 33 байта
Попробуйте онлайн!
Бонус: довольно любопытная бессмысленная арифметическая версия (44 байта)
Попробуйте онлайн!
Учитывая вход
[1,1,4,3,3,3]
, мы сначала берем разницу смежных записей ([0,3,-1,0,0]
), тоabs
olute значения:[0,3,1,0,0]
. Принятие нуля к мощности каждого элемента дает первый раз[1,0,0,1,1]
, а второй раз инвертирует список:[0,1,1,0,0]
((1-)
здесь также будет работать вместо(0^)
). Наконец мы беремsum
список, чтобы получить2
.источник
Python 2 , 42 байта
Попробуйте онлайн!
источник
Brain-Flak , 50 байтов
Попробуйте онлайн!
Ничего не выводит для 0, что в мозге-флак эквивалентно. Если это не приемлемо, тогда добавьте это для
+4
байтов:({})
Объяснение:
источник
-0+1 = 1
Brain-Flak , 50 байтов
Попробуйте онлайн!
источник
Haskell , 35 байт
-8 байт благодаря H.PWiz.
Вне игры в гольф по рекурсивной версии . Хаскелл в значительной степени лучший в рекурсии, и я пропустил это. > _ <
Попробуйте онлайн!
Было бы здорово, если бы кто-нибудь понял, как использовать этот совет .
Альтернативное решение, 36 байт
Попробуйте онлайн!
источник
uncurry
функция,f
чтобы она заработала. Этоsum.map fromEnum.(zipWith(/=)=<<tail)
, вероятно, самое близкое к вам значение, но оно не будет работать[]
и составляет 37 байт ..Java (OpenJDK 8) , 65 байт
Не так коротко, как хотелось бы, но это просто Java для вас.
Проверьте, передав массив в виде списка через запятую.
Попробуйте онлайн!
источник
a->{int s=0,p=a[0];for(int n:a)s+=p==(p=n)?0:1;return s;}
(57 байт).a->{int s=0;for(int i:a)s+=a[0]!=(a[0]=i)?1:0;return s;}
Шелуха , 3 байта
Попробуйте онлайн!
объяснение
источник
Ом v2 , 3 байта
Попробуйте онлайн!
объяснение
источник
sign
встроенного!Wolfram Language (Mathematica) , 23
242629байтовПопробуйте онлайн!
Split[]
.небольшое объяснение:
Split
разделит массив на список списков (из одинаковых элементов), то есть превратится{1, 2, 2, 3, 1, 1}
в{{1}, {2, 2}, {3}, {1, 1}}
. Итак,Length@Split@#
количество последовательных сегментов.Max[*****-1, 0]
используется для обработки{}
ввода.источник
Max[Length@Split@#-1,0]&
Length@Split@#~Max~1-1&
Сетчатка ,
242116 байтБлагодаря @MartinEnder за -3 байта и замечению ошибки
-1 байт благодаря @tsh
-4 байта благодаря @Leo
Попробуйте онлайн!
источник
Символический Питон ,
120117 байтИспользуйте 3 байта, удалив явное приведение к целому (используя унарный
+
) для переменной счетчика - это означает, что если в массиве нет изменений, вывод будетFalse
вместо0
, но это разрешено мета .Попробуйте онлайн!
источник
Желе , 3 байта
Попробуйте онлайн!
Как это устроено
источник
K (ок) , 8 байт
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Интерпретируется справа налево:
источник
05AB1E , 3 байта
Попробуйте онлайн!
источник
Шелуха , 4 байта
Попробуйте онлайн!
источник
R , 24 байта
Попробуйте онлайн!
То же самое, что и ответ MATL, только что использовался,
sum(!!diff))
поскольку нетnnz
.источник
rle
будет короче, но нет,length(rle()$v)
использует слишком много символов и отключается на один.sum(rle()$v|1)
вместо вlength
любом случае. :)Cubix , 24 байта
Попробуйте онлайн
Обратите внимание, что Cubix использует 0, чтобы указать, что больше нет входов, поэтому 0 не может быть в списке.
объяснение
Развернутая:
Мы начинаем с
0
, помещая счетчик (инициализированный с помощью0
) и первый вход (I
) в стек.Затем мы входим в петлю. На каждой итерации цикла мы получаем следующий вход с
I
. Если это 0, у нас закончились входы, поэтому мы вращаем счетчик в top (p
),O
utput и exit (@
).В противном случае мы берем разницу двух верхних элементов. Если он ненулевой, мы вращаем счетчик на вершину, увеличиваем его и поворачиваем обратно на дно с помощью
p)q
. Затем мы выводим разницу,;
прежде чем перейти к следующей итерации.Все персонажи, не упомянутые здесь, являются просто потоком управления. В программах Cubix их много.
источник
0
на a(
, но это не сработает на пустом вводе.Brain-Flak , 50 байтов
Попробуйте онлайн!
Так как каждый публикует свои 50-байтовые решения, здесь мое (у меня есть 48- байтовое решение, но это была простая модификация DjMcMayhem, поэтому я чувствовал, что стоит опубликовать)
объяснение
Этот ответ широко использует отмену значения.
Без гольфа это выглядит как
Здесь мы вычисляем дельту, пока в стеке не останется один элемент, каждый раз, когда мы накапливаем одно значение из внутреннего цикла, если дельта не равна нулю.
Это довольно простой способ сделать это.
Чтобы сделать этот гольф, мы начинаем отмену стоимости. Первый и тот, который должен быть очевиден для любого закаленного игрока в мозги, - это высота стека. Это хорошо известный факт, что
такой же как
Когда значения изменяются одним, то же самое сохраняется. Это дает нам
Вы можете заметить, что это даже не спасло нас от байтов, но не волнуйтесь, это станет более полезным, когда мы продолжим.
Мы можем выполнить другое сокращение, если вы видите заявление
вы можете уменьшить его до
Это работает, потому что если мы войдем в цикл
[(...)]
и{}
отменим, а если нет, то значение[(...)]
уже было нулевым, и его не нужно отменять. Поскольку в нашем коде есть этот шаблон, мы можем уменьшить его.Это сэкономило нам 2 байта, но также поставило две точки рядом друг с другом. Они могут быть объединены, чтобы спасти нас еще 2.
И это наш код.
источник
Perl 6 , 18 байт
Проверь это
Expanded:
источник
Gaia , 2 байта
Попробуйте онлайн!
Это злоупотребляет ошибкой (или особенностью?) Gaia, которая заключается в том, что кодирование длин серий не учитывает последний запуск элементов. Обратите внимание, что я дважды проверил, он работает для всех тестовых случаев.
ė
- Выполнить кодирование длины (с недостатком, описанным выше).l
- длинаисточник
JavaScript (ES6), 35 байт
источник
f=([a,...b])=>1/a?!!(a-b[0])+f(b):0
Pyth, 5 байт
Тестирование.
Объяснение:
источник
APL (Дьялог) , 8 байт
Попробуйте онлайн!
Как?
⊃,⊢
- список с первым значением, повторенным для случая одного элемента2≠/
- список изменений, не равный для каждых 2 элементов+/
- суммаисточник
Perl 5 , 37 + 2 (
-ap
) = 39 байтПопробуйте онлайн!
источник
J, 10 байт
Инфиксы длины 2 ... они неравны?
2 ~:/\ ]
Подведите итоговый список
0
s и1
s:+/
Попробуйте онлайн!
источник
[:+/0=-/\
должно работать, я думаю, 9 байтов.Рубин , 31 байт
Попробуйте онлайн!
источник
.drop(1)
тебя можно сделать[1..-1]
drop
возвращает Enumerator, а не Array, так что это не работает.size
Array?C (gcc 5.4.0), 61 байт
Попробуйте онлайн!
f
является функцией, принимающей длину массива и указатель на первый элемент массива, и возвращающей количество изменений в массиве;Это представление использует неопределенное поведение (
*p++!=*p
p используется дважды в выражении, в котором оно было изменено), которое работает на моем компьютере (gcc 5.4.0) и на TIO, но может не работать на других реализациях или версиях.Объяснение:
источник
05AB1E , 3 байта
Попробуйте онлайн!
Альтернатива ответу Эрика.
источник