Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで色付きの頂点正多角形から二等辺三角形の数を数えるプログラム


サイズnのバイナリ文字列として表されるn個の辺を持つ1つの正多角形があるとします。頂点は、青(0)または赤(1)のいずれかで色付けできます。時計回りに色付けされています。頂点が正多角形の頂点であり、色が同じである二等辺三角形の数を数える必要があります。

したがって、入力がpolygon ="111010"のような場合、出力は2になります。

Pythonで色付きの頂点正多角形から二等辺三角形の数を数えるプログラム

ACEとAFEの2つの三角形があります。

これを解決するには、次の手順に従います-

  • 関数all()を定義します。これにはnがかかります
  • n mod 2が1と同じ場合、no:=n *(n-1)/ 2
  • それ以外の場合、いいえ:=n *(n / 2-1)
  • n mod 3が0と同じ場合、no:=no --n / 3 * 2
  • 返品しない
  • 関数non()を定義します。これにはa、nが必要です
  • n mod 2が1と同じ場合、
    • s0:=0、s1:=0
    • i:=0
    • i
    • a[i]が'0'と同じ場合、s0:=s0 + 1
    • それ以外の場合、s1:=s1 + 1
    • i:=i + 1
  • s:=s0 * s1 * 6
  • n mod 3が0と同じ場合、
    • n1:=n / 3
    • n2:=n1 * 2
    • i:=0
    • i
    • a[i]がa[(i + n1)mod n]と同じでない場合、
      • s:=s-2
    • a[i]がa[(i + n2)mod n]と同じでない場合、
      • s:=s-2
    • i:=i + 1
  • それ以外の場合、
    • s00:=0、s01:=0、s10:=0、s11:=0、s:=0
    • i:=0
    • i
    • a[i]が'0'と同じ場合、s00:=s00 + 1
    • それ以外の場合はs01:=s01 + 1
    • i:=i + 2
  • i:=1
  • i
  • a[i]が'0'と同じ場合、s10:=s10 + 1
  • それ以外の場合はs11:=s11 + 1
  • i:=i + 2
  • s:=s + s00 * s01 * 8
  • s:=s + s10 * s11 * 8
  • s:=s + s00 * s11 * 4
  • s:=s + s10 * s01 * 4
  • n1:=n / 2
  • i:=0
  • i
  • a[i]がa[(i + n1)mod n]と同じでない場合、
    • s:=s-2
  • i:=i + 1
  • n mod 3が0と同じ場合、
    • n1:=n / 3
    • n2:=n1 * 2
    • i:=0
    • i
    • a[i]がa[(i + n1)mod n]と同じでない場合、
      • s:=s-2
    • a[i]がa[(i + n2)mod n]と同じでない場合、
      • s:=s-2
    • i:=i + 1
  • return s / 2
  • メインの方法から、次の手順を実行します-
  • n:=ポリゴンのサイズ
  • no:=all(n)-non(polygon、n)/ 2
  • 返品しない
  • 理解を深めるために、次の実装を見てみましょう-

    def all(n):
       if n % 2 == 1:
          no = n*(n-1)/2
       else:
          no = n*(n/2-1)
       if n % 3 == 0:
          no -= n/3*2
       return no
    
    def non(a,n):
       if n % 2 == 1:
          s0 = s1 = 0
          i = 0
          while i < n:
             if a[i] == '0':
                s0 += 1
             else:
                s1 += 1
             i += 1
          s = s0*s1*6
          if n % 3 == 0:
             n1 = n/3
             n2 = n1*2
             i = 0
             while i<n:
                if a[i] != a[int((i+n1)%n)]:
                   s -= 2
                if a[i] != a[int((i+n2)%n)]:
                   s -= 2
                i += 1
       else:
          s00 = s01 = s10 = s11 = s = 0
          i = 0
          while i <n:
             if a[i] == '0':
                s00 += 1
             else:
                s01 += 1
             i += 2
          i = 1
          while i < n:
             if a[i] == '0':
                s10 += 1
             else:
                s11 += 1
             i += 2
          s += s00 * s01 * 8
          s += s10 * s11 * 8
          s += s00 * s11 * 4
          s += s10 * s01 * 4
          n1 = n/2
          i = 0
          while i < n:
             if a[i] != a[int((i + n1)%n)]:
                s -= 2
             i += 1
          if n % 3 == 0:
             n1 = n/3
             n2 = n1*2
             i = 0
             while i < n:
                if a[i] != a[int((i+n1)%n)]:
                   s -= 2
                if a[i] != a[int((i+n2)%n)]:
                   s -= 2
                i += 1
       return s/2
    
    def solve(polygon):
       n = len(polygon)
       no = all(n) - non(polygon,n)/2
       return int(no)
    
    polygon = "111010"
    print(solve(polygon))

    入力

    1, 1000

    出力

    2

    1. Pythonで各ブラケットの深さの文字数をカウントするプログラム

      「X」、「(」、および「)」の3文字のみで構成される文字列sがあるとします。文字列にはバランスの取れた角かっこがあり、いくつかの「X」の間に入れ子になった角かっこが再帰的に存在する可能性があります。ブラケットの各深さで、最も浅い深さから最も深い深さまで、「X」の数を見つける必要があります。 したがって、入力がs =(XXX(X(XX))XX)のような場合、出力は[5、1、2]になります。 これを解決するには、次の手順に従います- 深さ:=-1 out:=新しいリスト sの各cについて、 cが(と同じ場合、 深さ:=深さ+ 1 それ以外の場合、cが )と同じ場合、 深度

    2. PythonでnノードのBSTの数をカウントするプログラム

      n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr