Secuencias Generalizadas de Treinta y Ocho

17

Adaptado de este acertijo FiveThirtyEight .

Antecedentes

Examine la siguiente secuencia infinita:

3 3 3 2 3 3 3 2 3 3 3 2 3 3 2 3 3 3 2 ...

Digamos que la secuencia está indexada en 1. El inúmero th en la secuencia determina cuántos 3s hay antes del ith 2y después de cualquier 2s anterior . Entonces, dado que la secuencia comienza con a, 3la secuencia debe comenzar 3 3 3 2y dado que hay tres 3s al comienzo de la secuencia, la subsecuencia 3 3 3 2debe repetirse tres veces. Después de eso alcanzas 3 3 2porque el cuarto número en la secuencia es 2.

El enigma FiveThirtyEight pregunta por el límite de las razones de tres a dos (que no voy a estropear aquí) pero también puede preguntar cuál es la relación acumulativa después del índice i. Por ejemplo, la relación en i=4es 3/1 = 3y en i=15es 11/4 = 2.75.

Seamos generales

Dados los números ny kpodemos hacer una secuencia similar que comience con ny tal como se describe en la secuencia original, el número en el índice idetermina cuántos ns aparecen antes del ith ky después de cualquier ks anterior .

Ejemplos:

n=2, k=5 da la secuencia 2 2 5 2 2 5 2 2 2 2 2 5 2 2 5 ...

n=3, k=0 da 3 3 3 0 3 3 3 0 3 3 3 0 0 3 3 3 0 ...

n=1, k=3 da 1 3 1 1 1 3 1 3 1 3 1 3 1 1 1 3 1 ...

El reto

Escriba una función / programa y con ella haga lo siguiente. Tomar como entrada:

  • un entero positivo n
  • un entero no negativo k ≠ n
  • un entero positivo i > n

Las dos primeras entradas ny kdeterminar una secuencia como se describe anteriormente y ies un índice. Estoy usando la indexación 1 en los ejemplos, pero usted tiene la libertad de usar la indexación 0 o 1. Si está indexado a 0, entonces la restricción ies i ≥ n.

Con la salida de los tres números, la relación de ns a ks en la secuencia hasta e incluyendo el número en el índice i. El formato de la salida puede ser un valor decimal con al menos 5 dígitos de precisión o un valor exacto como una relación como 3524/837o 3524:837.

En forma decimal, el último dígito se puede redondear como desee. Se permiten ceros finales y espacios en blanco.

En cualquiera de las formas de cadena, los dos números deben normalizarse para que sean coprimos. Por ejemplo, si la relación era 22/4, 11/2y 11:2son aceptables pero 22/4no lo son.

Ejemplos

n   k   i      output
2   4   15     2.75     or   11/4
6   0   666    5.1101   or   557:109
50  89  64     63       or   63:1
3   2   1000   2.7453   or   733/267
9   12  345    9.4545   or   104/11

Este es el código de golf por idioma, por lo que el código más corto en cada idioma es el ganador.

dylnan
fuente
Recomiendo permitir un par de números enteros como proporción, necesitando respuestas para separar los números con /o :simplemente agrega una complicación innecesaria al desafío.
Erik the Outgolfer
@EriktheOutgolfer también se permite un número decimal
dylnan
¿Es un flotador estándar lo suficientemente exacto para la salida decimal?
Restablece a Monica - notmaynard
@iamnotmaynard No soy estricto en cuanto al formato flotante de modo que sí lo creo
dylnan

Respuestas:

5

Casco , 16 bytes

¤/#ωȯ↑⁰J¹`C∞²N¹²

Pruébalo en línea!

Toma entradas en el mismo orden que los casos de prueba. Emite un número racional. Siento que esto tiene demasiados superíndices, pero no sé cómo deshacerme de ellos ...

Explicación

¤/#ωȯ↑⁰J¹`C∞²N¹²  Inputs are n, k, i.
             N    Starting with the natural numbers [1,2,3..
   ωȯ             do this until a fixed point is reached:
                    Argument is a list s.
           ∞²       Take the infinite list [n,n,n..
         `C         and split it to the lengths in s.
       J¹           Join the resulting blocks with k.
     ↑⁰             Take the first i elements.
                  Call the result x.
¤             ¹²  For each of n and k,
  #               count their number of occurrences in x
 /                and perform exact division on the results.
Zgarb
fuente
4

Python 3 , 94 92 89 87 bytes

def g(n,k,i):o,t=[n],0;exec('o+=[n]*o[t]+[k];t+=1;'*i);return-1-i/(o[1:i+1].count(n)-i)

Pruébalo en línea!

Créditos

  • Reducido de 94 a 92 bytes: Colera Su .
  • Reducido de 92 a 89 bytes: dylnan .
  • Reducido de 89 a 87 bytes: ovs .
Neil
fuente
¿No debería ser .count(n)?
Colera Su
@ColeraSu Gracias. No sé cómo me perdí eso, arreglado.
Neil
92 bytes .
Colera Su
@ColeraSu Gracias, actualizado. Trataré de comenzar a usar los ejecutivos. Eso es muy bonito.
Neil
89 bytes
dylnan
4

Jalea , 22 bytes

³ẋЀ;€⁴Ẏḣ⁵
ẋ`;ÇÐLLƙ`÷/

Pruébalo en línea!

Programa completo Toma argumentos n, k, i.

Hay un error que hace que esta necesidad sea innecesariamente más larga en 1 byte.

Erik el Outgolfer
fuente
Usaste algunos de tus trucos, bien. Preguntándome cuál debería ser la solución correcta para el error ...
Jonathan Allan
@JonathanAllan Lo que me llamó la atención es esta línea , aunque no estoy seguro de por qué poner un `hace que funcione. Ah, y donde su respuesta difiere es que olvidé implementar un campo de golf que encontré en otro idioma> _>
Erik the Outgolfer
4

Jalea ,  25  16 bytes

-9 bytes ~ 50% atribuible a la respuesta de Erik the Outgolfer's Jelly (1. usando la nueva clave rápida ƙincluso con un error en el intérprete que actualmente cuesta un byte; 2. usando una repetición asignada para evitar contar e indexar en la secuencia actual .) ¡Ve y dale un poco de crédito!

³ẋЀj⁴ṁ⁵µÐLLƙ`÷/

Un programa completo de tomar tres argumentos: n, k, ique imprime el resultado.

Pruébalo en línea!

¿Cómo?

³ẋЀj⁴ṁ⁵µÐLLƙ`÷/ - Main link
        µ        - monadic chain separation
         ÐL      - apply the monadic chain to the left repeatedly until no change occurs:
³                -   program's 1st argument, n
  Ѐ             -   map across the current sequence (initially just n)
 ẋ               -     repeat (the first run give triangle of n i.e. [[n],[n,n],...,[n]*n]
     ⁴           -     program's 2nd argument, k
    j            -     join
       ⁵         -     program's 3rd argument, i
      ṁ          -     mould like (repeat the list to fill, or cut it, to length i)
            ƙ    - keyed application, map over groups of identical items:
             `   - (this has an arity of 2, make it monadic by repeating the argument)
           L     -   length -> [numberOfNs, numberOfKs]
               / - reduce with:
              ÷  -   division -> [numberOfNs / numberOfKs]
                 - implicit print (a single item list just prints its content)

ejemplo de ejecución con entradas n=2, k=3, i=30:

Start the "loop until no change", ÐL
Note: Initial left argument, n=2, implicitly range-ified by Ѐ to become [1,2]
1. mapped repeat of n: [[2],[2,2]]
          join with k: [2,3,2,2]
         mould like i: [2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3]

2. mapped repeat of n: [[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2]]
          join with k: [2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2]
         mould like i: [2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                          ^different to previous result

3. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2]
                                  ^different to previous result

4. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                                                      ^different to previous result

5. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                       all the same as the previous result; stop loop and yield this.

length applied to equal elements: [length([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]), length([3,3,3,3,3,3,3,3,3])]
                                = [21,9]
reduce by division              = [21/9] = [2.3333333333333335]
implicit print                  2.3333333333333335
Jonathan Allan
fuente
3

Mathematica, 85 bytes

(s={#};Do[s=Join[s,#~Table~s[[t]],{#2}],{t,#3}];Last@@Ratios@Tally@s[[#+3;;#3+#+2]])&

Pruébalo en línea!

J42161217
fuente
2

APL (Dyalog Unicode) , 126 70 bytes

k n i←⎕
j←⍴v←⍬
:While j<i
v,←k,⍨n⍴⍨{v≢⍬:jvn}j+←1
:End
÷/+/¨n k⍷¨⊂jv

Pruébalo en línea!

Bueno, gracias a @ Adám por borrar 56 bytes de esta respuesta.

Este es un Tradfn niládica ( trad itional f unctio n ) tomando 1 de entrada, que es una lista de 3 elementos.

⎕PP←5No se añade a la cuenta de bytes, ya que sólo se usa para limitar la P rint P recisión de 5 dígitos.

∇fy no se agregan al recuento de bytes porque no son parte del código, solo delimitadores para el tradfn.

Cómo funciona:

k n i←⎕                    Take input (←⎕) for k, n and i.
j←⍴v←⍬                     Assign (←) an empty vector (⍬) to v, then assign its shape (⍴, which is 0) to j.
:While j<i                 while j<i, do:
v,←k,⍨n⍴⍨{v≢⍬:jvn}j+←1  this:
                     j+←1  increment j (+←1)
          {v≢⍬:     }      if (:) v does not match (≢) 
               jv         return the jth element of v (v[j])
                  n       else (⋄) return n
      n⍴⍨                  shape (⍴) n as the result (repeats n result times)
   k,⍨                     append (,⍨) k
v,←                        append to (,←) v
:End                       End while loop
÷/+/¨n k⍷¨⊂jv             then:
           jv             shape (⍴) v as j (truncates v to j elements)
                          enclose the resulting vector
         ¨                 for each element
                          find (returns a boolean vector)
     n k                   n and k (⍷ will return a boolean vector for each)
  +/¨                      cumulative sum of each vector (returns the number of times n and k appear in v)
÷/                         divide them and implicitly return the result.
J. Sallé
fuente
1

R , 88 bytes

function(n,k,i){s=rep(n,n);for(j in 1:i){s=c(s,k,rep(n,s[j]))};z=sum(s[1:i]==n);z/(i-z)}

Pruébalo en línea!

Duckmayr
fuente
puedes deshacerte de las llaves alrededor del forcuerpo del bucle ya que solo hay una declaración.
Giuseppe
0

Swift , 152 bytes

func f(n:Int,k:Int,i:Int){var a=[0];(1...i).map{a+=(0..<(a.count>$0 ?a[$0]:n)).map{_ in n}+[k]};let m=a[1...i].filter{n==$0}.count;print("\(m)/\(i-m)")}

¿Será más corto que Java?

Explicación

func f(n:Int,k:Int,i:Int){
  var a=[0]                                    // Initialize the array (the zero is to
                                               //  define the type of the array and will be
                                               //  ignored by the code)
  (1...i).map{                                 // Repeat i times (more than enough):
    a+=(0..<(a.count>$0 ?a[$0]:n)).map{_ in n} //  Add the right amount of n:s to the array
      +[k]                                     //  Add k to the array
  }                                            // End repeat
  let m=a[1...i].filter{n==$0}.count           // Count the amount of n:s in the first
                                               //  i elements of the array
  print("\(m)/\(i-m)")                         // Print the result
}
Herman L
fuente
0

Ruby , 77 71 70 bytes

->n,k,i{r=[n]
i.times{|c|r+=[n]*r[c]+[k]}
1r*(j=r[1,i].count n)/(i-j)}

Pruébalo en línea!

Devuelve un Rational, que funciona como un número y se clasifica a la fracción reducida exacta.

Restablecer a Monica - notmaynard
fuente
0

Zephyr , 284 bytes

input n as Integer
input k as Integer
input m as Integer
set s to Array(m)
for i from 1 to n
set s[i]to n
next
set s[i]to k
set N to n
set K to 1
for a from 2 to m
for b from 1 to s[a]
inc i
if i<=m
set s[i]to n
inc N
end if
next
inc i
if i<=m
set s[i]to k
inc K
end if
next
print N/K

Toma los tres números de stdin en tres líneas separadas. Produce una proporción exacta como 104/11o 63.

Sin golf

input n as Integer
input k as Integer
input maxIndex as Integer

set sequence to Array(maxIndex)
for i from 1 to n
    set sequence[i] to n
next
set sequence[i] to k

set nCount to n
set kCount to 1

for a from 2 to maxIndex
    for b from 1 to sequence[a]
        inc i
        if i <= maxIndex
            set sequence[i] to n
            inc nCount
        end if
    next
    inc i
    if i <= maxIndex
        set sequence[i] to k
        inc kCount
    end if
next

print nCount / kCount
DLosc
fuente