Codegolf Rainbow: Fun with Integer-Arrays

12

Wprowadzenie:

wprowadź opis zdjęcia tutaj(Źródło: Wikipedia )
Kiedy spojrzymy na tęczę, zawsze będzie miała kolory od góry do dołu:
Czerwony; Pomarańczowy; żółty; Zielony; niebieski; indygo; fioletowy

Jeśli spojrzymy na te pojedyncze pierścienie, czerwony pierścień jest oczywiście większy niż pierścień fioletowy.
Ponadto możliwe jest jednoczesne posiadanie dwóch lub nawet trzech tęcz.

Wszystkie powyższe kombinacje zostaną wykorzystane w tym wyzwaniu:

Wyzwanie:

Biorąc pod uwagę listę liczb całkowitych o dokładnym rozmiarze 7, gdzie każda wartość wskazuje dostępne cząstki koloru, które mogą tworzyć tęcze (gdzie największy wskaźnik wskazuje na czerwony, a najmniejszy wskaźnik wskazuje na fioletowy), wyprowadza ilość tęczy, którą można utworzyć.

Jedna liczba całkowita tęczy musi mieć co najmniej 3x fiolet, 4x indygo, 5x niebieski, 6x zielony, 7x żółty, 8x pomarańczowy, 9x czerwony. Druga tęcza na niej będzie jeszcze większa niż czerwony pierścień pierwszej tęczy (w tym jedna przestrzeń między nimi), więc będzie potrzebowała co najmniej 11x fioletu, 12x indygo, 13x niebieskiego, 14x zielonego, 15x żółtego, 16x pomarańczowego , 17x czerwony oprócz tego, z czego korzysta pierwsza tęcza. Trzecia tęcza znów zacznie się od 19x fioletu.

Przykład:

Lista wejściowa: Dane [15,20,18,33,24,29,41]
wyjściowe:2

Dlaczego? Mamy 15x fiolet i potrzebujemy co najmniej 3 + 11 = 14 na dwie tęcze. Mamy 20 indygo i potrzebujemy co najmniej 4 + 12 = 16 na dwie tęcze. Itd. Mamy wystarczająco dużo kolorów na dwie tęcze, ale nie na tyle, aby uformować trzy tęcze, więc wynik jest 2.

Zasady konkursu:

  • Liczby całkowite w tablicy wejściowej są gwarantowane jako nieujemne ( >= 0).
  • Gwarantujemy, że lista wejściowa ma dokładnie rozmiar 7.
  • Kiedy nie można utworzyć tęcze, wysyłamy 0.
  • Format wejściowy i wyjściowy jest elastyczny. Może być listą lub tablicą liczb całkowitych dziesiętnych, można pobrać ze STDIN. Dane wyjściowe mogą być zwracane przez funkcję dowolnego rozsądnego typu danych wyjściowych lub drukowane bezpośrednio do STDOUT.

Minimalna ilość kolorów wymagana dla nilości tęcz:

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

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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
źródło
0,0,0,0,0,0,0Krawędzi przypadek chociaż :( (nie pasuje do logiki 1-GAP)
Jonathan Allan

Odpowiedzi:

8

Pyth , 14 bajtów

thS.ef<b*+tkyy

Zestaw testowy!

W jaki sposób?

Algortihm

Po pierwsze, zacznijmy od wzoru, na którym opiera się ta odpowiedź. Nazwijmy funkcję, która daje niezbędną ilość cząstek koloru , gdzie jest liczbą warstw, a jest indeksem koloru, opartym na 0. Po pierwsze, zauważamy, że dla samej warstwy (gdzie ma indeks 1, w tym przypadku) potrzebujemy cząstek . Mając to na uwadze, sumujemy wyniki każdego dla każdej warstwy :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)

Dlatego wiemy już, że maksymalna liczba możliwych warstw, nazywana , musi spełniać nierówność , gdzie jest elementem listy wejściowej.kC(k,i)IiIiith

Realizacja

Implementuje to funkcję i iteruje ( ) po liście danych wejściowych, przy czym to indeks (oparty na 0), a to element. Dla każdej wartości program wyszukuje pierwszą dodatnią liczbę całkowitą dla której (logiczna negacja , warunek, który wyprowadziliśmy wcześniej), a następnie znajduje minimalny wynik i zmniejsza to. W ten sposób, zamiast poszukiwania najwyższej liczby całkowitej, że robi spełniać warunek, szukamy najniższy że nie i odjąć jeden z nich w celu uzupełnienia offset 1.k b T b < C ( T , i ) C ( T , i ) bC.ekbTb<C(T,i)C(T,i)b

Pan Xcoder
źródło
3

Python 2 , 64 61 bajtów

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

Wypróbuj online!


Każdy kolor tęczy używa (3+i)+n*8dla warstwy ni koloru i(0 = fioletowy itp.)

Całkowita przez x warstw wynosi: (3*i)*x + 8*x*(x+1).

Po prostu rozwiązujemy dla n i przyjmujemy minimalną wartość.


Zapisano:

  • -3 bajty, dzięki ovs
TFeld
źródło
2
Ach, teraz dostaję tę odpowiedź ...
Jonathan Frech
1
61 bajtów
ows,
@ovs, Thanks :)
TFeld
3

05AB1E , 18 17 16 bajtów

-1 bajt dzięki Magic Octopus Urn

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

Wypróbuj online!

Ilość koloru potrzebna dla n tęczy wynosi n (4n + [-1, 0, 1, 2, 3, 4, 5]) .

Okx
źródło
[ND4*6Ý<+*¹›1å#Ndziała, ale nie wiem dlaczego. -1 bajt.
Magic Octopus Urn
@MagicOctopusUrn Thanks! To po prostu używa indeksu pętli zamiast zmiennej licznika.
Okx
Wydaje się dziwne, że nie muszę tego N>robić - bo już ¾>wcześniej.
Magic Octopus Urn
@MagicOctopusUrn Polecenie zwiększenia zmiennej licznika nie przesuwa zmiennej licznika.
Okx,
2

JavaScript (ES6), 49 bajtów

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

Wypróbuj online!

W jaki sposób?

P(n,k)nk

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

nvkP(n,k)

Ale do celów golfowych zaczynamy od, n === undefineda następnie używamy ujemnych wartości n. Pierwsza iteracja zawsze kończy się powodzeniem, ponieważ ocenia się prawą stronę nierówności NaN. Dlatego pierwszym znaczącym testem jest drugi z n == -1.

Arnauld
źródło
1

Excel VBA, 78 bajtów

Anonimowa funkcja, która pobiera dane wejściowe z zakresu [A1:G1]i danych wyjściowych do bezpośredniego okna VBE.

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

Węgiel drzewny , 21 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Bezpośrednio oblicza liczbę tęczy możliwą dla każdego koloru z formułą I wyprowadzoną niezależnie, ale okazuje się być taka sama jak formuła @ 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
źródło
1

Galaretka , 14 bajtów

To było trudne!

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

Monadyczny link akceptujący listę siedmiu liczb całkowitych, która daje liczbę całkowitą, możliwą liczbę tęczy.

Wypróbuj online! Lub zobacz pakiet testowy .

W jaki sposób?

Niestety, jakakolwiek naiwna metoda wydaje się zajmować 16 bajtów, jedna taka metoda jest Ṃɓ_J×¥H÷‘H<¬Ȧð€S, jednak okazuje się, że zastosowana tutaj metoda jest znacznie bardziej wydajna i krótsza!

Ta metoda buduje więcej niż tę samą liczbę stosów tęczy, gdy liczy się cząstki, w tym pasma ultrafioletowe , i dodaje 1 dla każdego możliwego stosu.

Testem tego jest sprawdzenie, czy istnieje tylko jedno pasmo NIE jest możliwe, biorąc pod uwagę, że potrzebujemy cząsteczek pasma ultrafioletowego, ale otrzymaliśmy 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
źródło
Czuję, że zdecydowanie zbyt trudno było mi ścisnąć algorytm Okx w 18 bajtach ...
Erik Outgolfer
Również sprytny pomysł z §ỊS!
Erik the Outgolfer
1

05AB1E , 14 bajtów

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

Wypróbuj online!

n

Algorytm Pytha ⟶ 05AB1E Algorytm

Istnieje wiele metod, które można wypróbować, aby rozwiązać to wyzwanie w 05AB1E, więc wypróbowałem kilka z nich i okazało się, że jest najkrótszy. Dostosowując powyższą formułę z mojej odpowiedzi w Pythonie, pamiętając, że 05AB1E użyło indeksowania 1, możemy skonstruować naszą funkcję w następujący sposób:

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

Ii

4n2+n(i2)Ii=0

Zauważ, że ta równość nie jest precyzyjna (ale obecnie nie znam sposobu, aby sformułować to bardziej formalnie) i że rozwiązania tego równania przyniosą liczby zmiennoprzecinkowe, ale naprawiamy to za pomocą podziału podłogi zamiast podziału dokładnego później. W każdym razie, aby kontynuować naszą dyskusję, większość z was zapewne bardzo dobrze zna rozwiązania takiego równania , więc oto:

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

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

n=2+(i2)2+16Iii8

To jest właśnie relacja, którą realizuje ta odpowiedź.

Pan Xcoder
źródło
1

C ++, 127 125 bajtów

Ogolił 2 bajty dzięki Kevinowi Cruijssenowi.

#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;}

Wypróbuj online!

Funkcja przyjmuje tablicę w stylu C złożoną z siedmiu liczb całkowitych i zwraca liczbę całkowitą.

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

Wyjaśnienie:

#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
źródło
Cześć, witamy w PPCG! Nie wiem, C ++ zbyt dobrze, ale jestem pewien, że ta część może golf: 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;}tak: for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;. A może mógłbyś podać link do TIO z kodem testowym?
Kevin Cruijssen
@KevinCruijssen Dziękujemy!
Max Yekhlakov,