Codegolf Rainbow: Diversão com Matrizes Inteiras

12

Introdução:

insira a descrição da imagem aqui(Fonte: Wikipedia )
Quando olhamos para um arco-íris, ele sempre terá as cores de cima para baixo:
vermelho; laranja; amarelo; verde; azul; índigo; tolet

Se olharmos para esses anéis individuais, é claro que o anel vermelho é maior que o anel violeta.
Além disso, também é possível ter dois ou até três arco-íris ao mesmo tempo.

Tudo isso combinado acima será usado neste desafio:

Desafio:

Dada uma lista de números inteiros exatamente do tamanho 7, em que cada valor indica as partículas de cores disponíveis para formar arco-íris (onde o maior índice indica vermelho e o menor índice indica violeta), produz a quantidade de arco-íris que pode ser formada.

Um único arco-íris inteiro precisa ter pelo menos 3x violeta, 4x índigo, 5x azul, 6x verde, 7x amarelo, 8x laranja, 9x vermelho. Um segundo arco-íris em cima dele será ainda maior que o anel vermelho do primeiro arco-íris (incluindo um espaço entre eles), portanto precisará de pelo menos 11x violeta, 12x índigo, 13x azul, 14x verde, 15x amarelo, 16x laranja , 17x vermelho, além do que o primeiro arco-íris usa. O terceiro arco-íris começará novamente em 19x violeta.

Exemplo:

Lista de entradas: [15,20,18,33,24,29,41]
Saída:2

Por quê? Temos 15x violeta e precisamos de pelo menos 3 + 11 = 14 para dois arco-íris. Temos 20 índigo e precisamos de pelo menos 4 + 12 = 16 para dois arco-íris. Etc. Temos cores suficientes para dois arco-íris, mas não o suficiente para formar três arco-íris, então a saída é 2.

Regras do desafio:

  • Os números inteiros na matriz de entrada são garantidos como não negativos ( >= 0).
  • A lista de entrada é garantidamente do tamanho 7 exatamente.
  • Quando nenhum arco-íris pode ser formado, produzimos 0.
  • O formato de entrada e saída é flexível. Pode ser uma lista ou matriz de números inteiros decimais, pode ser obtida em STDIN. A saída pode ser um retorno de uma função em qualquer tipo de saída razoável ou impressa diretamente no STDOUT.

Quantidade mínima de cores necessária para a nquantidade 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...

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

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
fonte
O 0,0,0,0,0,0,0ponta-caso, porém :( (que não se encaixa com a lógica 1-gap)
Jonathan Allan

Respostas:

8

Pitão , 14 bytes

thS.ef<b*+tkyy

Suíte de teste!

Quão?

Algortihm

Primeiro, vamos derivar a fórmula em que esta resposta se baseia. Vamos chamar a função que fornece a quantidade necessária de partículas de cor , onde é o número de camadas e é o índice da cor, com base em 0. Primeiro, observamos que somente para a camada (onde é indexado 1, neste caso), precisamos de partículas de cor . Tendo isso em mente, somamos os resultados de cada para cada camada :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)=(i+3)n+8(n1)n2=(i+3)n+4n(n1)
C(n,i)=n(i+3+4n4)C(n,i)=n(4n+i1)

Portanto, sabemos agora que o número máximo de camadas possíveis, chamado , deve satisfazer a desigualdade , onde é o elemento da lista de entrada.kC(k,i)IiIiith

Implementação

Isso implementa a função e itera ( ) sobre a lista de entrada, com sendo o índice (baseado em 0) sendo o elemento. Para cada valor, o programa pesquisa o primeiro número inteiro positivo pelo qual (a negação lógica de , a condição que deduzimos anteriormente), depois encontra o resultado mínimo e diminui. Desta forma, em vez de procurar o maior número inteiro que faz satisfazer uma condição, buscamos o menor que não e um subtrair para compensar o deslocamento de 1.k b T b < C ( T , i ) C ( T , i ) bC.ekbTb<C(T,i)C(T,i)b

Mr. Xcoder
fonte
3

Python 2 , 64 61 bytes

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

Experimente online!


Cada cor do arco-íris usa (3+i)+n*8para camada ne cor i(0 = violeta etc.)

O total de x camadas é, por conseguinte,: (3*i)*x + 8*x*(x+1).

Simplesmente resolvemos n e assumimos o valor mínimo.


Salvou:

  • -3 bytes, graças a ovs
TFeld
fonte
2
Ah, agora eu recebo essa resposta ...
Jonathan Frech
1
61 bytes
ovs 14/08/18
@ovs, Thanks :)
TFeld
3

05AB1E , 18 17 16 bytes

-1 byte graças a Magic Octopus Urn

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

Experimente online!

A quantidade de cor necessária para n arco-íris é n (4n + [-1, 0, 1, 2, 3, 4, 5]) .

Okx
fonte
[ND4*6Ý<+*¹›1å#Nfunciona, mas não sei por quê. -1 byte embora.
Urna Mágica do Polvo
@MagicOctopusUrn Thanks! Isso apenas usa o índice de loop em vez da variável counter.
Okx 14/08/18
Parece estranho eu não tenho que fazer N>isso-- porque você tinha ¾>antes.
Urna de polvo mágico
@MagicOctopusUrn O comando para aumentar a variável do contador não envia a variável do contador.
Okx 14/08/18
2

JavaScript (ES6), 49 bytes

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

Experimente online!

Quão?

P(n,k)nk

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

nvkP(n,k)

Mas, para fins de golfe, começamos n === undefinede depois usamos valores negativos n. A primeira iteração sempre é bem-sucedida porque o lado direito da desigualdade é avaliado NaN. Portanto, o primeiro teste significativo é o segundo com n == -1.

Arnauld
fonte
1

Excel VBA, 78 bytes

Função anônima que recebe entradas do intervalo [A1:G1]e saídas para a janela imediata do VBE.

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

Carvão , 21 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação: Calcula diretamente o número de arco-íris possível com cada cor com uma fórmula derivada independentemente, mas é a mesma que a 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
fonte
1

Gelatina , 14 bytes

Isso foi difícil!

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

Um link monádico que aceita uma lista de sete números inteiros que produz um número inteiro, o número de arco-íris possível.

Experimente online! Ou veja a suíte de testes .

Quão?

Infelizmente, qualquer método ingênuo parece ter 16 bytes, um deles é Ṃɓ_J×¥H÷‘H<¬Ȧð€S, no entanto, o método usado aqui é muito mais eficiente e também mais curto!

Este método constrói pilhas arco-íris mais do que suficientes conforme a contagem de partículas, incluindo faixas ultravioletas , e soma 1 para cada pilha possível.

O teste para que isso seja possível é verificar se existe apenas uma única banda, NÃO é possível, pois precisamos de algumas partículas da banda ultravioleta, mas recebemos zero.

Ṃ+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
fonte
Eu sinto que você, definitivamente, foi muito difícil para mim apertar o algoritmo de Okx em 18 bytes ...
Erik the Outgolfer
Além disso, idéia inteligente com o §ỊS!
Erik the Outgolfer
1

05AB1E , 14 bytes

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

Experimente online!

n

Algoritmo de Pyth ⟶ 05AB1E Algoritmo

Existem muitos métodos que se pode tentar resolver esse desafio no 05AB1E, então tentei alguns deles e esse acabou sendo o mais curto. Adaptando a fórmula acima mencionada da minha resposta Pyth, tendo em mente que 05AB1E usou a indexação 1, podemos construir nossa função da seguinte maneira:

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

Ii

4n2+n(i2)Ii=0

Observe que essa igualdade não é precisa (mas atualmente não sei como declarar isso formalmente) e que as soluções para essa equação produzirão números de ponto flutuante, mas corrigimos isso usando a divisão do piso em vez da divisão precisa mais tarde. De qualquer forma, para continuar com o nosso argumento, a maioria de vocês provavelmente está muito familiarizada com as soluções de uma equação , então aqui temos:

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

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

n=2+(i2)2+16Iii8

Qual é exatamente a relação que essa resposta implementa.

Mr. Xcoder
fonte
1

C ++, 127 125 bytes

Raspou 2 bytes graças 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;}

Experimente online!

A função pega uma matriz de sete polegadas no estilo C e retorna um 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

Explicação:

#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
fonte
Olá, bem-vindo ao PPCG! Eu não sei C ++ muito bem, mas eu tenho certeza que você pode golfe nesta 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 isto: for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;. Além disso, você poderia fornecer um link TIO com código de teste?
Kevin Cruijssen
@KevinCruijssen Thank you!
Max Yekhlakov 17/08/2018