Eine Reihe von Herausforderungen Nr. 1: Wechselnde Reihen


41

Wechselnde Arrays

Ein alternierendes Array ist eine Liste beliebiger Länge, in der sich zwei (nicht unbedingt unterschiedliche) Werte abwechseln. Das heißt, alle geradzahligen Elemente sind gleich und alle ungeradzahligen Elemente sind gleich.

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei Angabe einer Liste positiver Ganzzahlen truthyabwechselnd oder auf falsyandere Weise ausgegeben / zurückgegeben wird .

Das ist , also gewinnt der kürzeste Code (in Bytes)!

Edge Cases:

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

Andere Testfälle:

[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

Beispiel

Hier ist ein Beispiel, gegen das Sie Ihre Lösung testen können, geschrieben in Python 3 (nicht Golf):

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

Was sind die möglichen Werte der Elemente des Arrays?
Robert Hickman

@RobertHickman eine Liste positiver Ganzzahlen innerhalb der Standard-Int-Größe Ihrer Sprache
FlipTack

oh das sehe ich jetzt in der frage. Ups und danke.
Robert Hickman

Antworten:


27

Gelee , 4 Bytes

ḣ2ṁ⁼

Probieren Sie es online!

Wie es funktioniert

ḣ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
Verdammt. Und das Ändern der 2auf andere Zahlen verallgemeinert sofort die Herausforderung!
Greg Martin

3 Bytes , aber Ɲnicht vorhanden, als die Herausforderung veröffentlicht wurde.
Caird Coinheringaahing

14

Brainfuck, 34 Bytes

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

Nimmt das Array als Byte-Werte in eine Zeichenfolge und gibt \x00für false und \x01für true aus.

Probieren Sie es online aus.

Dadurch bleibt die Struktur erhalten

a b 1 c

Auf dem Band cist das aktuelle Zeichen bdas vorherige Zeichen und adas vorherige vorherige Zeichen, solange sich das Array abwechselt. Wenn eine Nichtübereinstimmung festgestellt wird, wird der Zeiger nach links verschoben, sodass a, bund das 1Flag alle Null werden. Diese Situation wird fortgesetzt, bis alle Eingaben verbraucht sind.


13

R, 24 23 Bytes

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

Liest einen Vektor in STDIN, nimmt die ersten beiden Elemente dieses Vektors und überprüft die Gleichheit. Wenn die Längen von a[1:2]und a nicht übereinstimmen, durchläuft R die Schleife a[1:2], um der Länge von a zu entsprechen. Es wird eine Warnung dazu geben, aber es wird funktionieren.

Überraschenderweise funktioniert dies sogar für leere Eingaben, ich weiß nicht warum, aber ich werde damit rollen.

1 Byte dank @MickyT gespeichert


Sie können sich ein Byte sparen mitall((a=scan())==a[1:2])
MickyT

Wie geben Sie die Daten als Vektor, Liste oder nur einzelne Zahlen ein? Ich habe versucht, einzelne Zahlen auf der Konsole einzugeben, erhalte jedoch die Warnung: "Warnmeldung: In scan () == a [1: 2]: Eine längere Objektlänge ist kein Vielfaches einer kürzeren Objektlänge". Obwohl es funktioniert.
Skan

Indem Sie tatsächlich einzelne Zahlen eingeben. Es wird eine Warnung ausgegeben, wenn die Länge der Eingabe ungerade ist, aber es wird trotzdem die richtige Ausgabe ausgegeben.
JAD

10

MATL , 7 6 Bytes

2YCs&=

Für alternierende Arrays gibt dies eine nicht leere Matrix von Einsen aus, was wahr ist. Bei nicht alternierenden Arrays enthält die Matrix mindestens eine Null und ist daher falsch (siehe hier ).

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Nehmen wir [1 2 1 2]als Beispiel die Eingabe.

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
Netter Algorithmus! Dies würde eine gemeine Gelee-Antwort ergeben.
Dennis

@ Tennis Danke! Es wurde teilweise von Ihrem Jelly Ansatz inspiriert
Luis Mendo

9

JavaScript (ES6), 27 Byte

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

Testfälle


8

Retina , 25 Bytes

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

Probieren Sie es online!

Anstatt eine Eingabe mit abwechselnden Werten abzugleichen (was in einem regulären Ausdruck zu störenden Kanteneffekten führt), stimme ich Eingaben zu, die nicht gültig sind, und negiere das Ergebnis anschließend.

Der Vorteil des Abgleichs einer ungültigen Eingabe besteht darin, dass diese Eigenschaft lokal überprüft werden kann und leere oder kurze Eingaben nicht speziell behandelt werden müssen: Jede Eingabe ist ungültig, wenn sie zwei unterschiedliche Werte enthält, die um eine Position voneinander entfernt sind.

Die erste Stufe zählt also die Anzahl der Übereinstimmungen, von \b(\d+),\d+,(?!\1\b)denen ein Wert übereinstimmt und erfasst wird, und stellt dann fest, dass der dritte Wert in Folge unterschiedlich ist. Dies ergibt Null für gültige Eingaben und etwas Positives für ungültige Werte.

Die zweite Stufe zählt einfach die Anzahl der Spiele von ^0denen ist , 1wenn die erste Stufe zurückgeführt 0und auf 1andere Weise.


7

Mathematica, 29 Bytes

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

Ein Port des MATL-Algorithmus von Luis Mendo. Unbenannte Funktion, die eine Liste von Zahlen (oder sogar allgemeineren Objekten) aufnimmt und Trueoder zurückgibt False. Prüft, ob die Summen aufeinanderfolgender Elemente alle gleich sind. Leider Mostund Restersticken auf der leeren Liste, so dass das separat getestet werden muss.

Mathematica, 33 Bytes

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

Unbenannte Funktion, die eine Liste von Zahlen (oder sogar allgemeineren Objekten) aufnimmt und Trueoder zurückgibt False. Die Funktion Differences[#,1,2]nimmt die Differenzen nicht aufeinanderfolgender Paare von ganzen Zahlen, sondern Paare von ganzen Zahlen im Abstand von zwei voneinander. Dann prüfen wir nur, ob die resultierende Liste nichts anderes als Nullen enthält.

Als Bonus erhalten wir für ein weiteres Byte (ändern Sie das 2in #2) eine Funktion, die eine Liste von ganzen Zahlen und eine andere positive ganze Zahl eingibt #2und prüft, ob die Eingabeliste das Ergebnis der #2periodischen Verschachtelung konstanter Sequenzen miteinander ist. Zum Beispiel,

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

bewertet zu True.


7

Haskell, 27 26 Bytes

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

Dies wird zu einer anonymen Funktion ausgewertet, die die Herausforderung löst. Die Idee ist, die ersten beiden Zahlen aus der Liste zu entfernen, mit der ursprünglichen Liste mit Gleichheit zu zippen und zu überprüfen, ob das Ergebnis nur Trues enthält . Probieren Sie es online!

Danke an nimi für 1 Byte!



1
Nett. and.(zipWith(==)=<<drop 2)Speichert ein Byte.
Nimi

7

Netzhaut ,39 32 28 Bytes

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

Probieren Sie es online!

7 Bytes gespart dank Martin ! 3 weitere dank Kobi gerettet ! Und zu Kritixi für eine Idee für eine andere 1.

Optional passen wir eine Zahl an, die die gesamte Eingabe belegt, ein beliebiges Zahlenpaar oder ein beliebiges Zahlenpaar, gefolgt von demselben Zahlenpaar, und optional wird die zweite Zahl ganz am Ende nicht eingeschlossen. Konnte 2 Bytes speichern, wenn die Eingabe unär war.


1
Eine weitere ^(\d+)?(.\d+)?(.\1\2)*(.\1)?$29-Byte-Alternative. Das passt nicht zusammen ,1,,1.
Kritixi Lithos

1
@Kobi Tolle Idee, danke! Ich habe einen Teil von Kritixis Antwort (das Hinzufügen des Kommas zur zweiten Erfassungsgruppe) verwendet, um eine weitere 1 zu speichern!
FryAmTheEggman

6

Pyth, 9 Bytes

q<*<Q2lQl

Erläuterung

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

Vielleicht möchten Sie den Code in der Erklärung aktualisieren (es ist anders atm)
FlipTack

@ Flp.Tkc Pyth fügt Qdem Code implizit s hinzu . Ich habe sie in der Erklärung hinzugefügt, um klarer zu machen, was vor sich geht, aber sie sind nicht wirklich im Code enthalten.
Mnemonik

5

Brachylog , 15 Bytes

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

Probieren Sie es online!

Erläuterung

:{         }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 Bytes

⊢≡⍴⍴2⍴⊢

Erläuterung:

  • 2⍴⊢: Verändern Sie das Eingabearray um 2
  • ⍴⍴: Verändern Sie das Ergebnis um die ursprüngliche Größe der Eingabe, indem Sie Elemente wiederholen
  • ⊢≡: Überprüfen Sie, ob das Ergebnis der ursprünglichen Eingabe entspricht

Testfälle:

      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 Bytes

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

Dies ist ein Lambda-Ausdruck für a Predicate< int[ ] >

Erläuterung: Initialisieren Sie das Ergebnis auf 0. Für jedes Element gibt Biteise ODER das Ergebnis mit der Differenz zwischen dem aktuellen Element und dem Element 2 früher an. return truewenn das Ergebnis gleich 0 ist. Andernfalls returnfalse


5

Perl 6 ,  49 43  42 Bytes

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

Versuch es

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

Versuch es

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

Versuch es

Erweitert:

{
  !              # 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]kann ein Byte kürzer sein als .[1]. Der Körper des inneren Lambda kann um ein Byte kürzer sein als {.[0]!=a||.[1]!=b}.
smls

1
Ich habe keine Ahnung, warum ich das nicht gesehen habe .[1]. Scheint !=auch nicht zu funktionieren, wenn kein Leerzeichen folgt. Ich denke, so etwas $_!=3wird analysiert, als ob es geschrieben wurde als!( $_ = 3 )
Brad Gilbert b2gills

Ah. Sieht aus wie es ein Rakudo-Bug ist .
smls


3

J, 8 Bytes

-:$$2&{.

Erläuterung

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

Testfälle

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

Sie sollten in der Lage sein, {.Take mit $Shape zu ersetzen .
Adám

3

Haskell , 33 32 Bytes

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

Probieren Sie es online! oder Überprüfen Sie die Testfälle. -1 Byte dank Zgarb.


@Dennis Die Funktion funktioniert für [], aber aus irgendeinem Grund kann ghc nicht auf den richtigen Typ schließen []. Es funktioniert, wenn es zusammen mit dem anderen Testfall getestet wird (siehe Überprüfen der Testfälle).
Laikoni

Richtig, ich kenne Haskell nicht so gut.
Dennis

Speichern Sie ein Byte mitf(a:x@(_:b:_))=a==b&&f x
Zgarb

3

Bash, 56 54 38 Bytes

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

Speichern Sie dies als Skript und übergeben Sie die Liste der Zahlen als Argumente (bei einer Liste mit n Elementen übergeben Sie n Argumente). Die Ausgabe ist der Exit-Code: 0 (für true), wenn sich die Liste abwechselt, und 1 (für false), wenn sich die Liste abwechselt.

(Die Rückgabe von Ausgaben im Exit-Code ist in den PPCG-Standard-E / A-Methoden zulässig.)

Das funktioniert rekursiv:

  • Wenn die Liste weniger als 3 Elemente enthält, beenden Sie sie mit dem Rückkehrcode 0.
  • sonst wenn das 1. Element! = das 3. Element, dann mit Returncode 1 beenden;
  • Führen Sie das Programm ansonsten rekursiv in der Liste aus, wobei das erste Element entfernt wird.

1

Python 2.7, 38 Bytes

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

Testfälle:

>> 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
Ich würde das ein Duplikat dieser Antwort nennen .
mbomb007

1

Pyke, 6 Bytes, nicht konkurrierend

2<Ql{q

Probieren Sie es hier aus!

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

Ermöglichen Sie dem Umformknoten, eine Liste sowie eine Zeichenfolge aufzunehmen


1

Shenzen IO (Assembler), 83 76 Bytes, nicht konkurrierend

Shenzen io ist ein Puzzlespiel, bei dem Sie Ihren Code in einer speziellen Assemblersprache codieren können.

Leider können Sie nur Ganzzahlen zwischen -999 und 999 als Ein- oder Ausgänge verwenden, und Sie können nicht feststellen, ob ein Array beendet wurde. Also nahm ich an, dass das Array auf einem ROM geschrieben wurde, der sich nach dem Lesen der letzten Zelle umläuft. Dies bedeutet, dass nur gerade Arrays verwendet werden können, weshalb keine Konkurrenz besteht.

Code:

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

Erläuterung:

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

Tut mir leid, wenn dies verwirrend ist, ist dies meine erste Code-Golf-Antwort.

BEARBEITEN: 7 Bytes wurden entfernt, indem Schleifen durch einmaligen Code ersetzt wurden


Willkommen bei PPCG!
FlipTack

1

Ruby, 23 Bytes

->a{a[2..-1]==a[0..-3]}

1

Rubin, 131 119 Bytes

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 aerwartet ein Array xund gibt true zurück, wenn 0 oder 1 eindeutige Werte für die ungeraden indizierten Elemente und 0 oder 1 eindeutige Werte für die geraden indizierten Elemente im Array vorhanden sind.

Bemerkenswerte Byte-Safer

  • Verwendung von Lambda über def
  • !arr[1] gegen arr.length < 2
  • & vs &&

Testfälle

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 Bytes

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

Laufen mit:

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 Bytes

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

Filterarray, um Werte anzuzeigen, die nicht mit dem ersten Wert für "Evens" und dem zweiten Wert für "Odds" übereinstimmen. Wenn keine Ergebnisse vorliegen, geben Sie true zurück.



0

C #, 66 Bytes

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

Anonyme Funktion, die ein ganzzahliges Array empfängt und 1 zurückgibt, wenn sich das Array abwechselt, andernfalls 0.

Volles Programm mit ungolfed Funktion und Testfällen:

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 Bytes

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

Überprüft, ob die eindeutige Anzahl jedes zweiten Elements 1 beträgt, und behandelt leere Sammlungen als Sonderfall. Habe auch viele Ansätze ausprobiert reduceund da group-byaber nicht viel Glück gehabt.


0

Eine weitere Option mit R: 36 Bytes.

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

Und ich denke, ich habe eine viel kürzere Version gefunden: 15 Bytes

all(!diff(x,2))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.