Goniometro rado


12

Dato un numero intero positivo n, progettare un goniometro con il minor numero di segni che consente di misurare tutti gli angoli che sono un multiplo integrale di 2π/n(ciascuno in una singola misura).

Dettagli

Come output, è possibile generare un elenco di numeri interi nell'intervallo 0a n-1(o 1a n) che rappresentano la posizione di ciascun segno. In alternativa è possibile generare una stringa / elenco di lunghezza ncon #a nella posizione di ciascun segno e un _(trattino basso) dove non ce n'è. (O due caratteri diversi, se più conveniente.)
Esempio: per n = 5avere bisogno di esattamente 3 segni per poter misurare tutti gli angoli 2π/5, 4π/5, 6π/5, 8π/5, 2πimpostando (per esempio) un segno su 0, un segno su 2π/5e un segno su 6π/5. Possiamo codificarlo come un elenco [0,1,3]o come una stringa ##_#_.

Esempi

Si noti che le uscite non sono necessariamente uniche.

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: Questo è simile al problema dei righelli sparsi , ma invece di una scala lineare (con due estremità) consideriamo una scala circolare (angolare).

PPS: questo script dovrebbe calcolare un esempio di un insieme di segni per ciascuno n. Provalo online!

PPPS: Come sottolineato da @ngn, questo problema equivale a trovare una base di differenza minima di un gruppo di ordini ciclico n. Gli ordini minimi sono elencati in http://oeis.org/A283297 e alcuni limiti teorici si trovano in https://arxiv.org/pdf/1702.02631.pdf



Borderline dupe , con sovrapposizione esatta n = q^2 + q + 1per potenza primaria q.
Peter Taylor,

@PeterTaylor Non vedo perché pensi che sia un imbecille. E puoi elaborare in che modo c'è una "sovrapposizione"? Anche se ci sono somiglianze, questi sono due problemi molto diversi. Inoltre, si tratta di code-golf e la sfida che hai collegato non include nemmeno la dimensione del programma nel suo punteggio.
flawr

Non sono due problemi molto diversi. Leggi il link OEIS nel tuo PPPS: il "set di differenze di Singer" a cui fa riferimento è proprio il righello Golomb generato dal metodo del campo proiettivo implementato nella mia risposta. Prendo il punto che il metodo di punteggio è diverso.
Peter Taylor,

Risposte:


4

Gelatina , 13 byte

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

Provalo online!

Come funziona

Œ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.

Questo esaurisce la memoria su TIO per gli input oltre 8.

Provalo online!

Come funziona

Questo genera il potere cartesiano di [0 1 ... n-1]esponente ne usa un ciclo per testare ogni tupla cartesiana. La prova consiste nel calcolare tutte le differenze a coppie di elementi, se la tupla, e vedere se tali differenze modulo ncomprendono tutti i numeri 0, 1, ..., n-1.

Non appena viene trovata una tupla cartesiana che soddisfa la condizione, il ciclo viene chiuso e le voci uniche in quella tupla vengono stampate come soluzione.

Ciò funziona perché, dato che u > v , un set sufficiente di tuple con u voci uniche è garantito per essere testato prima di qualsiasi tupla con v voci uniche. Un "set sufficiente" significa che se nessuna delle tuple in quel set è una soluzione, nessun'altra tupla con lo stesso numero di voci univoche è una soluzione.

Ad esempio, per n = 3le tuple cartesiane sono come mostrato di seguito, dove ogni riga è una tupla:

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
  • La prima tupla, 0 0 0è l'unica tupla rilevante con 1un valore univoco. Anche se 1 1 1e 2 2 2apparirà molto più tardi, 0 0 0è una soluzione se e solo se quelli lo sono. Quindi l'insieme singleton formato dalla tupla 0 0 0è un insieme sufficiente per u = 1.
  • La seconda e la terza tupla, ovvero 0 0 1e 0 0 2, formano un insieme sufficiente per u = 2; cioè coprono tutti i casi con 2valori univoci. La quarta tupla, 0 1 0non sarà mai selezionata come soluzione, perché 0 0 1sarà stata testata per prima. Allo stesso modo, la tupla 0 2 0non verrà mai selezionata perché appare dopo 0 0 2. Tuple come 2 2 1non verranno mai selezionate come soluzione perché 0 0 1è equivalente (modulo ne fino a valori duplicati) e appare per primo.
  • Eccetera.

Codice commentato:

: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

Esegui ed esegui il debug online!

In questo momento la versione online non riesce per l'input, 20ma questo errore è stato corretto e deve ancora essere distribuito all'interprete online Distribuito. Attenzione, ci vuole del tempo per eseguire il 20caso.

Spiegazione

Si scopre che a causa del modo in cui viene calcolata la differenza a coppie, non devo preoccuparmi dell'equivalenza di ke x-kqui. Salvataggio di 5 byte.

Usa la versione decompressa per spiegare.

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.

Applicando il requisito che 0ed 1entrambi siano membri della risposta, possiamo generare il powerset con [2..x]invece di [0..x]e quindi aggiungere 0e 1manualmente a ogni elemento nel powerset. È più efficiente ma deve gestire l'input in modo 1speciale e costa più 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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.