Situasi yang rumit

35

Mengingat notasi Dowker tentang simpul dan tanda-tanda penyeberangannya, hitung polinomial braketnya.

Meskipun ada definisi yang lebih teknis, untuk tantangan ini cukup memikirkan simpul sebagai sesuatu yang dibuat secara fisik dengan menyatukan kedua ujung tali menjadi satu. Karena simpul ada dalam tiga dimensi, ketika kita menggambarnya di atas kertas, kita menggunakan diagram simpul - proyeksi dua dimensi di mana persilangannya persis dua garis, satu di atas dan satu di bawah.

masukkan deskripsi gambar di sini

Di sini (b) dan (c) adalah diagram yang berbeda dari simpul yang sama.

Bagaimana kita menggambarkan diagram simpul di atas kertas? Sebagian besar dari kita bukan Rembrandt, jadi kami mengandalkan notasi Dowker , yang berfungsi sebagai berikut:

Pilih titik awal sembarang pada simpul. Bergerak ke arah yang sewenang-wenang di sepanjang simpul dan beri nomor penyeberangan yang Anda temui, mulai dari 1, dengan modifikasi berikut: jika itu adalah bilangan genap dan Anda saat ini sedang melewati penyilangan, meniadakan angka genap itu. Akhirnya, pilih angka genap sesuai dengan 1, 3, 5, dll.

Mari kita coba sebuah contoh:

masukkan deskripsi gambar di sini

Pada simpul ini, kami memilih "1" sebagai titik awal kami dan terus bergerak ke atas dan ke kanan. Setiap kali kita melewati atau di bawah seutas tali, kita menetapkan titik persimpangan nomor alami berikutnya. Kami meniadakan angka genap yang sesuai dengan untaian yang melewati persimpangan, misalnya [3,-12]dalam diagram. Jadi, diagram ini akan diwakili oleh [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]. Mendaftar teman dari 1, 3, 5, 7, dll memberi kita [6,-12,2,8,-4,-10].

Ada beberapa hal yang perlu diperhatikan di sini. Pertama, notasi Dowker tidak unik untuk simpul yang diberikan, karena kita dapat memilih titik awal dan arah yang sewenang-wenang. Tetapi, mengingat notasi, seseorang dapat sepenuhnya menentukan struktur simpul (secara teknis, hingga refleksi dari komponen simpul utama). Meskipun tidak semua notasi Dowker dapat membentuk simpul yang mungkin, dalam masalah ini Anda dapat mengasumsikan bahwa input mewakili simpul yang sebenarnya.

Untuk menghindari ambiguitas antara refleksi simpul, dan untuk membuat tantangan lebih mudah diselesaikan, Anda juga akan diberikan daftar tanda persimpangan sebagai input.

masukkan deskripsi gambar di sini

Dalam persilangan positif, garis bawah mengarah ke kiri dari sudut pandang garis atas. Pada persimpangan negatif, ia menuju ke kanan. Perhatikan bahwa membalik arah berputar di sekitar simpul (yaitu membalikkan garis over dan under line) tidak mengubah tanda silang. Dalam contoh kita tanda-tanda persimpangan adalah [-1,-1,-1,1,-1,1]. Mereka diberikan dalam urutan yang sama dengan notasi Dowker, yaitu untuk penyeberangan bernomor 1, 3, 5, 7, dll.

SEBUAH

DD

masukkan deskripsi gambar di sini

  1. Satu-satunya loop tanpa persimpangan memiliki polinomial 1.

  2. Jika kita memiliki diagram yang terdiri dari DDD(-SEBUAH2-SEBUAH-2)

  3. Dmasukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Pada gambar di atas, persilangan garis besar pada diagram pertama, yang berbentuk masukkan deskripsi gambar di sini, dapat ditransformasikan menjadi masukkan deskripsi gambar di siniseperti pada gambar kedua (alias perataan positif ), atau masukkan deskripsi gambar di siniseperti pada gambar ketiga ( perataan negatif ).

SEBUAHSEBUAH-1

masukkan deskripsi gambar di sini

Bingung belum? Mari kita lakukan sebuah contoh, mencoba menemukan polinomial braket dari masukkan deskripsi gambar di sini(Catatan: ini adalah dua simpul yang dihubungkan bersama. Diagram semacam ini tidak akan menjadi input potensial dalam tantangan ini karena input hanya akan menjadi simpul tunggal, tetapi mungkin muncul sebagai hasil antara dalam algoritme.)

Kami pertama kali menggunakan aturan 3

masukkan deskripsi gambar di sini

Kami menggunakan aturan 3 lagi pada kedua simpul baru

masukkan deskripsi gambar di sini

Kami mengganti 4 simpul baru ini ke dalam persamaan pertama.

masukkan deskripsi gambar di sini

Menerapkan aturan 1 dan 2 ke 4 ini memberi tahu kami

masukkan deskripsi gambar di sini

Jadi, ini beritahu kami

masukkan deskripsi gambar di sini

Selamat telah menyelesaikan pengantar singkat Anda untuk teori simpul!

Memasukkan

Dua daftar:

  • Notasi Dowker, mis [6,-12,2,8,-4,-10]. Penomoran persimpangan harus dimulai dari 1. Angka ganjil yang sesuai [1,3,5,7,...]adalah implisit dan tidak boleh diberikan sebagai input.

  • Tanda-tanda ( 1/ -1atau jika Anda lebih suka 0/ 1atau false/ trueatau '+'/ '-') untuk persimpangan sesuai dengan notasi Dowker, misalnya [-1,-1,-1,1,-1,1].

Alih-alih sepasang daftar, Anda bisa memiliki daftar pasangan, misalnya [[6,-1],[-12,-1],...

Keluaran

SEBUAH-2+5+SEBUAH-SEBUAH3[[1,-2],[5,0],[1,1],[-1,3]]

-k...kkN[0,1,0,5,1,0,-1]SEBUAH0

Aturan

Ini adalah tantangan . Tidak ada celah standar yang dapat digunakan, dan perpustakaan yang memiliki alat untuk menghitung notasi Dowker, atau polinomial Braket, tidak dapat digunakan. (Bahasa yang berisi pustaka-pustaka ini masih bisa digunakan, hanya saja bukan pustaka / paket).

Tes

// 4-tuples of [dowker_notation, crossing_signs, expected_result, description]
[
 [[],[],[[1,0]],"unknot"],
 [[2],[1],[[-1,3]],"unknot with a half-twist (positive crossing)"],
 [[2],[-1],[[-1,-3]],"unknot with a half-twist (negative crossing)"],
 [[2,4],[1,1],[[1,6]],"unknot with two half-twists (positive crossings)"],
 [[4,6,2],[1,1,1],[[1,-7],[-1,-3],[-1,5]],"right-handed trefoil knot, 3_1"],
 [[4,6,2,8],[-1,1,-1,1],[[1,-8],[-1,-4],[1,0],[-1,4],[1,8]],"figure-eight knot, 4_1"],
 [[6,8,10,2,4],[-1,-1,-1,-1,-1],[[-1,-7],[-1,1],[1,5],[-1,9],[1,13]],"pentafoil knot, 5_1"],
 [[6,8,10,4,2],[-1,-1,-1,-1,-1],[[-1,-11],[1,-7],[-2,-3],[1,1],[-1,5],[1,9]],"three-twist knot, 5_2"],
 [[4,8,10,2,12,6],[1,1,-1,1,-1,-1],[[-1,-12],[2,-8],[-2,-4],[3,0],[-2,4],[2,8],[-1,12]],"6_3"],
 [[4,6,2,10,12,8],[-1,-1,-1,-1,-1,-1],[[1,-10],[2,-2],[-2,2],[1,6],[-2,10],[1,14]],"granny knot (sum of two identical trefoils)"],
 [[4,6,2,-10,-12,-8],[1,1,1,1,1,1],[[1,-14],[-2,-10],[1,-6],[-2,-2],[2,2],[1,10]],"square knot (sum of two mirrored trefoils)"],
 [[6,-12,2,8,-4,-10],[-1,-1,-1,1,-1,1],[[1,-2],[1,6],[-1,10]],"example knot"]
]

Sumber daya eksternal

Tidak perlu untuk tantangan, tetapi jika Anda tertarik:


posting sandbox: 1 , 2

terima kasih @ChasBrown dan @ H.Wiz untuk menangkap kesalahan dalam definisi notasi Dowker saya

Don Thousand
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Mego
1
@ ngn: Jauh lebih baik! Saya menduga bahwa itulah yang dimaksud, tapi itu sedikit twister untuk mengekspresikan dengan benar. :)
Chas Brown

Jawaban:

10

K (ngn / k) , 196 193 byte

{!N::2*n:#x;{+/d,'x,'d:&:'-2!(|/n)-n:#:'x}(+/1-2*s){j::+,/y;,/(&0|2*x;(-1+#?{x[j]&:x@|j;x}/!N){-(d,x)+x,d:&4}/,1;&0|-2*x)}'(N!{(x,'|1+x;x+/:!2)}'((2*!n),'-1+x|-x)@'0 1=/:x>0)@'/:+~(y<0)=s:!n#2}

Cobalah online!

ngn
sumber
12

Brain-Flak , 1316 byte

(({})<({()<(({}<>))><>}){(({})[()()]<{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}>)}<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>{}{}(()){(<({}<({}<>)>)>)<>((){[()](<(({})<>){({}[({})]<>({}<>))}{}({}<>({}<{}<>{({}<>)<>}>)[()])<>({}({})[()])(([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}><>{()((<({}()[({}<>)])<>>))}{}<{}{}>)((){[()]<({}()<({}<({}<<>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}<>>)<>>)>)((){[()](<{}(({})<<>(({})<(<<>({}<<>({}<(()()){({}[()]<([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>)}{}>{})>)>)<>{}{({}<>)<>}<>([({}<>)]<((()))>)(())<>({}<>)<>{}({}[()]){<>({}<<>(()()){({}[()]<({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}(({})<<>({}<>)<>([{}])>)>)}{}{}>)<>({}<(({})())>[()]<>)}{}({}<<>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>{}{}{}>{})>)>)}{}){(<{}(({})<<>(({}{})<<>(<({}<>)>)<>{}{({}<>)<>}<>>(({}){}){})>)>)}>}{}){(<{}([{}]<({}<<>([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>({})({}){})>)>)}{}>)}{}){{}(([{}]){}<>{}{}<<>({}<>{}){([{}]({}()()<{}({}<>)(())<>>))}{}{}{}>{})(())<>{{}({}<>)(())<>}(<>)<>}{}}{}{}<>{}{}({}<{{}({}<>)(())<>}<>{{}{((<(())>))}{}}{}{{}({}<>)(())<>}>)<>{{}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}{}({}<>)<>}<>

Cobalah online!

Aku tidak menyesali apapun. Input adalah daftar pasangan yang rata.

# Part 1: extract edges
(({})<

({()<(({}<>))><>}){

(({})[()()]<

{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}

<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}

>)}

<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>

{}{}(())

# Part 2: Compute bracket polynomial
{

  # Move degree/sign to other stack
  (<({}<({}<>)>)>)<>

  # If current shape has crossings:
  ((){[()](<

    # Consider first currently listed edge in set
    # Find the other edge leaving same crossing
    (({})<>){({}[({})]<>({}<>))}{}

    # Move to top of other stack
    # Also check for twist
    ({}<>({}<{}<>{({}<>)<>}>)[()])

    # Check for twist in current edge
    <>({}({})[()])

    (

      # Remove current edge if twist
      ([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}>

      # Remove matching edge if twist
      <>{()((<({}()[({}<>)])<>>))}{}<{}{}>

    # Push 1 minus number of twists from current vertex.
    )

    # If number of twists is not 1:
    ((){[()]<

      # While testing whether number of twists is 2:
      ({}()<

        # Keep sign/degree on third stack:
        ({}<({}<

          # Duplicate current configuration
          <>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}

        # Push sign and degree on separate stacks
        <>>)<>>)

      # If number of twists is not 2: (i.e., no twists)
      >)((){[()](<{}

        # Make first copy of sign/degree
        (({})<<>(({})<

          # Make second copy of sign/degree
          (<<>({}<<>({}<

            # Do twice:
            (()()){({}[()]<

              # Prepare search for vertex leading into crossing on other side
              ([{}]()<>)

              # While keeping destination on third stack:
              <>({}<

                # Search for matching edge
                <>{({}({})<>[({}<>)])}{}

              # Replace old destination
              {}>)

              # Move back to original stack
              {({}<>)<>}<>

            >)}{}

          # Add orientation to degree
          >{})>)>)

          # Move duplicate to left stack
          <>{}{({}<>)<>}<>

          # Create "fake" edges from current crossing as termination conditions
          ([({}<>)]<((()))>)(())<>

          # Create representation of "top" new edge
          ({}<>)<>{}({}[()])

          # While didn't reach initial crossing again:
          {

            # Keep destination of new edge on third stack
            <>({}<<>

              # Do twice:
              (()()){({}[()]<

                # Search for crossing
                ({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}

                # Reverse orientation of crossing
                (({})<<>({}<>)<>([{}])>)

              >)}{}

              # Remove extraneous search term
              {}

            # Push new destination for edge
            >)

            # Set up next edge
            <>({}<(({})())>[()]<>)

          }

          # Get destination of last edge to link up
          {}({}<

            # Find edge headed toward original crossing
            <>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}

          # Replace destination
          {}{}>)

          # Move everything to left stack
          {({}<>)<>}

          # Clean up temporary data
          <>{}{}{}

        # Push new sign/degree of negatively smoothed knot
        >{})>)

      # Else (two twists)
      # i.e., crossing is the twist in unknot with one half-twist
      >)}{}){(<{}

        # Copy sign and degree+orientation
        (({})<<>(({}{})<

          # Move sign to left stack
          <>(<({}<>)>)

          # Move copy of configuration to left stack
          <>{}{({}<>)<>}

        # Add an additional 4*orientation to degree
        <>>(({}){}){})>)

      >)}

    # Else (one twist)
    >}{}){(<

      # Invert sign and get degree
      {}([{}]<({}<

        # Search term for other edge leading to this crossing
        <>([{}]()<>)

        # With destination on third stack:
        <>({}<

          # Find matching edge
          <>{({}({})<>[({}<>)])}{}

        # Replace destination
        {}>)

        # Move stuff back to left stack
        {({}<>)<>}<>

      # Add 3*orientation to degree
      >({})({}){})>)

    >)}{}

  # Else (no crossings)
  >)}{}){{}

    # If this came from the 2-twist case, undo splitting.
    # If this came from an initial empty input, use implicit zeros to not join anything
    # New sign = sign - 2 * next entry sign
    (([{}]){}<>{}{}<

      # New degree = average of both degrees
      <>({}<>{})

      # Find coefficient corresponding to degree
      {([{}]({}()()<{}({}<>)(())<>>))}{}{}

    # Add sign to coefficient
    {}>{})

    # Move rest of polynomial back to right stack
    (())<>{{}({}<>)(())<>}

    # Set up next configuration
    (<>)<>

  }{}

}{}{}<>{}

# Step 3: Put polynomial in correct form

# Keeping constant term:
{}({}<

  # Move to other stack to get access to terms of highest absolute degree
  {{}({}<>)(())<>}<>

  # Remove outer zeros
  {{}{((<(())>))}{}}

  # Move back to right stack to get access to lower order terms
  {}{{}({}<>)(())<>}

>)<>

# While terms remain:
{

  # Move term with positive coefficient
  {}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}

  # Move term with negative coefficient
  {}({}<>)<>

}<>
Nitrodon
sumber
Whoaaaaaa. Fantastis!!!! +1
Don Thousand
Saya merasa perlu membagikan hadiah lain
Don Thousand