Tablica wyzwań nr 1: Naprzemienne tablice


41

Naprzemienne tablice

Tablica przemiennego jest listą o dowolnej długości, w których dwa (nie koniecznie) inne wartości są przemienne. Oznacza to, że wszystkie pozycje o indeksie nieparzystym są równe, a wszystkie elementy o indeksie nieparzystym są równe.

Twoim zadaniem jest napisanie programu lub funkcji, która, gdy otrzyma listę dodatnich liczb całkowitych, wyprowadza / zwraca, truthyjeśli jest na przemian i falsyinaczej.

To jest , więc wygrywa najkrótszy kod (w bajtach)!

Edge Cases:

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

Inne przypadki testowe:

[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

Przykład

Oto przykład, na którym możesz przetestować swoje rozwiązanie, napisany w Pythonie 3 (bez gry w golfa):

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

Jakie są możliwe wartości elementów tablicy?
— Robert Hickman,

@RobertHickman lista dodatnich liczb całkowitych w standardowym rozmiarze int Twojego języka
— FlipTack,

och, teraz to widzę w pytaniu. Ups i dzięki.
— Robert Hickman,

Odpowiedzi:


27

Galaretka , 4 bajty

ḣ2ṁ⁼

Wypróbuj online!

Jak to działa

ḣ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
Cholerny. A zmiana na 2inne liczby natychmiast uogólnia wyzwanie!
— Greg Martin,

3 bajty , ale Ɲnie istniały, gdy opublikowano wyzwanie.
— caird coinheringaahing

14

pieprzenie mózgu, 34 bajty

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

Pobiera tablicę jako wartości bajtów w łańcuchu i zwraca wartości \x00false i \x01true.

Wypróbuj online.

Utrzymuje to strukturę

a b 1 c

na taśmie, gdzie cjest bieżący znak, bpoprzedni znak i apoprzedni poprzedni znak, o ile tablica jest na przemian. Jeśli zostanie znalezione niedopasowanie, wskaźnik zostanie przesunięty w lewo tak, że a, ba 1flaga stanie się zero, i ta sytuacja będzie trwać, dopóki wszystkie dane wejściowe nie zostaną wykorzystane.


13

R 24 24 bajty

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

Wczytuje wektor do STDIN, bierze pierwsze dwa elementy tego wektora i sprawdza równość. Jeśli długości a[1:2]i a nie pasują, R zapętli się, a[1:2]aby dopasować długość a. Ostrzeże o tym, ale zadziała.

Zaskakujące, że to działa nawet dla pustych danych wejściowych, nie jestem pewien, dlaczego, ale będę z tym korzystać.

Zapisano 1 bajt dzięki @MickyT


możesz uratować sobie bajt zall((a=scan())==a[1:2])
— MickyT,

Jak wprowadzasz dane jako wektor, listę lub tylko pojedyncze liczby? Próbowałem wpisać pojedyncze cyfry na konsoli, ale pojawia się ostrzeżenie: „Komunikat ostrzegawczy: W scan () == a [1: 2]: dłuższy obiekt nie jest wielokrotnością krótszej obiektu”. Chociaż to działa.
— skan

Rzeczywiście, wpisując pojedyncze liczby. Wyrzuci ostrzeżenie, jeśli długość wejściowa jest nieparzysta, ale nadal będzie dawać prawidłową moc wyjściową.
— JAD,

10

MATL , 7 6 bajtów

2YCs&=

W przypadku tablic naprzemiennych generuje niepustą macierz jednych, co jest prawdą. W przypadku tablic nieprzemiennych matryca zawiera co najmniej jedno zero, a zatem jest fałszem (patrz tutaj ).

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Weźmy [1 2 1 2]jako przykładowe dane wejściowe.

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
Niezły algorytm! To byłaby wredna odpowiedź Jelly.
— Dennis,

@Dennis Thanks! Zostało to częściowo zainspirowane twoim podejściem do galaretki
— Luis Mendo,

9

JavaScript (ES6), 27 bajtów

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

Przypadki testowe


8

Siatkówka , 25 bajtów

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

Wypróbuj online!

Zamiast dopasowywać dane wejściowe naprzemiennymi wartościami (co prowadzi do denerwujących efektów krawędziowych w wyrażeniu regularnym), dopasowuję dane wejściowe, które nie są prawidłowe, a następnie neguję wynik.

Zaletą dopasowania niepoprawnego wejścia jest to, że jest to właściwość, którą można sprawdzić lokalnie, i nie trzeba specjalnie traktować pustych lub krótkich danych wejściowych: każde wejście jest nieprawidłowe, jeśli zawiera dwie różne wartości, które są od siebie oddzielone.

Tak więc pierwszy etap liczy liczbę dopasowań, \b(\d+),\d+,(?!\1\b)które pasują i przechwytuje jedną wartość, a następnie dopasowuje następną wartość, a następnie stwierdza, że ​​trzecia wartość w sekwencji jest inna. To daje zero dla prawidłowych danych wejściowych i coś pozytywnego dla nieprawidłowych wartości.

Drugi etap po prostu zlicza liczbę meczów z ^0co 1jeśli pierwszy etap wrócił 0i 1inaczej.


7

Mathematica, 29 bajtów

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

Port algorytmu MATL Luisa Mendo. Nienazwana funkcja pobierająca listę liczb (lub nawet bardziej ogólnych obiektów) i zwracająca Truelub False. Sprawdza, czy sumy kolejnych elementów są równe. Niestety Mosti Restdusić się na pustej liście, więc trzeba to przetestować osobno.

Mathematica, 33 bajty

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

Nienazwana funkcja pobierająca listę liczb (lub nawet bardziej ogólnych obiektów) i zwracająca Truelub False. Funkcja Differences[#,1,2]przyjmuje różnice, a nie kolejne pary liczb całkowitych, ale pary liczb całkowitych w odległości dwóch od siebie. Następnie sprawdzamy, czy na wynikowej liście nie ma nic poza zerami.

Jako bonus, dla jeszcze jednego bajta (zmienić 2na #2), otrzymujemy funkcję wejścia listę liczb całkowitych i innej liczby całkowitej dodatniej #2i sprawdza, czy lista wejściowa jest wynikiem przeplatania #2stałe sekwencje okresowo ze sobą. Na przykład,

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

ocenia na True.


7

Haskell, 27 26 bajtów

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

To prowadzi do anonimowej funkcji, która rozwiązuje wyzwanie. Pomysł polega na usunięciu pierwszych dwóch liczb z listy, skompresowaniu do oryginalnej listy przy użyciu równości i sprawdzeniu, czy wynik zawiera tylko Trues. Wypróbuj online!

Dzięki nim za 1 bajt!



1
Miły. and.(zipWith(==)=<<drop 2)zapisuje bajt.
— nimi

7

Siatkówka ,39 32 28 bajtów

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

Wypróbuj online!

Zaoszczędź 7 bajtów dzięki Martinowi ! Oszczędź kolejne 3 dzięki Kobi ! I Kritixi za pomysł na kolejny 1.

Opcjonalnie dopasowujemy liczbę, która zajmuje całe wejście, dowolną parę liczb lub dowolną parę liczb, po której następuje ta sama para dowolna liczba razy i opcjonalnie nie włączając drugiej liczby na samym końcu. Można zapisać 2 bajty, jeśli dane wejściowe były jednoargumentowe.


1
Kolejna ^(\d+)?(.\d+)?(.\1\2)*(.\1)?$29-bajtowa alternatywa. To nie pasuje ,1,,1.
— Kritixi Lithos,

1
@Kobi Świetny pomysł, dzięki! Użyłem odpowiedzi Kritixiego (dodanie przecinka do drugiej grupy przechwytywania), aby uratować kolejną 1!
— FryAmTheEggman,

6

Pyth, 9 bajtów

q<*<Q2lQl

Wyjaśnienie

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

możesz chcieć zaktualizować kod w objaśnieniu (jest to inny bankomat)
— FlipTack,

@ Flp.Tkc Pyth niejawnie dodaje Qs do kodu. Dodałem je w objaśnieniu, aby wyjaśnić, co się dzieje, ale tak naprawdę nie ma ich w kodzie.
— Mnemoniczny

5

Brachylog , 15 bajtów

:{~c#Tbh#Co}f#=

Wypróbuj online!

Wyjaśnienie

:{         }f       Find all results of the predicate below
             #=     They must all be equal

  ~c#T              Deconcatenate the input into three lists
      bh#C          The middle list has two elements
        #Co         Order that couple of elements as the output

5

APL, 7 bajtów

⊢≡⍴⍴2⍴⊢

Wyjaśnienie:

  • 2⍴⊢: przekształć tablicę wejściową o 2
  • ⍴⍴: przekształć wynik według pierwotnego rozmiaru danych wejściowych, powtarzając elementy
  • ⊢≡: sprawdź, czy wynik tego jest równy pierwotnemu wejściu

Przypadki testowe:

      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 bajty

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

To jest wyrażenie lambda dla Predicate< int[ ] >

Objaśnienie: Zainicjuj wynik na 0. Dla każdego elementu Biteise LUB wynik z różnicą między bieżącym elementem a elementem 2 wskazuje wcześniej. zwróć, truejeśli wynik jest równy 0. W przeciwnym razie zwróćfalse


5

Perl 6 ,  49 43  42 bajtów

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

Spróbuj

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

Spróbuj

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

Spróbuj

Rozszerzony:

{
  !              # 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]może być o jeden bajt krótszy jako .[1]. Ciało wewnętrznej lambda może być o jeden bajt krótsze jako {.[0]!=a||.[1]!=b}.
— smls,

1
@smls Nie mam pojęcia, dlaczego nie widziałem .[1]. !=Wydaje się również, że nie działa, jeśli nie następuje po nim spacja. Myślę, że coś takiego $_!=3jest analizowane tak, jakby to było napisane jako!( $_ = 3 )
— Brad Gilbert b2gills

Ach Wygląda na to, że to błąd Rakudo .
— smls,


3

J, 8 bajtów

-:$$2&{.

Wyjaśnienie

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

Przypadki testowe

   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|
+-+-+-+-+-+

Powinieneś być w stanie zastąpić {.Take with $Shape.
— Adám


3

bash, 56 54 38 bajtów

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

Zapisz to jako skrypt i przekaż listę liczb jako argumenty (dla listy n-elementowej przekażesz n argumentów). Dane wyjściowe to kod wyjścia: 0 (dla wartości true), jeśli lista jest na przemian, i 1 (dla wartości false) w przeciwnym razie.

(Zwracanie danych wyjściowych w kodzie wyjścia jest dozwolone w standardowych metodach We / Wy PPCG.)

Działa to rekurencyjnie:

  • Jeśli lista zawiera mniej niż 3 elementy, zakończ z kodem powrotu 0;
  • w przeciwnym razie, jeśli pierwszy element! = trzeci element, następnie wyjdź z kodem powrotu 1;
  • w przeciwnym razie uruchom program rekurencyjnie na liście z usuniętym pierwszym elementem.

1

Python 2.7, 38 bajtów

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

Przypadki testowe:

>> 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
Nazwałbym to duplikatem tej odpowiedzi .
— mbomb007,

1

Pyke, 6 bajtów, niekonkurujące

2<Ql{q

Wypróbuj tutaj!

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

Zezwól węzłu przekształcania na pobranie zarówno listy, jak i łańcucha


1

Shenzen IO (asembler), 83 76 bajtów, niekonkurujące

Shenzen io to gra logiczna, w której możesz zakodować swój kod specjalnym językiem asemblera.

Niestety, możesz używać liczb całkowitych od -999 do 999 jako danych wejściowych lub wyjściowych i nie ma sposobu, aby stwierdzić, czy tablica się zakończyła. Więc założyłem, że tablica została zapisana na ROM-ie, który zawija się po odczytaniu ostatniej komórki. Oznacza to, że można stosować tylko tablice, co jest przyczyną braku konkurencji.

Kod:

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

Wyjaśnienie:

  # 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)

Przepraszam, jeśli którekolwiek z nich jest mylące, to moja pierwsza odpowiedź na golfa.

EDYCJA: usunięto 7 bajtów, zastępując pętle kodem jednokrotnego uruchomienia


Witamy w PPCG!
— FlipTack,


1

Rubin, 131 119 bajtów

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])}

Lambda aoczekuje tablicy xi zwraca true, jeśli w tablicy znajduje się 0 lub 1 unikalnych wartości dla nieparzystych elementów indeksowanych i 0 lub 1 unikalnych wartości dla parzystych elementów indeksowanych w tablicy.

Znaczące zabezpieczenia bajtów

  • wykorzystanie lambda ponad def
  • !arr[1] vs. arr.length < 2
  • & vs &&

Przypadki testowe

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

Dart, 46 bajtów

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

Biegnij z:

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 bajty

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

Filtruj tablicę, aby pokazać wartości, które nie pasują do pierwszej wartości dla wyrównania i drugiej wartości dla szans. Jeśli nie ma żadnych wyników, zwróć wartość true.



0

C #, 66 bajtów

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

Anonimowa funkcja, która odbiera tablicę liczb całkowitych i zwraca 1, jeśli tablica jest na przemian, a 0 w przeciwnym razie.

Pełny program z funkcją niepolowania i przypadków testowych:

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

Oktawa, 51 bajtów

@(L)numel(L)<3||(f=@(n)isequal(L{n:2:end}))(1)&f(2)

Dane wejściowe to tablica komórek dodatnich liczb całkowitych.

Wypróbuj online!


0

Clojure, 70 bajtów

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

Sprawdza, czy odrębna liczba co 2 pozycji wynosi 1, i traktuje puste kolekcje jako specjalny przypadek. Próbowałem też wiele rozwiązań opartych na reducea group-by, ale nie dużo szczęścia tam.


0

Inna opcja z R: 36 bajtów.

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

I myślę, że znalazłem znacznie krótszą wersję: 15 bajtów

all(!diff(x,2))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.