Codegolf Rainbow: Tamsayı Dizileri ile Eğlenceli


12

Giriş:

resim açıklamasını buraya girin(Kaynak: Wikipedia )
Bir gökkuşağına baktığımızda her zaman yukarıdan aşağıya renkleri olacaktır:
Kırmızı; Portakal; Sarı; yeşil; mavi; indigo; menekşe

Bu ayrı halkalara bakarsak, kırmızı halka elbette menekşe halkadan daha büyüktür.
Ayrıca, aynı anda iki hatta üç gökkuşağına sahip olmak da mümkündür.

Yukarıdaki tüm bunlar bu meydan okumada kullanılacaktır:

Meydan okuma:

Tam olarak 7 boyutundaki tamsayıların bir listesi verildiğinde, her bir değer gökkuşağı oluşturmak için mevcut renk parçacıklarını gösterir (en büyük dizin kırmızıyı ve en küçük endeksi menekşe gösterir), oluşabilecek gökkuşağı miktarını verir.

Tek bir tam sayı-gökkuşağı en az 3x menekşe, 4x çivit mavisi, 5x mavi, 6x yeşil, 7x sarı, 8x turuncu, 9x kırmızı olmalıdır. Üstündeki ikinci bir gökkuşağı ilk gökkuşağının kırmızı halkasından bile daha büyük olacak (aralarındaki bir boşluk dahil), bu yüzden en az 11x menekşe, 12x indigo, 13x mavi, 14x yeşil, 15x sarı, 16x turuncuya ihtiyaç duyacak , İlk gökkuşağının kullandığı şeye ek olarak 17x kırmızı. Üçüncü gökkuşağı yine 19x menekşe ile başlayacak.

Misal:

Girdi listesi: [15,20,18,33,24,29,41]
Çıktı:2

Neden? 15x menekşemiz var ve iki gökkuşağı için en az 3 + 11 = 14 lazım. 20 indigo'muz var ve iki gökkuşağı için en az 4 + 12 = 16'ya ihtiyacımız var. Vb İki gökkuşağı için yeterli renk var, ancak üç gökkuşağı oluşturmak için yeterli değil, bu yüzden çıktı 2.

Zorluk kuralları:

  • Girdi dizisindeki tamsayıların negatif olmadığı garanti edilir ( >= 0).
  • Giriş listesinin tam olarak 7 boyutta olması garanti edilir.
  • Gökkuşağı oluşmadığında çıktı alırız 0.
  • Giriş ve çıkış formatları esnektir. Ondalık sayıların tam listesi veya dizisi olabilir, STDIN'den alınabilir. Çıktı, herhangi bir makul çıktı türündeki bir işlevden geri dönüş olabilir veya doğrudan STDOUT'a yazdırılabilir.

nGökkuşağı miktarı için gereken minimum renk miktarı:

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

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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

0,0,0,0,0,0,0Kenar durum olsa :( (o 1-boşluk mantığı ile uymuyorsa)
Jonathan Allan

Yanıtlar:


8

Pyth , 14 bayt

thS.ef<b*+tkyy

Test odası!

Nasıl?

Algortihm

Öncelikle, bu cevabın dayandığı formülü elde edelim. Gerekli miktarda renk partikülü veren fonksiyonu çağıralım; burada , katman sayısıdır ve , 0 tabanlı rengin indeksidir. İlk olarak, yalnızca katmanı için (burada , 1 dizinli, bu durumda), renk parçacıklarına ihtiyacımız olduğunu not ediyoruz . Bunu akılda tutarak, her katman için her bir nin sonuçlarını :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)

Bu nedenle, artık adlandırılabilecek maksimum olası katman sayısının eşitsizliğini karşılaması gerektiğini ; burada , giriş listesinin öğesidir.kC(k,i)IiIiith

uygulama

Bu, işlevini uygular ve giriş listesi üzerinde ( ) yinelenir ; , dizin (0 tabanlı) ve öğedir. Her değer için, program arar önce pozitif bir tamsayı olan (mantıksal olumsuzlaması , daha önce çıkarılmış durumda), daha sonra en az bir sonuç bulur ve azaltır. Bu şekilde, yerine en yüksek tamsayı için arama yapar bir koşulu yerine, bunu en düşük aramak değil 1 ofset telafi etmek ve ondan çıkarma biri.k b T b < C ( T , i ) C ( T , i ) bC.ekbTb<C(T,i)C(T,i)b


3

Python 2 , 64 61 bayt

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

Çevrimiçi deneyin!


Gökkuşağının her rengi (3+i)+n*8katman nve renk için kullanır i(0 = menekşe vb.)

X tabakalar için toplam nedenle: (3*i)*x + 8*x*(x+1).

Sadece n için çözüyoruz ve minimum değeri alıyoruz.


Kaydedilen:

  • -3 bayt, ovs sayesinde

2
Ah, şimdi bu yanıtı alıyorum ...
Jonathan Frech


@ovs, Thanks :)
TFeld

3

05AB1E , 18 17 16 bayt

Sihirli Ahtapot Urn sayesinde -1 bayt

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

Çevrimiçi deneyin!

N gökkuşağı için gereken renk miktarı n'dir (4n + [-1, 0, 1, 2, 3, 4, 5]) .


[ND4*6Ý<+*¹›1å#Nama nedenini bilmiyorum. -1 bayt olsa.
Sihirli Ahtapot Urn

@MagicOctopusUrn Teşekkürler! Bu sadece counter değişkeni yerine loop dizinini kullanır.
Okx

N>Yine de yapmak zorunda olmadığım garip görünüyor - çünkü daha ¾>önce yapmıştın.
Sihirli Ahtapot Urn

@MagicOctopusUrn Sayaç değişkenini artırma komutu sayaç değişkenini itmez.
Okx

2

JavaScript (ES6), 49 bayt

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

Çevrimiçi deneyin!

Nasıl?

Sayı renkli parçacıklar üretmek için gerekli kere inci renk: n kP(n,k)nk

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

Giriş dizisindeki en az bir girdisi den daha düşük olana kadar tüm değerlerini tekrar tekrar deneriz .v k P ( n , k )nvkP(n,k)

Ancak golf amacıyla, daha sonra n === undefinednegatif değerler ile başlıyor ve kullanıyoruz n. İlk yineleme her zaman başarılıdır, çünkü eşitsizliğin sağ tarafı değerlendirir NaN. Bu nedenle, ilk anlamlı test 2. testtir n == -1.



1

Excel VBA, 78 bayt

[A1:G1]VBE anlık penceresinden ve çıkışından girdi alan anonim işlev .

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

1

Kömür , 21 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama: Bağımsız olarak türetilmiş bir formül ile her bir renkle mümkün olan gökkuşağı sayısını doğrudan hesaplar, ancak @ TField'ın formülüyle aynı olur.

   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


1

Jöle , 14 bayt

Bu zordu!

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

Bir tamsayı, mümkün olan gökkuşağı sayısı veren yedi tamsayı listesini kabul eden bir monadik Bağlantı.

Çevrimiçi deneyin! Veya test takımına bakın .

Nasıl?

Ne yazık ki herhangi bir saf yöntem 16 bayt sürüyor gibi görünüyor, böyle bir yöntem Ṃɓ_J×¥H÷‘H<¬Ȧð€S, ancak burada kullanılan yöntemin çok daha verimli ve daha kısa olduğu ortaya çıkıyor!

Bu yöntem, ultraviyole bantlar da dahil olmak üzere parçacık sayımı olarak yeterli gökkuşağı yığınını oluşturur ve mümkün olan her yığın için 1 ekler.

Mümkün olan test, bazı ultraviyole bant partiküllerine ihtiyacımız olduğu ancak sıfır verildiği sürece sadece tek bir bandın mümkün olmadığını kontrol etmektir.

Ṃ+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!)

Seni hissediyorum, Okx'un algoritmasını 18 baytta sıkıştırmak benim için kesinlikle çok zordu ...
Outgolfer Erik

Ayrıca, ile akıllı bir fikir §ỊS!
Outgolfer Erik

1

05AB1E , 14 bayt

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

Çevrimiçi deneyin!

n

Pyth algoritması ⟶ 05AB1E Algoritması

Bir 05AB1E bu meydan okuma çözmek için deneyebilirsiniz birçok yöntem vardır , bu yüzden bunlardan bir kaç denedim ve bu en kısa olduğu ortaya çıktı. Yukarıda belirtilen formülü Pyth cevabımdan uyarlayarak, 05AB1E'nin 1-indeksleme kullandığını akılda tutarak, fonksiyonumuzu aşağıdaki gibi yapılandırabiliriz:

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

Ii

4n2+n(i2)Ii=0

Bu eşitliğin kesin olmadığını (ancak şu anda bunu daha resmi bir şekilde ifade etmenin bir yolunu bilmiyorum) ve bu denklemin çözümlerinin kayan nokta sayıları vereceğini, ancak bunu kesin bölme yerine kat bölme kullanarak düzelttiğimizi unutmayın daha sonra. Her neyse, tartışmamıza devam etmek için, çoğunuz muhtemelen böyle bir denklemin çözümlerine çok aşinasınız , bu yüzden burada var:

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

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

n=2+(i2)2+16Iii8

Tam olarak bu cevabın uyguladığı ilişki.


1

C ++, 127125 bayt

Kevin Cruijssen sayesinde 2 bayt tıraş oldu.

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

Çevrimiçi deneyin!

İşlev yedi inçlik bir C stili dizi alır ve bir int döndürür.

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

Açıklama:

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

Merhaba, PPCG'ye hoş geldiniz! Onu çok iyi C ++ bilmiyorum ama eminim yapabilirsiniz golf bu bölümü: 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;}Buna: for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;. Ayrıca, test koduyla birlikte bir TIO bağlantısı sağlayabilir misiniz ?
Kevin Cruijssen

@KevinCruijssen Teşekkür ederiz!
Max Yekhlakov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.