Масив викликів №1: чергування масивів


41

Чергуючі масиви

Черговий масив - це список будь-якої довжини, в якому чергуються два (не обов'язково різні) значення. Тобто, усі парно-індексовані елементи рівні, а всі непарноіндексовані елементи рівні.

Ваше завдання - написати програму або функцію, яка, коли їй надається список натуральних чисел, виводить / повертає, truthyякщо вона чергується та falsyінше.

Це , тому найкоротший код (у байтах) виграє!

Випадки кромки:

[]      ->  True
[1]     ->  True
[1,1]   ->  True
[1,2,1] ->  True

Інші випробування:

[1,2,1,2]      -> True
[3,4,3]        -> True
[10,5,10,5,10] -> True
[10,11]        -> True
[9,9,9,9,9]    -> True

[5,4,3,5,4,3]   -> False
[3,2,1,2,1,2]   -> False
[1,2,1,2,1,1,2] -> False
[2,2,3,3]       -> False
[2,3,3,2]       -> False

Приклад

Ось приклад, на який можна протестувати своє рішення, написане на Python 3 (не в гольф):

def is_alternating(array):
    for i in range(len(array)):
        if array[i] != array[i%2]:
            return False
    return True

Які можливі значення елементів масиву?
— Роберт Хікман

@RobertHickman - список натуральних чисел у межах стандартного розміру
— інти

о, я бачу це в питанні зараз. На жаль і спасибі
— Роберт Хікман

Відповіді:


27

Желе , 4 байти

ḣ2ṁ⁼

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

Як це працює

ḣ2ṁ⁼  Main link. Argument: A (array)

ḣ2    Head 2; truncate A after its second element. If A has two or less elements,
      this returns A itself.
  ṁ   Mold; cyclically repeat the elements of the previous result to create an
      array that has the same shape/length as A.
   ⁼  Test the result for equality with A.

7
Блін. І зміна 2на інші числа негайно узагальнює завдання!
— Грег Мартін

3 байти , але Ɲне існувало під час опублікування виклику.
— caird coinheringaahing

14

мозковий ебать, 34 байти

,>,>+>,
[
  [<+<<->>>-]
  +<[-<<]
  >[>]
  ,
]
<.

Приймає масив як значення байтів у рядку та виводить \x00для false та \x01for true.

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

Це підтримує структуру

a b 1 c

на стрічці, де cпоточний символ, bє попередній символ, і aце попередній попередній символ, доки масив чергується. Якщо виявлено невідповідність, вказівник переміщується вліво таким чином, що a, bі 1прапор усіх стає нульовим, і ця ситуація триватиме до тих пір, поки весь вхід не буде використаний.


13

R, 24 23 байти

all((a=scan())==a[1:2])

Читає вектор у STDIN, бере перші два елементи цього вектора і перевіряє рівність. Якщо довжини a[1:2]та не збігаються, R буде проходити цикл, a[1:2]щоб відповідати довжині а. Це дасть попередження про це, але це спрацює.

Дивно, але це працює навіть для порожнього вводу, не впевнений, чому, але я пройдуся з ним.

Збережено 1 байт завдяки @MickyT


ви можете зберегти собі байт за допомогоюall((a=scan())==a[1:2])
— MickyT

Як ви вводите дані у вигляді векторних, списку чи просто одиничних чисел? Я спробував ввести одиничні номери на консолі, але отримую попередження: "Попереджувальне повідомлення: У scan () == a [1: 2]: більша довжина об'єкта не кратна довжині об'єкта". Хоча це працює.
— скан

Вводячи дійсно одні цифри. Якщо вхідна довжина буде непарною, воно видасть попередження, але воно все одно дасть правильний вихід.
— JAD

10

MATL , 7 6 байт

2YCs&=

Для змінних масивів це виводить не порожню матрицю з них, яка є правдою. Для масивів, що не чергуються, матриця містить щонайменше один нуль і, таким чином, є хибною (див. Тут ).

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

Пояснення

Візьмемо для [1 2 1 2]прикладу введення.

2YC   % Implicit input. Build matrix whose columns are overlapping blocks of 
      % length 2. If input has size less than 2 this gives an empty array
      % STACK: [1 2 1;
                2 1 2]
s     % Sum of each column. For an empty array this gives 0
      % STACK: [3 3 3]
&=    % Matrix of all pairwise equality comparisons. Implicit display
      % STACK: [1 1 1;
                1 1 1;
                1 1 1]

2
Гарний алгоритм! Це зробило бідну відповідь желе.
— Денніс

@Dennis Дякую! Частково це надихнуло ваш підхід «Желі»
— Луїс Мендо

9

JavaScript (ES6), 27 байт

a=>!a.some((v,i)=>a[i&1]-v)

Тестові справи


8

Сітківка , 25 байт

M`\b(\d+),\d+,(?!\1\b)
^0

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

Замість того, щоб вводити вхід із змінними значеннями (що призводить до деяких дратівливих крайових ефектів у регулярному вираженні), я підбираю вхідні дані, які не відповідають дійсності, а потім заперечую результат.

Перевага порівняння невірного вводу полягає в тому, що це властивість можна перевірити локально, і йому не потрібно спеціально ставитися до порожнього або короткого вводу: будь-який вхід недійсний, якщо він містить два різних значення, які знаходяться на одній позиції.

Отже, перший етап підраховує кількість збігів, за \b(\d+),\d+,(?!\1\b)якими збігається і фіксує одне значення, потім відповідає наступному значенню, а потім стверджує, що третє значення в послідовності відрізняється. Це дає нуль для дійсних даних та щось позитивне для недійсних значень.

Другий етап просто підраховує кількість матчів ^0, 1якщо перший етап повернувся 0і в 1іншому випадку.


7

Математика, 29 байт

#=={}||Equal@@(Most@#+Rest@#)&

Порт алгоритму MATL Луїса Мендо. Безіменна функція: перелік номерів (або навіть більш загальних об'єктів) та повернення Trueабо False. Тестує, чи всі суми послідовних елементів рівні. На жаль, Mostі Restзадихається у порожньому списку, так що це потрібно перевірити окремо.

Математика, 33 байти

Differences[#,1,2]~MatchQ~{0...}&

Безіменна функція: перелік номерів (або навіть більш загальних об'єктів) та повернення Trueабо False. Функція Differences[#,1,2]приймає різниці, не з послідовних пар цілих чисел, а пар цілих чисел на відстані два один від одного. Тоді ми просто перевіряємо, чи є в отриманому списку нічого іншого, крім нулів.

Як бонус, за ще один байт (змінити 2на #2) ми отримуємо функцію, яка вводить список цілих чисел та інше додатне ціле число #2, і перевіряє, чи введений список є результатом #2періодичного переплетення постійних послідовностей між собою. Наприклад,

Differences[#,1,#2]~MatchQ~{0...}&[{1,2,3,4,5,1,2,3,4,5,1,2},5]

оцінює до True.


7

Haskell, 27 26 байт

and.(zipWith(==)=<<drop 2)

Це оцінює анонімну функцію, яка вирішує завдання. Ідея полягає в тому, щоб випустити перші два числа зі списку, пов'язувати їх з оригінальним списком, використовуючи рівність, і перевірити, чи містить результат лише Trues. Спробуйте в Інтернеті!

Дякую німі за 1 байт!



1
Приємно. and.(zipWith(==)=<<drop 2)зберігає байт.
— nimi

7

Сітківка ,39 32 28 байт

^(\d*)((,\d+)(,\1(\3|$))*)?$

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

Збережено 7 байт завдяки Мартіну ! Збережено ще 3 завдяки Кобі ! І до Kritixi для ідеї ще 1.

Ми необов'язково співставляємо число, яке займає весь вхід, будь-яку пару чисел або будь-яку пару чисел, за якими слідує одна і та ж пара, будь-яке число разів, і необов'язково, не включаючи друге число в самому кінці. Не вдалося зберегти 2 байти, якщо вхід був уніарний.


1
Ще одна ^(\d+)?(.\d+)?(.\1\2)*(.\1)?$байтна альтернатива. Це не відповідає ,1,,1.
— Kritixi Lithos

1
@Kobi Чудова ідея, дякую! Я використав частину відповіді Kritixi (додавання коми до другої групи захоплення), щоб зберегти ще 1!
— FryAmTheEggman

6

Pyth, 9 байт

q<*<Q2lQl

Пояснення

q<*<Q2lQlQQ   Implicitly add enough Qs to make the code run

   <Q2        Take the first two elements of the input
  *   lQ      Repeat those len(input) times
 <      lQ    Take the first len(input) elements
q         Q   Check if those are equal to the input

ви можете оновити код у поясненні (це інший атм)
— FlipTack

@ Flp.Tkc Pyth неявно додає Qs до коду. Я додав їх у пояснення, щоб зрозуміти, що відбувається, але насправді вони не в коді.
— Мнемонічний


5

APL, 7 байт

⊢≡⍴⍴2⍴⊢

Пояснення:

  • 2⍴⊢: переформатуйте вхідний масив на 2
  • ⍴⍴: переформатуйте результат на оригінальний розмір вводу, повторювані елементи
  • ⊢≡: подивіться, чи результат цього дорівнює початковому вводу

Тестові приклади:

      true←(1 2 1 2)(10 5 10 5 10)(10 11)(9 9 9 9 9)
      false←(5 4 3 5 4 3)(3 2 1 2 1 2)(1 2 1 2 1 1 2)(2 2 3 3)(2 3 3 2)
      ( ⊢≡⍴⍴2⍴⊢ ) ¨ true
1 1 1 1
      ( ⊢≡⍴⍴2⍴⊢ ) ¨ false
0 0 0 0 0

5

Java 8, 63 байти

i->{int r=0,x=1;for(;++x<i.length;)r|=i[x]-i[x-2];return r==0;}

Це лямбда-вираз для a Predicate< int[ ] >

Пояснення: ініціалізуйте результат до 0. Для кожного елемента Biteise АБО результат з різницею між поточним елементом та елементом 2 індексів раніше. повернути, trueякщо результат дорівнює 0. Інакше повернутиfalse


5

Perl 6 ,  49 43  42 байт

{!grep {![==] @_},roundrobin |.rotor: 2,:partial}

Спробуй це

{!.grep: ->\a,\b=$_[1] {sum .[0,1]Z!==a,b}}

Спробуй це

{!.grep: ->\a,\b=.[1] {sum .[0,1]Z!==a,b}}

Спробуй це

Розширено:

{
  !              # invert

  .grep:         # find any mismatches

  ->
    \a,
    \b = .[1]   # optional second parameter with default of second value from input
  {
    sum          # count up the values that don't match

    .[ 0, 1 ]    # the first two values from the input
    Z[![==]]     # zip not equal
    a, b         # the current two values under test.
  }
}

$_[1]може бути на один байт коротше .[1]. Тіло внутрішньої лямбда може бути на один байт коротше {.[0]!=a||.[1]!=b}.
— smls

1
@smls Я поняття не маю, чому я не бачив .[1]. Також, !=здається, не працює, якщо за ним не пробіл. Я думаю, що щось подібне $_!=3розбирається так, ніби це було написано як!( $_ = 3 )
— Бред Гілберт b2gills

Ага. Схоже, це помилка Ракудо .
— smls


3

J, 8 байт

-:$$2&{.

Пояснення

-:$$2&{.  input: (y)
    2&{.  the first two elements of y
   $      shaped like
  $       the shape of y
-:        and check if they match

Тестові справи

   f =: -:$$2&{.
   ]true =: '' ; 1 ; 1 1 ; 1 2 1 ; 1 2 1 2 ; 10 5 10 5 10 ; 10 11 ; 9 9 9 9 9
++-+---+-----+-------+------------+-----+---------+
||1|1 1|1 2 1|1 2 1 2|10 5 10 5 10|10 11|9 9 9 9 9|
++-+---+-----+-------+------------+-----+---------+
   f each true
+-+-+-+-+-+-+-+-+
|1|1|1|1|1|1|1|1|
+-+-+-+-+-+-+-+-+
   ]false =: 5 4 3 5 4 3 ; 3 2 1 2 1 2 ; 1 2 1 2 1 1 2 ; 2 2 3 3 ; 2 3 3 2
+-----------+-----------+-------------+-------+-------+
|5 4 3 5 4 3|3 2 1 2 1 2|1 2 1 2 1 1 2|2 2 3 3|2 3 3 2|
+-----------+-----------+-------------+-------+-------+
   f each false
+-+-+-+-+-+
|0|0|0|0|0|
+-+-+-+-+-+

Ви повинні мати можливість замінити {.Take на $Shape.
— Adám

3

Haskell , 33 32 байти

f(a:x@(_:b:_))=a==b&&f x
f a=1<3

Спробуйте в Інтернеті! або Перевірте тестові корпуси. -1 байт завдяки Згарбу.


@Dennis Функція працює для [], але чомусь ghc не може зробити висновок про правильний тип []. Він працює, якщо його перевіряють разом з іншим тестовим прикладом, див. Перевірка тестів.
— Лайконі

Правильно, я так добре не знаю Haskell.
— Денніс

Збережіть байт зf(a:x@(_:b:_))=a==b&&f x
— Zgarb

3

bash, 56 54 38 байт

[ -z $3 ]||((($1==$3))&&(shift;$0 $*))

Збережіть це як скрипт і передайте список чисел як аргументи (для списку n-елементів ви передасте n аргументів). Вихід - код виходу: 0 (для істинного), якщо список чергується, і 1 (для помилкового) в іншому випадку.

(Повернення виводу у вихідний код дозволено в стандартних методах вводу / виводу PPCG.)

Це працює рекурсивно:

  • Якщо у списку менше 3 елементів, то вийдіть із кодом повернення 0;
  • інакше, якщо 1-й елемент! = 3-й елемент, тоді вийдіть із кодом повернення 1;
  • інакше запустіть програму рекурсивно у списку з видаленим першим елементом.

1

Python 2.7, 38 байт

>> i=lambda a:(a[:2]*len(a))[0:len(a)]==a

Випробування:

>> print i([1,2,1,2])
>> True
>> print i([10,5,10,5,10]
>> True
>> print i([5,4,3,5,4,3])
>> False
>> print i([3,2,1,2,1,2])
>> False

2
Я б назвав це дублікатом цієї відповіді .
— mbomb007

1

Пайк, 6 байт, неконкурентоспроможний

2<Ql{q

Спробуйте тут!

2<     -   inp[:2]
    {  -  reshape(^, v)
  Ql   -   len(inp)
     q - ^ == inp

Дозволити вузлу переформатування взяти список і рядок


1

Шензен І.О. (Асемблер), 83 76 байт, неконкурентоспроможний

Shenzen io - гра-головоломка, де ви можете кодувати код на спеціальній мові асемблера.

На жаль, ви можете використовувати цілі числа між -999 та 999 як входи або виходи, і немає способу сказати, чи закінчився масив. Тож я припустив, що масив був записаний на ПЗУ, який обгортається після прочитання останньої комірки. Це означає, що можна використовувати навіть навіть масиви, що є причиною його неконкуренції.

Код:

@mov x0 dat
@mov x0 acc
teq x0 dat
+teq x0 acc
b:
+mov 1 p1
-mov 0 p1
-jmp b

Пояснення:

  # calling for x0 will cause rom to move 1 cell forward

 @ mov x0 dat # Moves value to variable dat (only run once)
 @ mov x0 acc # Moves rom position forward and moves x0 to acc           
  teq x0 dat  # See if dat equals x0  
+ teq x0 acc  # If last expression was true, see x0 equals acc
b:            # Label for jumps (GOTO)
+ mov 1 p1    # Set output (p1) to 1 (same case as previous line)
- mov 0 p1    # if any expression was false, set output to 0 
- jmp b       # jump to b: (same case as prev line)

Вибачте, якщо щось із цього бентежить, це моя перша відповідь з кодом на гольф.

EDIT: видалено 7 байтів, замінивши цикли кодом run-Once


Ласкаво просимо до PPCG!
— FlipTack


1

Рубі, 131 119 байт

a=->x{!(x.values_at(*x.each_index.select{|i|i.even?}).uniq)[1]&!(x.values_at(*x.each_index.select{|i|i.odd?}).uniq[1])}

Ламбда aочікує масив xі повертає істину, якщо для непарних індексованих елементів є 0 або 1 унікальних значень і 0 або 1 унікальних значень для парних індексованих елементів у масиві.

Помітні байт-сейфи

  • використання лямбда над def
  • !arr[1] vs. arr.length < 2
  • & проти &&

Тестові справи

p a[[]]
p a[[1]]
p a[[1,1]]
p a[[1,2,1]]
p a[[1,2,1,2]]
p a[[3,4,3]]
p a[[10,5,10,5,10]]
p a[[10,11]]
p a[[9,9,9,9,9]]

#false
p a[[5,4,3,5,4,3]]==false
p a[[3,2,1,2,1,2]]==false
p a[[1,2,1,2,1,1,2]]==false
p a[[2,2,3,3]]==false
p a[[2,3,3,2]]==false

1

Дарт, 46 байт

(l){var i=0;return l.every((x)=>x==l[i++%2]);}

Виконати з:

void main() {
  var f = (l){var i=0;return l.every((x)=>x==l[i++%2]);};
  print(f([1,2,1,2,1]));
}

1

C #, 54 байти

using System.Linq;p=>!p.Where((v,i)=>v!=p[i%2]).Any();

Фільтр масиву відображає значення, які не відповідають першому значенню для рівнів та другому значенню для коефіцієнтів. Якщо результатів немає, поверніть справжнє.



0

C #, 66 байт

a=>{int r=1,i=0;for(;i<a.Length;)if(a[i]!=a[i++%2])r=0;return r;};

Анонімна функція, яка отримує цілий масив і повертає 1, якщо масив чергується, а 0 - інакше.

Повна програма з функцією безготівки та тестовими кейсами:

using System;

public class Program
{
    public static void Main()
    {
        Func<int[], int> f =
        a =>
        {
            int r = 1,  // return value. 1 is true, by default
                i = 0;  // iterator
            for ( ; i<a.Length ; )  // for each array element
                if ( a[i] != a[i++%2] ) // if the even (or odd) elements are not the same
                    r = 0;      // a falsy (0) value will be assigned to the return element
            return r;       // returning if the array is alternating or not
        };

        // test cases:
        Console.WriteLine("Edge cases (all TRUE):");
        Console.WriteLine(f(new int[]{}));      //  True
        Console.WriteLine(f(new int[]{1}));     //  True
        Console.WriteLine(f(new int[]{1,1}));   //  True
        Console.WriteLine(f(new int[]{1,2,1})); //  True

        Console.WriteLine("Some other TRUE test cases:");
        Console.WriteLine(f(new int[]{1,2,1,2}));      // True
        Console.WriteLine(f(new int[]{10,5,10,5,10})); // True
        Console.WriteLine(f(new int[]{10,11}));        // True
        Console.WriteLine(f(new int[]{9,9,9,9,9}));    // True

        Console.WriteLine("Some FALSE test cases:");
        Console.WriteLine(f(new int[]{5,4,3,5,4,3}));   // False
        Console.WriteLine(f(new int[]{3,2,1,2,1,2}));   // False
        Console.WriteLine(f(new int[]{1,2,1,2,1,1,2})); // False
        Console.WriteLine(f(new int[]{2,2,3,3}));       // False
        Console.WriteLine(f(new int[]{2,3,3,2}));       // False
    }
}


0

Clojure, 70 байт

(fn[c](let[n #(max(count(set(take-nth 2 %)))1)](=(n c)(n(rest c))1))))

Перевіряє, що кількість кожного другого елемента дорівнює 1, і обробляє порожні колекції як особливий випадок. Також перепробував безліч підходів , заснованих на reduceі , group-byале не так багато удачі там.


0

Ще один варіант з R: 36 байт.

all(rep_len(head(x,2),length(x))==x)

І я думаю, я знайшов набагато більш коротку версію: 15 байт

all(!diff(x,2))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.