Czy to zestaw ćwiczeń?

16

Wszyscy wiemy, że wiele ćwiczeń wpływa tylko na połowę twojego ciała, więc musisz wykonać je dwa razy, raz dla każdej strony. Takie ćwiczenia mają dwa odpowiedniki, jeden dla lewej strony i jeden dla prawej. Jednak nie ma potrzeby wykonywania dwóch odpowiedników kolejno, o ile ćwiczenia dla obu stron są w tej samej kolejności. Równie dobrze możesz przełączać się między stronami w swoim programie ćwiczeń, ale nie ma sensu rozpoczynać niektórych ćwiczeń jedną stroną, a drugą drugą.

Wyzwanie

Część ćwiczeniowa to lista niezerowych liczb całkowitych, gdzie jej druga połowa składa się z liczb całkowitych pierwszej połowy zanegowanych i w tej samej kolejności, a znaki liczb całkowitych na każdej połowie są równe. Znak pierwszej połowy części ćwiczeń jest jej wiodącą stroną .

Zestaw do ćwiczeń to zero lub więcej części ćwiczeń połączonych razem z tą samą stroną prowadzącą.

Biorąc pod uwagę listę niezerowych liczb całkowitych jako danych wejściowych, określ, czy jest to zestaw ćwiczeń. Liczby całkowite niekoniecznie są unikalne. Długość listy niekoniecznie jest równa.

Twoje rozwiązanie nie może wykorzystywać żadnych standardowych luk . Możesz użyć dowolnych dwóch różnych spójnych wartości dla danych wyjściowych. To jest , więc wygrywa najkrótsze rozwiązanie.

Przykłady

[-5, -1, -7, -6, -5, 5, 1, 7, 6, 5]jest przykładem części ćwiczeniowej. Pierwsza połowa to [-5, -1, -7, -6, -5], a ostatnia połowa to [5, 1, 7, 6, 5], która jest liczbą całkowitą w pierwszej połowie zanegowaną. Dodatkowo, liczby całkowite pierwszej połowy są tego samego znaku. Wiodącą częścią tego ćwiczenia jest -1.

[3, 6, 5, -3, -6, -5, 1, 6, 4, 3, -1, -6, -4, -3]jest przykładem zestawu ćwiczeń. Poszczególne części ćwiczeń są [3, 6, 5, -3, -6, -5]i [1, 6, 4, 3, -1, -6, -4, -3], i obie mają wiodącą stronę1 .

[4, -4, -5, 5], mimo że składa się tylko z prawidłowych części ćwiczeń, nie jest zestawem ćwiczeń, ponieważ pierwsza część [4, -4]ma stronę prowadzącą 1, podczas gdy druga część [-5, 5]ma stronę prowadzącą -1.

Przypadki testowe

Prawidłowe przypadki testowe:

[]
[1, -1]
[1, -1, 1, -1]
[-6, 6, -5, -4, -3, 5, 4, 3]
[-1, -5, -8, 1, 5, 8, -7, -6, -5, -3, 7, 6, 5, 3]
[-1, -5, -8, 1, 5, 8, -1, 1]

Nieprawidłowe przypadki testowe:

[1]
[1, -2]
[1, 2, -3, -1, -2, 3]
[1, 2, 3, -3, -1, -2]
[-1, -5, -8, 1, 5, 8, 7, 6, 5, 3, -7, -6, -5, -3]
[1, 2, 3, 5, 1, 2, 3, 5]
[1, 2, -5, 4, -6, 5, 5, -6]
[1, 2, -1, 3, -2, -3]
[1, -2, 1]
[-1, -1, 1]
[1, -1, 1]
Erik the Outgolfer
źródło
3
Pusta skrzynka to irytacja. I aby zinterpretować słowa wyzwania, nie jestem pewien, czy istnieje poprawny sposób przypisania „braku ćwiczeń” jednej lub drugiej stronie „czy to zestaw ćwiczeń?” Ale szczerze mówiąc po prostu narzekam.
ngm
@ngm Właśnie miałem to skomentować .. Pusta lista jest denerwującym przypadkiem na krawędzi .. Osobiście powiedziałbym, że dane wejściowe zawierają co najmniej jeden element. Ale oprócz tego miłego wyzwania!
Kevin Cruijssen
1
@ngm To prawda, jeśli chodzi o pustą prawdę. Uważaj to za odpowiedni relaks. ;)
Erik the Outgolfer
2
Miło wiedzieć, że mogę grać w golfa i ćwiczyć jednocześnie.
ngm
@ngm „ Miło jest wiedzieć, że mogę grać w golfa i ćwiczyć jednocześnie. ” Mamy więcej takich wyzwań . ;)
Kevin Cruijssen

Odpowiedzi:

3

Java 8, 186 183 185 bajtów

a->{int i=a.length-1,t,j;boolean r=i%2>0,f;if(i<0)return!r;for(f=a[i]<0;i>0;){for(r&=f==(t=a[j=i])<0;j>0&&t>>>31==a[--j]>>>31;);for(t=i-j,i-=2*t;j>=0&j>i;)r&=a[j+t]==-a[j--];}return r;}

+2 bajty z powodu poprawki błędu dla przypadków testowych wielkości 3 (prawie wszystkie permutacje 1i -1na końcu mojego łącza TIO).

Z pewnością można grać w golfa. Wyzwanie wygląda na to, że jest trudne, ale bardzo trudne do zrealizowania. Szczególnie przypadek [4,-4,-5,5]do naprawy był denerwujący. Ale teraz działa. Odtąd zagrasz w golfa.

Wypróbuj online.

Wyjaśnienie:

a->{                   // Method with integer-array parameter and boolean return-type
  int i=a.length-1,j,  //  Index integers (`i` starting at the last index)
      t;               //  Temp integer
  boolean r=i%2>0,     //  Result-boolean, starting at true if the input-list is even
          f;           //  Flag-integer
  if(i<0)              //  If the input was empty (edge case)
    return!r;          //   Return true
  for(f=a[i]<0;        //  Set the flag-boolean to "Is the current item negative?"
      i>0;){           //  Loop down over the array
    for(r&=f==(t=a[j=i])<0;
                       //   Set `s` to the current number
                       //   And verify if the initial flag and `s` have the same sign
        j>0            //   Loop `j` from `i` down as long as `j` is larger than 0,
        &&t>>>31==a[--j]>>>31;);
                       //   and both `s` and the current item have the same sign
                       //    Decreasing `j` by 1 every iteration
    for(t=i-j,         //   Set `t` to `i-j` (amount of same signed adjacent values)
        i-=2*t;        //   Decrease `i` by two times `t`
        j>=0           //   Loop as long as `j` is larger than or equal to 0,
        &j>i;)         //   and also larger than `i`
      r&=a[j+t]==-a[j--];}
                       //    Verify if the pairs at index `j+t` and `j`
                       //    are negatives of each other
  return r;}           //  Return if `r` is still true (if all verifications succeeded)
Kevin Cruijssen
źródło
3

R , 91 bajtów

Wprowadza wektor liczb oddzielony spacjami. Dane wyjściowe FALSEdla prawidłowego i TRUEnieprawidłowego.

x=scan()
y=x<0
z=rle(y)
"if"(sum(x|1),any(x[y]+x[!y],z$v==rev(z$v),z$l[!0:1]-z$l[!1:0]),F)

rle podaje kodowanie długości przebiegu, w tym przypadku sekwencji wartości dodatnich i ujemnych.

The Całkowicie i całkowicie nieuczciwy przypadek kant pusty;) dodaje Aż 15 bajtów.

Wiele bajtów wygolił @Giuseppe.

Oto 92-bajtowa wersja wyrażona jako funkcja lepsza do testowania:

Wypróbuj online!

ngm
źródło
3

JavaScript (ES6), 54 bajty

Wersja zoptymalizowana, zainspirowana odpowiedzią Dennisa na Python .

Zwraca 0 lub 1 .

a=>a.map(b=p=x=>b[+(x<0)]+=[x*x,p*(p=x)>0])|b[1]==b[0]

Wypróbuj online!


Wersja oryginalna, 74 bajty

a=>a.map(x=>b[i^=p*(p=x)<0&&-~(b[i]+=0)]+=[,x*x],b=[p=0,i=0])|b[1]+0==b[0]

Wypróbuj online!

W jaki sposób?

Przechowujemy pierwsze połówki wszystkich częściach Ćwiczenia w b [0] i drugich połówek w B [1] , przełączanie pomiędzy b [0] i B [1] za każdym razem zmienia znak. Wpisy są kwadratowe, aby pozbyć się znaku. Każdą pozycję poprzedzamy przecinkiem, a każdą część sufiksem 0 .

Istnieje pewna dodatkowa logika, aby obsłużyć przypadek zbocza „pustego wejścia” w zasadzie bez żadnych kosztów (patrz komentarz na końcu kodu źródłowego).

a =>                    // given the input array a[]
  a.map(x =>            // for each x in a[]:
    b[i ^=              //   access b[i]:
      p * (p = x)       //     we keep track of the previous entry in p
      < 0 &&            //     if p and x have opposite signs:
      -~(b[i] += 0)     //       append a '0' to b[i] and update i: 0 -> 1, 1 -> 0
    ] += [, x * x],     //   append a comma followed by x² to b[i]
    b = [p = 0, i = 0]  //   start with p = 0, i = 0 and b = [0, 0]
  ) |                   // end of map()
  b[1] + 0              // this will append a '0' to b[1] if it was turned into a string
                        // or let it unchanged if it's still equal to zero (integer),
                        // which handles the 'empty input' edge case
  == b[0]               // compare the result with b[0]
Arnauld
źródło
2

Python 2 , 147 130 113 112 106 bajtów

from itertools import*
def f(s):l=[map(abs,g)for v,g in groupby(s+[0],0 .__cmp__)];print l[1::2]==l[:-1:2]

Wypróbuj online!


Zapisano:

  • -27 bajtów, dzięki Dennisowi
TFeld
źródło
2
lambda n:cmp(n,0)może zostać 0 .__cmp__. all(a==b for a,b in zip(l[::2],l[1::2]))może zostać l[:-1:2]==l[1::2].
Dennis
2

Retina 0.8.2 , 57 bajtów

^\b|,\b
$&=
(.)(\d+),(?=\1)
$2_
-|=

.$
$&,
^((\w+,)\2)*$

Wypróbuj online! Pobiera dane oddzielone przecinkami, ale link zawiera nagłówek przetwarzający przypadki testowe. Wyjaśnienie:

^\b|,\b
$&=

Wstaw znacznik przed każdą dodatnią liczbą całkowitą.

(.)(\d+),(?=\1)
$2_

Zmień przecinki między liczbami całkowitymi tego samego znaku na podkreślenia.

-|=

Usuń pozostałe znaki.

.$
$&,

Dodaj przecinek, jeśli dane wejściowe nie są puste.

^((\w+,)\2)*$

Sprawdź, czy ciąg składa się z par przebiegów tych samych liczb całkowitych.

Neil
źródło
1

Python 2 , 111 bajtów

x=input()
o=[];p=[]
for a,b in zip(x,x[1:]):
 if 0<a*x[0]:
	p+=a,-a
	if b*a<0:o+=p[::2]+p[1::2];p=[]
print o==x

Wypróbuj online!

Pręt
źródło
1

JavaScript (Node.js) , 155 bajtów

b=>eval('i=b.length-1;r=i%2;0>i&&!r;for(f=0>b[i];0<i;){for(r&=f==(s=0>b[j=i]);0<j&&s&0>b[--j]|!s&0<b[j];);t=i-j;for(i-=2*t;0<=j&j>i;)r&=b[j+t]==-b[j--]}r')

Wypróbuj online!


Inspiracją była odpowiedź @ KevinCruijssen

Również dzięki niemu za naprawienie 2 moich przypadków testowych

Muhammad Salman
źródło
Od ciebie jest inspirowana z moją odpowiedź Java, należy zmienić r=0<isię r=i%2, gdyż przypadków testowych [1,-1,1]i [-1,1,-1]zawodzą w tej chwili. Jednak liczba bajtów pozostaje taka sama dla JS.
Kevin Cruijssen
@KevinCruijssen: Dzięki, gotowe
Muhammad Salman
1

Brachylog , 18 14 bajtów

~c{ḍz{ṅᵈ¹ṡ}ᵛ}ᵛ

Wypróbuj online!

Zaoszczędź 4 bajty dzięki @ErikTheOutgolfer.

Wyjaśnienie

                    Succeed if and only if:
~c                  You can deconcatenate the input list…
  {         }ᵛ      …and verify that for each of the sublists:
   ḍ                  Split it in half
    z                 Zip the elements of each half together
     {    }ᵛ          Verify that for each couple:
      ṅᵈ¹               The first integer is the negation of the second one
         ṡ              Take the sign of the first one
                      All signs should be equal in a sublist
                    All leading signs of the sublists should be equal
Fatalizować
źródło