エクササイズセットですか?


16

多くのエクササイズが体の半分にしか影響を与えないことは誰もが知っていることなので、片側に1回ずつ2回行う必要があります。そのようなエクササイズには、左側と右側の2つのカウンターパートがあります。ただし、両側のエクササイズが同じ順序である限り、2つのカウンターパートを連続して実行する必要はありません。エクササイズプログラムでサイドを切り替えることもできますが、一方の側でいくつかのエクササイズを開始し、もう一方の側でいくつかのエクササイズを開始するのは意味がありません。

チャレンジ

運動部は、その後半がネゲート最初の半分の整数のと同じ順序で構成された非ゼロの整数のリストであり、各半分の整数の符号は同じです。エクササイズパートの前半のサインはそのリーディングサイドです。

運動セットは一緒に連結同じリーディング側とのゼロ以上の運動部です。

入力としてゼロ以外の整数のリストを指定して、それが運動セットかどうかを判断します。整数は必ずしも一意ではありません。リストの長さは必ずしも均等ではありません。

ソリューションでは、標準の抜け穴を使用しない場合があります。出力には、2つの異なる一貫した値を使用できます。これはであるため、最短のソリューションが優先されます。

[-5, -1, -7, -6, -5, 5, 1, 7, 6, 5]運動部の一例です。前半はで[-5, -1, -7, -6, -5]、後半はで、前半の[5, 1, 7, 6, 5]各整数は否定されます。さらに、前半の整数はすべて同じ符号です。このエクササイズパートのリーディングサイドは-1です。

[3, 6, 5, -3, -6, -5, 1, 6, 4, 3, -1, -6, -4, -3]エクササイズセットの例です。その個々のエクササイズ部分は[3, 6, 5, -3, -6, -5]and [1, 6, 4, 3, -1, -6, -4, -3]であり、両方ともリーディングサイドを持ってい1ます。

[4, -4, -5, 5]、有効なエクササイズパーツのみで構成されていますが、エクササイズセットではありません。最初のパート[4, -4]にはリーディングサイド1があり、2番目のパーツ[-5, 5]にはリーディングサイドがあるため-1です。

テストケース

有効なテストケース:

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

無効なテストケース:

[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
空のケースは迷惑です。そして、チャレンジの言葉を解釈するために、「まったく運動しない」を「運動セットですか?」のどちらか一方に割り当てる有効な方法があるかどうかわかりません。しかし、正直なところ、私はただ泣き言を言っています。
ngm

@ngmはこれについてコメントしようとしていました。空のリストは厄介なエッジケースです。個人的には、入力に少なくとも1つの項目が含まれていると述べます。しかし、その素晴らしい挑戦は別として!
ケビンクルーイッセン

1
@ngmそれは空虚な真実という用語で真実です。適切なリラクゼーションであると考えてください。;)
エリック・ザ・アウトゴルファー

2
ゴルフとエクササイズを同時にできることを知ってうれしいです。
ngm

@ngm「ゴルフとエクササイズを同時にできることを知ってうれしいです。そういったチャレンジが増えました。;)
ケビンクルーイッセン

回答:




3

Javaの8、186の 183 185バイト

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のテストケースのバグ修正により、+ 2バイト(ほとんどすべてのTIOリンクの順列1および-1末尾の順列)。

間違いなくゴルフをすることができます。課題は要点に見えますが、実装するのはかなり難しいです。特にテストケース[4,-4,-5,5]は修正するのが面倒でした。ここからゴルフをします。

オンラインでお試しください。

説明:

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バイト

空白で区切られた数値のベクトルを入力します。FALSE有効およびTRUE無効の出力。

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 この場合、正と負の値のシーケンスのランレングスエンコーディングを提供します。

完全かつ完全に不当空のエッジケース;)なんと15バイトを追加します。

@Giuseppeによって多くのバイトが削られました。

以下は、テストに適した関数として表現された92バイトのバージョンです。

オンラインでお試しください!


3

JavaScript(ES6)、54バイト

DennisのPython answerに触発された最適化バージョン。

0または1を返します。

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

オンラインでお試しください!


オリジナルバージョン、74バイト

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]

オンラインでお試しください!

どうやって?

すべてのエクササイズパートの最初の半分をb [0]に、2番目の半分をb [1]に格納し、符号が変わるたびにb [0]b [1]を切り替えます。エントリを削除してサインを取り除きます。各エントリの前にカンマを付け、各部分に0を付けます。

基本的に無料で「空の入力」エッジケースを処理するための追加のロジックがあります(ソースコードの末尾近くにあるコメントを参照)。

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

パイソン2147の 130 113 112 106バイト

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]

オンラインでお試しください!


保存済み:

  • -27バイト、デニスのおかげ

2
lambda n:cmp(n,0)になることができ0 .__cmp__ます。all(a==b for a,b in zip(l[::2],l[1::2]))になることができl[:-1:2]==l[1::2]ます。
デニス

2

Retina 0.8.2、57バイト

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

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

オンラインでお試しください!コンマ区切りの入力を受け取りますが、リンクにはテストケースを処理するヘッダーが含まれます。説明:

^\b|,\b
$&=

各正の整数の前にマーカーを挿入します。

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

同じ符号の整数間のコンマを下線に変更します。

-|=

残りの標識を削除します。

.$
$&,

入力が空でない場合は、コンマを追加します。

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

文字列が同じ整数の実行のペアで構成されていることを確認します。



1

JavaScript(Node.js)、155バイト

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

オンラインでお試しください!


インスピレーションは@KevinCruijssenの答えでした

私の2つのテストケースを修正してくれた彼にも感謝します


あなたのものは私のJavaの答えからインスピレーションを得ているので、テストケースで失敗しているため、に変更r=0<iする必要があります。ただし、バイトカウントはJSの場合と同じままです。r=i%2[1,-1,1][-1,1,-1]
ケビンクルーイッセン

@KevinCruijssen:ありがとう、できました
Muhammad Salman


1

Brachylog18 14バイト

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

オンラインでお試しください!

@ErikTheOutgolferのおかげで4バイト節約されました。

説明

                    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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.