Bu bir egzersiz seti mi?


16

Hepimiz biliyoruz ki birçok egzersiz vücudunuzun sadece yarısını etkiler, bu yüzden her iki taraf için bir kez olmak üzere iki kez yapmanız gerekir. Bu tür egzersizlerin biri sol taraf diğeri sağ taraf olmak üzere iki meslektaşı vardır. Bununla birlikte, her iki taraf için egzersizler aynı sırada olduğu sürece, iki meslektaşını arka arkaya yürütmeye gerek yoktur. Egzersiz programınızdaki taraflar arasında da geçiş yapabilirsiniz, ancak bir tarafa bazı alıştırmalara ve diğer tarafla bazı alıştırmalara başlamak mantıklı olmaz.

Meydan okuma

Bir alıştırma bölümü , sıfır olmayan tamsayıların bir listesidir, burada ikinci yarısı, ilk yarının negatif ve aynı sırayla tamsayılardan oluşur ve her yarıdaki tamsayıların işaretleri eşittir. Bir egzersiz bölümünün ilk yarısının işareti ön tarafıdır .

Bir egzersiz seti , aynı öncü tarafın birbirine eklenmiş olduğu sıfır veya daha fazla egzersiz parçasıdır.

Girdi olarak sıfır olmayan tam sayıların bir listesi verildiğinde, bunun bir egzersiz seti olup olmadığını belirleyin. Tam sayılar mutlaka benzersiz değildir. Listenin uzunluğu her zaman eşit olmayabilir.

Çözümünüz standart boşlukların hiçbirini kullanmayabilir . Çıktı için iki farklı tutarlı değer kullanabilirsiniz. Bu , bu yüzden en kısa çözüm kazanır.

Örnekler

[-5, -1, -7, -6, -5, 5, 1, 7, 6, 5]egzersiz kısmına bir örnektir. İlk yarı, [-5, -1, -7, -6, -5]son yarı ise [5, 1, 7, 6, 5], ilk yarıdaki her tam sayı reddedilir. Ayrıca, ilk yarının tamsayıları aynı işarettir. Bu egzersiz bölümünün önde gelen tarafı -1.

[3, 6, 5, -3, -6, -5, 1, 6, 4, 3, -1, -6, -4, -3]egzersiz setine bir örnektir. Onun bireysel egzersiz parçalardır [3, 6, 5, -3, -6, -5]ve [1, 6, 4, 3, -1, -6, -4, -3]ve ikisi de öncü tarafı var 1.

[4, -4, -5, 5], sadece geçerli egzersiz parçalarından oluşmasına rağmen, bir egzersiz seti değildir, çünkü birinci kısım [4, -4]lider tarafı 1, ikinci kısım [-5, 5]lider tarafı vardır -1.

Test senaryoları

Geçerli test senaryoları:

[]
[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]

Geçersiz test örnekleri:

[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]

3
Boş dava bir sıkıntıdır. Ve meydan okuma sözlerini yorumlamak için "hiç egzersiz yapmamak" için bir tarafa ya da diğer tarafa "bu bir egzersiz seti mi?" Ama dürüst olmak gerekirse, sadece sızlanıyorum.
ngm

@ngm Bu konuda yorum yapmak üzereydi .. Boş liste sinir bozucu bir durumdur .. Şahsen ben girdinin en az bir öğe içerdiğini söyleyebilirim. Ancak bu güzel meydan okuma dışında!
Kevin Cruijssen

1
@ngm Bu boş gerçeklerle doğrudur. Uygun bir rahatlama olduğunu düşünün. ;)
Outgolfer Erik

2
Aynı anda golf ve egzersiz yapabileceğimi bilmek güzel.
ngm

@ngm " Aynı anda golf ve egzersiz yapabileceğimi bilmek güzel. " Bu tür zorluklardan daha fazlasını aldık . ;)
Kevin Cruijssen

Yanıtlar:




3

Java 8, 186 183 185 bayt

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;}

3 boyutlu test senaryoları için hata düzeltmesi nedeniyle +2 bayt ( TIO bağlantımın neredeyse tüm permütasyonları 1ve -1sonunda).

Kesinlikle golf olabilir .. Zorluk noktaya görünüyor, ama uygulamak oldukça zor. Özellikle test durumu [4,-4,-5,5]düzeltmek için can sıkıcıydı .. Ama şimdi çalışıyor. Buradan golf oynayacak.

Çevrimiçi deneyin.

Açıklama:

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)

3

R , 91 bayt

Boşlukla ayrılmış bir sayı vektörü girer. FALSEGeçerli ve TRUEgeçersiz çıktılar .

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 bu durumda pozitif ve negatif değerler dizisinin çalışma uzunluğu kodlamasını verir.

Tam olarak ve tamamen haksız boş kenarı durumda;) bir kuyruklu 15 bayt ekler.

@Giuseppe tarafından birçok bayt tıraş edildi.

Test için daha iyi bir işlev olarak ifade edilen 92 baytlık bir sürüm:

Çevrimiçi deneyin!


3

JavaScript (ES6), 54 bayt

Dennis'in Python cevabından esinlenerek optimize edilmiş versiyon .

0 veya 1 değerini döndürür .

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

Çevrimiçi deneyin!


Orijinal sürüm, 74 bayt

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]

Çevrimiçi deneyin!

Nasıl?

İşaret her değiştiğinde tüm egzersiz parçalarının ilk yarısını b [0] ve ikinci yarısını b [1] ' de saklayarak b [0] ve b [1] arasında değiştiririz. Girişler burçtan kurtulmak için kare haline getirilir. Her girişe virgül ön eki ekler ve her bölüme virgül ekleriz 0 .

'Boş giriş' kenar kasasını temelde ücretsiz olarak ele almak için ekstra bir mantık vardır (kaynak kodun sonuna yakın açıklamaya bakın).

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]

2

Python 2 , 147 130 113 112 106 bayt

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]

Çevrimiçi deneyin!


Kaydedilen:

  • -27 bayt, Dennis sayesinde

2
lambda n:cmp(n,0)olabilir 0 .__cmp__. all(a==b for a,b in zip(l[::2],l[1::2]))olabilir l[:-1:2]==l[1::2].
Dennis

2

Retina 0.8.2 , 57 bayt

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

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

Çevrimiçi deneyin! Virgülle ayrılmış girdi alır, ancak bağlantı test senaryolarını işleyen başlığı içerir. Açıklama:

^\b|,\b
$&=

Her pozitif tamsayıdan önce bir işaretleyici ekleyin.

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

Aynı işaretin tamsayıları arasındaki virgülleri alt çizgilere değiştirin.

-|=

Kalan işaretleri silin.

.$
$&,

Giriş boş değilse virgül ekleyin.

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

Dizenin, aynı tamsayıların çalışma çiftlerinden oluştuğunu kontrol edin.



1

JavaScript (Node.js) , 155 bayt

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

Çevrimiçi deneyin!


İlham @ KevinCruijssen'in cevabıydı

Ayrıca 2 test vakamı düzelttiği için ona teşekkürler


Senin benim Java cevap ilham olduğundan, değişmelidir r=0<iiçin r=i%2test durumları beri [1,-1,1]ve [-1,1,-1]şu anda çöküyor. Yine de bayt sayısı JS için aynı kalır.
Kevin Cruijssen

@KevinCruijssen: Teşekkürler, bitti
Muhammad Salman


1

Brachylog , 18 14 bayt

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

Çevrimiçi deneyin!

@ErikTheOutgolfer sayesinde 4 bayt kaydedildi.

açıklama

                    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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.