Busur Derajat Jarang


12

Dengan bilangan bulat positif n, rancang busur derajat dengan jumlah tanda paling sedikit yang memungkinkan Anda mengukur semua sudut yang merupakan kelipatan integral 2π/n(masing-masing dalam satu pengukuran tunggal).

Detail

Sebagai output, Anda dapat menampilkan daftar bilangan bulat dalam rentang 0ke n-1(atau 1ke n) yang mewakili posisi setiap tanda. Atau Anda dapat menampilkan string / daftar panjang ndengan #di posisi masing-masing tanda dan _(garis bawah) di mana tidak ada. (Atau dua karakter berbeda jika lebih mudah.)
Contoh: Untuk n = 5Anda membutuhkan tepat 3 tanda untuk dapat mengukur semua sudut 2π/5, 4π/5, 6π/5, 8π/5, 2πdengan mengatur (misalnya) satu tanda pada 0, satu tanda pada 2π/5dan satu tanda pada 6π/5. Kami dapat menyandikan ini sebagai daftar [0,1,3]atau sebagai string ##_#_.

Contohnya

Perhatikan bahwa output tidak harus unik.

n:  output:
 1  [0]
 2  [0,1]
 3  [0,1]
 4  [0,1,2]
 5  [0,1,2]
 6  [0,1,3]
 7  [0,1,3]
 8  [0,1,2,4]
 9  [0,1,3,4]
10  [0,1,3,6]
11  [0,1,3,8]
20  [0,1,2,3,6,10]

PS: Ini mirip dengan masalah penggaris jarang , tetapi alih-alih skala linier (dengan dua ujung) kami menganggap skala melingkar (sudut).

PPS: Skrip ini harus menghitung satu contoh dari serangkaian tanda untuk masing-masing n. Cobalah online!

PPPS: Seperti yang ditunjukkan oleh @ngn, masalah ini setara dengan menemukan basis perbedaan minimal dari grup urutan siklik n. Pesanan minimal tercantum di http://oeis.org/A283297 dan beberapa batasan teoretis ditemukan di https://arxiv.org/pdf/1702.02631.pdf



Borderline dupe , dengan tumpang tindih tepat saat n = q^2 + q + 1untuk kekuatan utama q.
Peter Taylor

@ PeterTaylor Saya tidak melihat mengapa Anda pikir itu adalah penipuan. Dan bisakah Anda menguraikan dengan cara apa ada "tumpang tindih"? Meskipun ada kesamaan, ini adalah dua masalah yang sangat berbeda. Lebih lanjut, ini adalah kode-golf dan tantangan yang Anda tautkan bahkan tidak termasuk ukuran program dalam penilaiannya.
flawr

Mereka bukan dua masalah yang sangat berbeda. Baca tautan OEIS di PPPS Anda: "set perbedaan Singer" yang dimaksud adalah penguasa Golomb yang dihasilkan oleh metode bidang proyektif yang diterapkan dalam jawaban saya. Saya mengambil poin bahwa metode penilaian berbeda.
Peter Taylor

Jawaban:


4

Jelly , 13 byte

ŒPðṗ2I%QLðÐṀḢ

Cobalah online!

Bagaimana itu bekerja

ŒPðṗ2I%QLðÐṀḢ  Main link. Argument: n (integer)

ŒP             Powerset; generate all subsequences of [1, ..., n].
  ð       ÐṀ   Begin a dyadic chain. Call it with all subsequences S as left
               argument and n as right one. Return the array of all sequences for
               which the chain returns the maximal result, i.e., [0, ..., n-1].
   ṗ2              Cartesian power 2; generate all pairs of elements of S.
     I             Increments; map each pair [x, y] to [y-x].
      %            Map each [y-x] to [(y-x)%n].
       Q           Unique; deduplicate the array of modular difference singletons.
        L          Take the length.
         ð     Begin a new, dyadic chain.
               Left argument: S' (filted subsequences). Right argument: n
            Ḣ  Take the first element of S'.
               Since S was sorted by length, so is S', so the first element of S'
               is the shortest subsequence that satisfies the condition.

4

MATL , 20 byte

:qGZ^!"G:q@&-G\m?@u.

Ini kehabisan memori pada TIO untuk input di luar 8.

Cobalah online!

Bagaimana itu bekerja

Ini menghasilkan kekuatan Cartesian [0 1 ... n-1]dengan eksponen n, dan menggunakan loop untuk menguji setiap tuple Cartesian. Tes terdiri dalam menghitung semua perbedaan berpasangan elemen jika tupel, dan melihat jika perbedaan modulo ntermasuk semua nomor 0, 1, ..., n-1.

Segera setelah tuple Cartesian memenuhi persyaratan ditemukan loop keluar, dan entri unik dalam tuple dicetak sebagai solusi.

Ini berfungsi karena mengingat u > v , satu set tupel yang cukup dengan u entri unik dijamin akan diuji lebih awal daripada tupel dengan v entri unik. "Set yang memadai" berarti bahwa jika tidak ada tupel dalam set tersebut yang merupakan solusi, maka tidak ada tuple lain dengan jumlah entri unik yang sama adalah solusi.

Misalnya, untuk n = 3tupel Cartesian adalah seperti yang ditunjukkan di bawah ini, di mana setiap baris adalah tupel:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
 ···
2 2 1
2 2 2
  • Tupel pertama 0 0 0,, adalah satu-satunya tuple yang relevan dengan 1nilai unik. Bahkan jika 1 1 1dan 2 2 2akan muncul jauh kemudian, 0 0 0adalah solusi jika dan hanya jika ada. Jadi set singleton yang dibentuk oleh tuple 0 0 0adalah set yang cukup untuk u = 1.
  • Tuple kedua dan ketiga, yaitu 0 0 1dan 0 0 2, membentuk set yang cukup untuk u = 2; yaitu, mereka menutupi semua kasing dengan 2nilai unik. Tuple keempat,, 0 1 0tidak akan pernah dipilih sebagai solusi, karena 0 0 1akan telah diuji terlebih dahulu. Demikian pula, tuple 0 2 0tidak akan pernah dipilih karena muncul paling lambat 0 0 2. Tuples seperti 2 2 1tidak akan pernah dipilih sebagai solusi karena 0 0 1setara (modulo ndan hingga nilai duplikat) dan muncul terlebih dahulu.
  • Dll

Kode yang dikomentari:

:q         % Push [0 1 ... n-1], where n is the input (implicit)
GZ^        % Cartesian power with exponent n. Gives an (n^n) × n matrix
           % where each row is a Cartesian tuple
!          % Transpose. Now each Cartesian tuple is a column
!"         % For each column (that is, each Cartesian tuple)
  G:q      %   Push [0 1 ... n-1] (*)
  @        %   Push current column
  &-       %   Matrix of pairwise differences (**)
  G\       %   Modulo n, element-wise
  m        %   Ismember function: for each entry in (*), gives true iff
           %   it is present in (**)
  ?        %   If all entries are true
    @      %     Push current column
    u      %     Unique entries. This is the solution
    .      %     Break loop
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

3

Stax , 26 21 byte

Åæ4&╕u◙╩►s∙Φ▬═(0~ d+Q

Jalankan dan debug online!

Saat ini versi online gagal untuk input 20tetapi bug ini telah diperbaiki dan belum akan digunakan untuk penerjemah online yang Digunakan. Hati-hati, butuh waktu untuk menjalankan 20kasing.

Penjelasan

Ternyata karena perbedaan cara berpasangan dihitung, saya tidak perlu khawatir tentang kesetaraan kdan di x-ksini. Menyimpan 5 byte.

Gunakan versi yang belum dibongkar untuk menjelaskan.

rS{%o~{;i@c:2{E-x%mu%x<wm
r                            [0..`x`], where `x` is input
 S                           Powerset
  {%o~                       Sort by length
      {;i@             w     For each element in the powerset
          c:2                All pairs
             {    m          Map each pair `[p,q] to
              E-                 `q-p`
                x%               `(q-p)%x`
                   u%        Count of unique modulo differences
                     x<      Loop until the count of unique modulo differences is larger than the input(`n`)
                             Now we have found a valid set in the powerset
                        m    Output the members of the set,one element per line.

Dengan memberlakukan persyaratan yang 0dan 1keduanya menjadi anggota dari jawaban, kita dapat menghasilkan PowerSet dengan [2..x]alih - alih [0..x]lalu menambahkan 0dan 1secara manual ke setiap elemen di PowerSet. Ini lebih efisien tetapi perlu menangani input 1khusus dan biaya lebih banyak byte.



0

Python 2 , 148 byte

from itertools import*
def f(n):
 r=range(n)
 for i in r:
  for p in combinations(r,i+1):
   if all(any((y+x)%n in p for y in p)for x in r):return p

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.