Codegolf Rainbow: Diversión con matrices de enteros

12

Introducción:

ingrese la descripción de la imagen aquí(Fuente: Wikipedia )
Cuando miramos un arco iris siempre tendrá los colores de arriba a abajo:
rojo; naranja; amarillo; verde; azul; índigo; Violeta

Si observamos estos anillos individuales, el anillo rojo es, por supuesto, más grande que el anillo violeta.
Además, también es posible tener dos o incluso tres arcoíris al mismo tiempo.

Todo lo anterior combinado se usará en este desafío:

Desafío:

Dada una lista de enteros de exactamente el tamaño 7, donde cada valor indica las partículas de color disponibles para formar arcoíris (donde el índice más grande indica rojo y el índice más pequeño indica violeta), genera la cantidad de arcoíris que se puede formar.

Un solo arco iris entero debe tener al menos 3x violeta, 4x índigo, 5x azul, 6x verde, 7x amarillo, 8x naranja, 9x rojo. Un segundo arco iris encima será aún más grande que el anillo rojo del primer arco iris (incluido un espacio entre ellos), por lo que necesitará al menos 11x violeta, 12x índigo, 13x azul, 14x verde, 15x amarillo, 16x naranja , 17x rojo además de lo que usa el primer arcoíris. El tercer arcoíris comenzará en 19x violeta nuevamente.

Ejemplo:

Lista de entrada: [15,20,18,33,24,29,41]
Salida:2

¿Por qué? Tenemos 15x violeta, y necesitamos al menos 3 + 11 = 14 para dos arcoiris. Tenemos 20 índigo y necesitamos al menos 4 + 12 = 16 para dos arcoíris. Etc. Tenemos suficientes colores para dos arcoíris, pero no suficientes para formar tres arcoíris, por lo que la salida es 2.

Reglas de desafío:

  • Se garantiza que los enteros en la matriz de entrada no son negativos ( >= 0).
  • Se garantiza que la lista de entrada será de tamaño 7 exactamente.
  • Cuando no se pueden formar arcoíris, salimos 0.
  • El formato de entrada y salida es flexible. Puede ser una lista o conjunto de enteros de decimales, puede tomarse de STDIN. La salida puede ser un retorno de una función en cualquier tipo de salida razonable, o imprimirse directamente en STDOUT.

Cantidad mínima de colores necesarios para la ncantidad de arcoíris:

Amount of Rainbows    Minimum amount per color
0                     [0,0,0,0,0,0,0]
1                     [3,4,5,6,7,8,9]
2                     [14,16,18,20,22,24,26]
3                     [33,36,39,42,45,48,51]
4                     [60,64,68,72,76,80,84]
5                     [95,100,105,110,115,120,125]
etc...

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, se recomienda agregar una explicación para su respuesta.

Casos de prueba:

Input:  [15,20,18,33,24,29,41]
Output: 2

Input:  [3,4,5,6,7,8,9]
Output: 1

Input:  [9,8,7,6,5,4,3]
Output: 0

Input:  [100,100,100,100,100,100,100]
Output: 4

Input:  [53,58,90,42,111,57,66]
Output: 3

Input:  [0,0,0,0,0,0,0]
Output: 0

Input:  [95,100,105,110,115,120,125]
Output: 5

Input:  [39525,41278,39333,44444,39502,39599,39699]
Output: 98
Kevin Cruijssen
fuente
Sin 0,0,0,0,0,0,0embargo, el caso límite :( (no encaja con la lógica de 1 espacio)
Jonathan Allan

Respuestas:

8

Pyth , 14 bytes

thS.ef<b*+tkyy

¡Banco de pruebas!

¿Cómo?

Algortihm

En primer lugar, derivemos la fórmula en la que se basa esta respuesta. Llamemos a la función que da la cantidad necesaria de partículas de color , donde es el número de capas e es el índice del color, basado en 0. Primero, notamos que solo para la capa (donde está indexada en 1, en este caso), necesitamos partículas de color . Teniendo esto en cuenta, sumamos los resultados de cada para cada capa :C(n,i)ninthnL(n,i)=i+3+8(n1)L(k,i)k

C(n,i)=(i+3)1st layer+(i+3+8)2nd layer++[i+3+8(n1)]nth layer
C(n,i)=(i+3)n+8(0+1++n1)
C(n,i)=n(i+3+4n-4)
C(n,i)=(i+3)n+8(n1)n2=(i+3)n+4n(n1)
C(n,i)=n(i+3+4n4)C(n,i)=n(4n+i1)

Por lo tanto, ahora sabemos que el número máximo de capas posibles, , debe satisfacer la desigualdad , donde es el elemento de la lista de entrada.C ( k , i ) I i I i i thkC(k,i)IiIiith

Implementación

C.ekbTb<C(T,i)C(T,i)b y reste uno para compensar el desplazamiento de 1.

Sr. Xcoder
fuente
3

Python 2 , 64 61 bytes

lambda l:min(((16*v+i*i)**.5-i)//8for i,v in enumerate(l,-1))

Pruébalo en línea!


Cada color del arco iris se usa (3+i)+n*8para la capa ny el color i(0 = violeta, etc.)

Por consiguiente, el total de capas x es: (3*i)*x + 8*x*(x+1).

Simplemente resolvemos para n, y tomamos el valor mínimo.


Salvado:

  • -3 bytes, gracias a los ovs
TFeld
fuente
2
Ah, ahora recibo esa respuesta ...
Jonathan Frech
1
61 bytes
ovs
@ovs, gracias :)
TFeld
3

05AB1E , 18 17 16 bytes

-1 byte gracias a Magic Octopus Urn

[ND4*6Ý<+*¹›1å#N

Pruébalo en línea!

La cantidad de color necesaria para n arcoiris es n (4n + [-1, 0, 1, 2, 3, 4, 5]) .

Okx
fuente
[ND4*6Ý<+*¹›1å#Nfunciona pero no sé por qué. -1 byte sin embargo.
Urna de pulpo mágico
@MagicOctopusUrn ¡Gracias! Eso solo usa el índice de bucle en lugar de la variable de contador.
Okx
Parece extraño, no tengo que hacerlo, N>porque ya lo habías hecho ¾>antes.
Urna de pulpo mágico
@MagicOctopusUrn El comando para aumentar la variable del contador no empuja la variable del contador.
Okx
2

JavaScript (ES6), 49 bytes

f=(a,n)=>a.some((v,k)=>v<4*n*n-~-k*n)?~n:f(a,~-n)

Pruébalo en línea!

¿Cómo?

P(n,k)nk

P(n,k)=n(4n+(k1))=4n2+(k1)n

nvkP(n,k)

Pero para propósitos de golf, comenzamos con n === undefinedy usamos valores negativos de ndespués. La primera iteración siempre es exitosa porque el lado derecho de la desigualdad se evalúa como NaN. Por lo tanto, la primera prueba significativa es la segunda con n == -1.

Arnauld
fuente
1

Jalea , 18 bytes

Ṁµ×4+-r5¤×)⁸<Ẹ€¬TṪ

Pruébalo en línea!

Utiliza la explicación en la respuesta 05AB1E de Okx.

Erik el Outgolfer
fuente
1

Excel VBA, 78 bytes

Función anónima que toma entrada del rango de [A1:G1]y salidas a la ventana inmediata de VBE.

[A2:G999]="=A1-(COLUMN()+8*ROW()-14)":[H:H]="=-(MIN(A1:G1)<0)":?998+[Sum(H:H)]
Taylor Scott
fuente
1

Carbón de leña , 21 bytes

I⌊EA÷⁻X⁺X⊖κ²×¹⁶ι·⁵⊖κ⁸

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: Calcula directamente el número de arcoíris posibles con cada color con una fórmula que obtuve de forma independiente, pero resulta ser la misma que la fórmula de @ TField.

   A                   Input array
  E                     Map over values
          κ             Current index
         ⊖              Decrement
        X  ²            Square
               ι        Current index
            ×¹⁶         Multiply by 16
       ⁺                Add
      X         ·⁵      Square root
                   κ    Current index
                  ⊖     Decrement
     ⁻                  Subtract
    ÷               ⁸   Integer divide by 8
 ⌊                      Take the maximum
I                       Cast to string
                        Implicitly print
Neil
fuente
1

Jalea , 14 bytes

Esto fue dificil!

Ṃ+9s8Ṗ‘+\>Ż§ỊS

Un enlace monádico que acepta una lista de siete enteros que produce un número entero, el número de arcoíris posibles.

Pruébalo en línea! O vea el conjunto de pruebas .

¿Cómo?

Desafortunadamente, cualquier método ingenuo parece tomar 16 bytes, uno de esos métodos es Ṃɓ_J×¥H÷‘H<¬Ȧð€S, sin embargo, resulta que el método utilizado aquí es mucho más eficiente y más corto.

Este método crea más que suficientes pilas de arcoíris como recuento de partículas, incluidas las bandas ultravioleta , y suma 1 para cada pila que sea posible.

La prueba para que sea posible es verificar que solo haya una sola banda NO posible dado que necesitamos algunas partículas de banda ultravioleta pero se nos proporcionó cero.

Ṃ+9s8Ṗ‘+\>Ż§ỊS - Link list of integers    e.g. [0,0,0,0,0,0,0]        or [17,20,18,33,24,29,41]
Ṃ              - minimum                       0                         17
 +9            - add nine                      9                         26
   s8          - split into eights             [[1,2,3,4,5,6,7,8],[9]]   [[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24],[25,26]]
     Ṗ         - discard the rightmost         [[1,2,3,4,5,6,7,8]]       [[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24]]
      ‘        - increment (vectorises)        [[2,3,4,5,6,7,8,9]]       [[2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17],[18,19,20,21,22,23,24,25]]
               -   (single rainbow counts, including ultra-violet bands, ready to stack)
       +\      - cumulative addition           [[2,3,4,5,6,7,8,9]]       [[2,3,4,5,6,7,8,9],[12,14,16,18,20,22,24,26],[30,33,36,39,42,45,48,51]]
               -   (stacked rainbow counts, including ultra-violet bands)
          Ż    - zero concatenate              [0,0,0,0,0,0,0,0]         [0,17,20,18,33,24,29,41]
               -   (we got given zero ultra-violet band particles!)
         >     - greater than? (vectorises)    [[1,1,1,1,1,1,1,1]]       [[1,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,1]]
               -   (always a leading 1 - never enough particles for the ultra-violet band)
           §   - sum each                      [8]                       [1,1,8]
               -   (how many bands we failed to build for each sacked rainbow?)
            Ị  - insignificant? (abs(X)<=1?)   [0]                       [1,1,0]
               -   (1 if we only failed to build an ultra-violet band for each sacked rainbow, 0 otherwise)
             S - sum                           0                         2
               -   (the number of rainbows we can stack, given we don't see ultra-violet!)
Jonathan Allan
fuente
Te siento, definitivamente fue demasiado difícil para mí exprimir el algoritmo de Okx en 18 bytes ...
Erik the Outgolfer
Además, idea inteligente con el §ỊS!
Erik the Outgolfer
1

05AB1E , 14 bytes

žv*āÍn+tā-Ì8÷ß

Pruébalo en línea!

n

Algoritmo de Pyth ⟶ 05AB1E Algoritmo

Hay muchos métodos que uno puede probar para resolver este desafío en 05AB1E, así que probé un par de ellos y resultó ser el más corto. Adaptando la fórmula mencionada anteriormente de mi respuesta de Pyth, teniendo en cuenta que 05AB1E usó la indexación 1, podemos construir nuestra función de la siguiente manera:

C(n,i)=n(i+2)+4n(n1)

Ii

4n2+n(i2)Ii=0

Tenga en cuenta que esta igualdad no es precisa (pero actualmente no conozco una manera de establecer esto más formalmente) y que las soluciones a esta ecuación producirán números de punto flotante, pero lo arreglamos usando la división de piso en lugar de la división precisa mas tarde. De todos modos, para continuar con nuestro argumento, la mayoría de ustedes probablemente estén muy familiarizados con las soluciones de tal ecuación , así que aquí lo tenemos:

n1,2=2i±(i2)2+16Ii8

Ii(i2)2+16Iii22ii+2=42ii22i2+i=4n

n=2+(i2)2+16Iii8

Cuál es exactamente la relación que implementa esta respuesta.

Sr. Xcoder
fuente
1

C ++, 127125 bytes

Afeitado 2 bytes gracias a Kevin Cruijssen.

#include<cmath>
int f(int x[7]){size_t o=-1;for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c])-c+1)/8;return o;}

Pruébalo en línea!

La función toma una matriz de estilo de C de siete entradas y devuelve un int.

c0c6n(n1)yc(n)=(c+3)+8(n1)nYc(n)=k=1nyc(k)=n(c+3)+8n(n1)2xcYc(n)xcn:

n(c1)+(c1)2+16xc8

xc

Explicación:

#include <cmath> // for sqrt

int f (int x[7])
{
     // Note that o is unsigned so it will initially compare greater than any int
     size_t o = -1;
     // Iterate over the array
     for (int c = 0; c < 7; c++)
     {
         // calculate the bound
         int q = c - 1;
         q = (std::sqrt (q * q + 16 * x[c]) - q) / 8;

         // if it is less than previously found - store it
         o = o > q ? q : o;
     }
     return o;
 }
Max Yekhlakov
fuente
Hola, bienvenido a PPCG! No sé C ++ demasiado bien, pero estoy bastante seguro de que se puede jugar golf esta parte: for(int c=0;c<7;c++){int q=c-1;q=(std::sqrt(q*q+16*x[c])-q)/8;o=o>q?q:o;}a esto: for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;. Además, ¿podría proporcionar un enlace TIO con código de prueba?
Kevin Cruijssen
@KevinCruijssen ¡Gracias!
Max Yekhlakov