Cantor generalizzato imposta le lunghezze dei segmenti


17

Problema

Definiamo un set di Cantor generalizzato eliminando iterativamente alcuni segmenti di lunghezza razionale dalla metà di tutti gli intervalli che non sono stati ancora eliminati, a partire da un singolo intervallo continuo.

Date le lunghezze relative dei segmenti da eliminare o meno e il numero di iterazioni da fare, il problema è scrivere un programma o una funzione che generi le lunghezze relative dei segmenti che sono stati o non sono stati eliminati dopo le niterazioni.

Esempio 3,1,1,1,2

Esempio: eliminare in modo iterativo il 4o e il 6o ottavo

Ingresso:

n - numero di iterazioni, indicizzate a partire da 0 o 1

l- elenco delle lunghezze di segmento come numeri interi positivi con gcd(l)=1e lunghezza dispari, che rappresentano le lunghezze relative delle parti che rimangono così come sono o vengono eliminate, a partire da un segmento che non viene eliminato. Poiché la lunghezza dell'elenco è dispari, il primo e l'ultimo segmento non vengono mai eliminati. Ad esempio per il normale set di Cantor questo sarebbe [1,1,1] per un terzo che rimane, un terzo che viene eliminato e ancora un terzo che non lo fa.

Produzione:

Lista interi o, gcd(o)=1di lunghezze di segmento relativi nel nesima iterazione quando i segmenti che non sono stati eliminati nell'iterazione precedente sono sostituiti da una copia in scala della lista l. La prima iterazione è giusta [1]. È possibile utilizzare qualsiasi metodo di output non ambiguo , anche unario.

Esempi

n=0, l=[3,1,1,1,2] →                 [1]
n=1, l=[3,1,1,1,2] →     [3,    1,    1,    1,    2]
n=2, l=[3,1,1,1,2] → [9,3,3,3,6,8,3,1,1,1,2,8,6,2,2,2,4]

n=3, l=[5,2,3]     → [125,50,75,100,75,30,45,200,75,30,45,60,45,18,27]
n=3, l=[1,1,1]     → [1,1,1,3,1,1,1,9,1,1,1,3,1,1,1]

Si può presumere che l'input sia valido. Questo è , quindi vince il programma più breve misurato in byte.


Sarebbe accettabile inserire e produrre gli indici dei segmenti non eliminati anziché le lunghezze? Ad esempio, [0, 1, 2, 4, 6, 7]invece di [3, 1, 1, 1, 2]?

@Mnemonic non è troppo lontano dall'unario, quindi direi che va bene.
Angs,

Potresti aggiungere uno (o più) casi di test per liste di input di dimensioni pari?
Kevin Cruijssen,

1
@KevinCruijssen gli elenchi di input sono garantiti di dimensioni dispari
Angs

Risposte:


6

Gelatina ,  15 13  12 byte

-2 grazie a Dennis (l'uso di un collegamento piuttosto che una catena ne consente l'uso implicito da parte ¡; non è necessario racchiuderlo 1in un elenco a causa del fatto che Jelly stampa elenchi di un oggetto uguale all'elemento)
-1 grazie a Erik the Outgolfer (usare Ɗper salvare la newline dall'uso Ç)

1×€³§JḤ$¦ẎƊ¡

Un programma completo che stampa un elenco in formato Jelly (così [1]viene stampato come 1)

Provalo online!

Come?

1×€³§JḤ$¦ẎƊ¡ - Main link: segmentLengths; iterations
1            - literal 1 (start with a single segment of length 1)
           ¡ - repeat...
             - ...times: implicitly use chain's right argument, iterations
          Ɗ  - ...do: last 3 links as a monad (with 1 then the previous output):
   ³         - (1) program's 3rd argument = segmentLengths
 ×€          -  1  multiply €ach (e.g. [1,2,3] ×€ [1,2,1] = [[1,4,3],[2,4,2],[3,6,3]])
        ¦    -  2  sparse application... 
       $     - (2) ...to: indices: last two links as a monad:
     J       - (2)          range of length = [1,2,3,...,numberOfLists]
      Ḥ      - (2)          double            [2,4,6,...] (note: out-of bounds are ignored by ¦)
    §        - (2) ...of: sum each (i.e. total the now split empty spaces)
         Ẏ   -  3  tighten (e.g. [[1,2,3],4,[5,6,7]] -> [1,2,3,4,5,6,7])
             - implicit print



4

Haskell , 76 58 byte

l%0=[1]
l%n=do(x,m)<-l%(n-1)`zip`cycle[l,[sum l]];map(*x)m

Provalo online!

La funzione (%)accetta l'elenco di lunghezze di riga lcome primo argomento e il numero di iterazioni ncome secondo input.

Grazie ad Angs e Ørjan Johansen per -18 byte!


Dovresti essere in grado di salvare almeno 7 byte passando a una ricorsione ne rilasciando del #tutto
Angs

Indipendentemente dal suggerimento di @Angs, l'originale %può essere abbreviato in l%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m .
Ørjan Johansen

3

JavaScript (Firefox 42-57), 80 byte

f=(n,l,i=0)=>n--?[for(x of l)for(y of(i^=1)?f(n,l):[eval(l.join`+`)**n])x*y]:[1]

Ha bisogno di quelle versioni specifiche perché utilizza sia la comprensione dell'array che l'esponenziazione.



2

Java 10, 261 byte

L->n->{if(n<1){L.clear();L.add(1);}else if(n>1){var C=new java.util.ArrayList<Integer>(L);for(int l=C.size(),i,x,t,s;n-->1;)for(i=x=0;i<L.size();){t=L.remove(i);if(i%2<1)for(;i%-~l<l;)L.add(i,C.get((i++-x)%l)*t);else{x++;s=0;for(int c:C)s+=c;L.add(i++,t*s);}}}}

Modifica l'elenco di input invece di restituirne uno nuovo per salvare i byte.

Provalo online.

L->n->{                       // Method with List and integer parameters and no return-type
  if(n<1){                    //  If `n` is 0:
    L.clear();                //   Remove everything from the List
    L.add(1);}                //   And only add a single 1
                              //  Else-if `n` is 1: Leave the List as is
  else if(n>1){               //  Else-if `n` is 2 or larger:
    var C=new java.util.ArrayList<Integer>(L);
                              //   Create a copy of the input-List
    for(int l=C.size(),       //   Set `l` to the size of the input-List
        i,x,t,s;              //   Index and temp integers
        n-->1;)               //   Loop `n-1` times:
      for(i=x=0;              //    Reset `x` to 0
          i<L.size();){       //    Inner loop `i` over the input-List
        t=L.remove(i);        //     Remove the current item, saving its value in `t`
        if(i%2<1)             //     If the current iteration is even:
          for(;i%-~l<l;)      //      Loop over the copy-List
            L.add(i,C.get((i++-x)%l)*t);
                              //       And add the values multiplied by `t`
                              //       at index `i` to the List `L`
        else{                 //     Else (the current iteration is odd):
          x++;                //      Increase `x` by 1
          s=0;for(int c:C)s+=c;
                              //      Calculate the sum of the copy-List
          L.add(i++,t*s);}}}} //      Add this sum multiplied by `t`
                              //      at index `i` to the List `L`

2

Gelatina , 13 byte

Ø1××S¥ƭ€³Ẏ$¡Ṗ

Provalo online!

Programma completo. Output 1invece di [1]. In modo fastidioso, non funziona come ×S¥in questo contesto e ƭnon funziona bene con nilads. > _ <



2

K (ngn / k) , 27 byte

{x{,/y*(#y)#x}[(y;+/y)]/,1}

Provalo online!

{ }è una funzione con argomenti xey

(y;+/y)una coppia di ye la sua somma

{ }[(y;+/y)]proiezione (alias curry o applicazione parziale) di una funzione diadica con un argomento. xsarà (y;+/y)e ysarà l'argomento una volta applicato.

,1 elenco singleton contenente 1

x{ }[ ]/applicare i xtempi di proiezione

(#y)#xrimodellare alla lunghezza del risultato corrente, ovvero alternare tra l'esterno ye la sua somma

y* moltiplicare ogni elemento di quanto sopra per l'elemento corrispondente del risultato corrente

,/ concatenare



1

Pyth , 20 byte

us.e?%k2*bsQ*LbQGE]1

L'input è un array di segmenti l, quindi iterazioni n. Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

us.e?%k2*bsQ*LbQGE]1   Implicit, Q=1st arg (segment array), E=2nd arg (iterations)
u                E     Execute E times, with current value G...
                  ]1   ... and initial value [1]:
  .e            G        Map G, with element b and index k:
        *bsQ               Multiply b and the sum of Q {A}
            *LbQ           Multiply each value of Q by b {B}
    ?%k2                   If k is odd, yield {A}, otherwise yield {B}
 s                       Flatten the resulting nested array
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.