В для ухабистой езды


18

Ваша задача - написать компьютерную программу или функцию, которая берет список натуральных чисел по крайней мере длиной 2 и определяет, являются ли они «зигзагами». Последовательность является зигзагообразной в том и только в том случае, если числа чередуются, будучи больше и меньше числа, предшествующего им. Например, и являются зигзагами, но и нет.[ 4 , 2 , 3 , 0 , 1 ] [ 1 , 2 , 0 , 0 , 3 , 1 ] [ 1 , 2 , 3 , 1 ][1,2,0,3,2][4,2,3,0,1][1,2,0,0,3,1][1,2,3,1]

Для вашего решения вы должны вывести одно из двух разных последовательных значений для каждой возможности (зигзаг, а не зигзаг).

Кодовые точки вашей программы или функции также должны быть зигзагообразными. Это означает, что когда вы берете последовательность кодов, это должен быть зигзаг.

Это поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.


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

5
@ngm Я не согласен. Введение бонусов / штрафов заставит пользователей предлагать несколько возможных ответов (например, короткий один + штраф против длинного + без штрафа), что замедляет процесс ответа. Кроме того, сумма назначенного штрафа будет совершенно произвольной, то есть процесс подсчета очков не будет такой целью.
JungHwan Мин

2
Должны ли мы взять кодовые точки Unicode или кодовые точки кодировки, которую мы используем?
Деннис

1
@Dennis Кодовые точки используемой вами кодировки.
Пшеничный волшебник

2
@ Денис, конечно, технически это правда. Тем не менее, мы уже установили, что присуждение бонусов за Code-Golf не так уж и идеально, потому что они отвлекают от основной задачи. Штраф в этом случае будет отрицательным бонусом.
JungHwan Мин

Ответы:


7

Желе , 5 байт

IṠIỊẸ

Возвращает (зигзаг) или 1 (не зигзаг).01

Кодовые точки на кодовой странице желе .[73,205,73,176,174]

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

Как это устроено

IṠIỊẸ  Main link. Argument: A (array)

I      Increments; compute the forward differences of A.
 Ṡ     Take their signs.
       A is zigzag iff the signs are alternating.
  I    Take the increments again.
       Alternating signs result in an increment of -2 or 2.
       Non-alternating signs result in an increment of -1, 0, or 1.
   Ị   Insignificant; map each increment j to (|j| ≤ 1).
    Ẹ  Any; return 0 if all results are 0, 1 in any other case.

4

Haskell , 87 байт

f(a:b:c:d)|(>)a b,b<c=f$b:c:d |(<)a b,b>c=f$b:c:d |1>0=1>12
f[a ] =1<12
f(a:b:_)= a/= b

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

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


4

MATL , 9 байт

dt?ZSd]pA

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

Моя первая в мире программа MATL! Предпоследний pбыл добавлен для требования зигзага.

Объяснение:

d    %take the difference between successive elements of input
t    %duplicate that
?    %if that is all non-zero
  ZS %take the sign of those differences (so input is all `-1`s and `1`s now)
  d  %take the difference of that (so if there are successive `1`s or `-1`s, this will have a 0)
]    %end-if
p    %take the product of topmost stack vector (will be 0 if either the original difference or 
     % the difference-of-signs contained a 0)
A    %convert positive products to 1 (since OP specifies "you should output one of two different consistent values for each possibility ")

Спасибо! Да, как я уже упоминал в ответе, я добавил его только для требования зигзага (поскольку сам код должен идти зигзагообразно). ]по- видимому , живет между прописными буквами и строчными буквами, так , dчтобы ]и ]в Aбы оба были декремента, что не допускается. Таким образом, в pосновном существует увеличение кода между двумя.
sundar - Восстановить Монику

1
О, я полностью забыл об этом требовании. Это делает ответ более впечатляющим!
Луис Мендо

4

Python 2 , 225 223 161 139 байт

-2 байта благодаря Якобу
-62 байта благодаря Деннису

e={eval }.pop()
p ="i"+"n"+"p"+"u"+"t ( "
s=e(p +")")
e(p +"` a"+"l"+"l([(x<y>z)+(x>y<z)f"+"o"+"r x,y,z i"+"n zip(s,s [1: ],s [2: ])])` )")

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

Кредиты на ухабистый алгоритм идет к этому ответу

input, print, exec, defИ lambdaне неровные , так что я получил только evalлевый, который хранится на e
Существует 2 основных способа обойти ограничение, размещение "+"или между не-ухабистымом паром, я выбрал для первого ( короче для каждого использования, но это потребовало бы replace(' ','')большего количества байтов)
Поскольку printон не является ухабистым, я не могу использовать его напрямую, и поскольку он не является функцией, я не могу использовать его внутри eval(), поэтому мне пришлось использовать его input(result)для вывода результата


Ницца. Вы можете заменить ' ' * 0на ' ' [1: ].
Якоб

Вы можете использовать, input(text)чтобы написать в STDOUT.
Деннис

4

К (нгн / к) , 23 байта

{*/ 0 >1_ *':1_ -': x }

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


Зачем нужны пробелы?
Захари

@ Zacharý сам код k не был бы ухабистым без них
ngn

Что ты имеешь в виду? Это просто нгн / к, который нуждается в
пробелах

3
@ Zacharý Эта проблема с ограниченным исходным кодом , и ограничение заключается в том, что код должен быть зигзагообразным.
Эрик Outgolfer

Ой, забыл об этом тоже.
Захари

3

Ом v2 , 5 байт

δyδ½Å

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

[131,121,131,16,165]

Как это устроено

δyδ½Å - Полная программа / Блок с одним аргументом.
δy - Знаки дельт ввода 
  δ - различия знаков. Результаты в последовательности 2 или -2 для
        неровные массивы, так как знаки чередуются, давая либо -1-1 = -2, либо 1 - (- 1) = 2.
    Å - Проверьте, дают ли все элементы достоверные результаты, когда ...
   ½ - вдвое.

2

Japt -! , 16 14 байтов

Ну, это не красиво, но я просто счастлив, что это работает!

Выходы trueдля зигзага или falseесли нет.

ä'- m'g ä'a èÍ

Попытайся

Кодовые точки [228,39,45,32,109,39,103,32,228,39,97,32,232,205]и включены в качестве теста по ссылке выше.


объяснение

                   :Implicit input of array
ä'-                :Consecutive differences
    m'g            :Map signs
        ä'a        :Consecutive absolute differences
             Í     :Subtract each from 2
            è      :Count the truthy (non-zero) elements
                   :Implicitly negate and output resulting boolean.

@KamilDrakari, как правило, вы были бы правы, но, к сожалению, они необходимы для выполнения требований к ограниченным источникам задачи. В противном случае это может быть 10 байтов .
Лохматый

О, я не видел, что это был ограниченный источник. Мой плохой
Камил Дракари

@KamilDrakari, не волнуйся; похоже, ты был не единственным.
Лохматый


1

Perl 6 , 61 байт

{ [*] ($_[{1…*} ] Z<@$_)Z+^ ($_[{1…*} ] Z>@$_[{2…*} ])}

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

Кодовые точки:

(123 32 91 42 93 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 60 64 36 95 41 90 43 94 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 62 64 36 95 91 123 50 8230 42 125 32 93 41 125)

И да, это символы Юникода. Это более или менее мое первоначальное решение с несколькими пробелами и фигурными скобками.


1

05AB1E , 10 байтов

¥DÄ/¥(Ä2QP

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

объяснение

¥           # calculate deltas of input
 DÄ/        # divide each by its absolute value
    ¥       # calculate deltas
     (      # negate each
      Ä     # absolute value of each
       2Q   # equals 2
         P  # product

Кодовые точки: [165, 68, 196, 47, 165, 40, 196, 50, 81, 80]


1

JavaScript (ES6), 62 60 байт

a=> a.map(n=> e&=!~(p | q)| q <(q=p)^ p <(p=n), e=p=q=~ 0)|e

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

Кодовые точки:

61 3d 3e 20 61 2e 6d 61 70 28 6e 3d 3e 20 65 26
3d 21 7e 28 70 20 7c 20 71 29 7c 20 71 20 3c 28
71 3d 70 29 5e 20 70 20 3c 28 70 3d 6e 29 2c 20
65 3d 70 3d 71 3d 7e 20 30 29 7c

2
К счастью, mapэто зигзаг!
Нил

0

05AB1E , 8 байтов

¥.±¥Ä2/P

Возвращает 1.0для зигзагообразных и 0.0не зигзагообразных последовательностей.

Кодовые точки находятся [164,108,176,164,195,2,109,25]на кодовой странице 05AB1E .

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

Объяснение:

¥           # Take the deltas of the (implicit) input-list
            #  i.e. [1,2,0,3,2,3] → [1,-2,3,-1,1]
          # Calculate the sign for each of them (-1 if a<0; 0 if 0; 1 if a>0)
            #  i.e. [1,-2,3,-1,1] → [1,-1,1,-1,1]
   ¥        # Calculate the deltas of those
            #  i.e. [1,-1,1,-1,1] → [-2,2,-2,2]
    Ä       # Take the absolute value of each
            #  i.e. [-2,2,-2,2] → [2,2,2,2]
     2/     # Divide them by 2
            #  i.e. [2,2,2,2] → [1.0,1.0,1.0,1.0]
            # (`;` {halve} would have been shorter, but doesn't comply to the challenge)
       P    # Take the product of the list resulting in either 1.0 or 0.0
            #  i.e. [1.0,1.0,1.0,1.0] → 1.0
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.