Codegolf Rainbow: Fun with Integer-Arrays


12

บทนำ:

ป้อนคำอธิบายรูปภาพที่นี่(ที่มา: Wikipedia )
เมื่อเราดูรุ้งมันจะมีสีจากบนลงล่างเสมอ:
สีแดง; ส้ม; สีเหลือง; เขียว; สีน้ำเงิน; คราม; ม่วง

ถ้าเราดูที่วงแหวนเหล่านี้แต่ละวงแหวนสีแดงย่อมใหญ่กว่าวงแหวนม่วง
นอกจากนี้ยังเป็นไปได้ที่จะมีรุ้งสองหรือสามตัวในเวลาเดียวกัน

ทั้งหมดนี้รวมกันจะถูกนำมาใช้ในการท้าทายนี้:

ท้าทาย:

รับรายการของจำนวนเต็มขนาดที่แน่นอน 7 ซึ่งแต่ละค่าระบุว่ามีอนุภาคสีในรูปแบบรุ้ง (ที่ดัชนีที่ใหญ่ที่สุดหมายถึงสีแดงและดัชนีที่เล็กที่สุดที่ระบุสีม่วง) เอาท์พุทจำนวนรุ้งที่สามารถเกิดขึ้น

จำนวนเต็มรุ้งเดียวจะต้องมีอย่างน้อย 3 สีม่วง, สีคราม 4x, 5x สีฟ้า, 6x สีเขียว, 7x สีเหลือง, สีส้ม 8x, สีแดง 9x รุ้งที่สองอยู่ด้านบนของมันจะใหญ่กว่าวงแหวนสีแดงของรุ้งแรก (รวมช่องว่างระหว่างหนึ่ง) ดังนั้นมันจะต้องมีสีม่วงอย่างน้อย 11x, 12x สีคราม, 13x สีน้ำเงิน, 14x เขียว, 15x เหลือง, ส้ม 16x สีแดง 17x นอกเหนือจากสายรุ้งแรกที่ใช้ รุ้งที่สามจะเริ่มที่ 19x ม่วงอีกครั้ง

ตัวอย่าง:

อินพุตรายการ: [15,20,18,33,24,29,41]
เอาต์พุต:2

ทำไม? เรามีสีม่วง 15x และเราต้องการอย่างน้อย 3 + 11 = 14 สำหรับรุ้งสองตัว เรามีสีคราม 20 อันและเราต้องการอย่างน้อย 4 + 12 = 16 สำหรับรุ้งสองตัว อื่น ๆ เรามีสีเพียงพอสำหรับรุ้งสองตัว แต่ไม่เพียงพอที่จะสร้างรุ้งกินน้ำสามลูกดังนั้นผลผลิตจึงเป็น2เช่นนั้น

กฏท้าทาย:

  • จำนวนเต็มในอินพุตอาร์เรย์รับประกันว่าไม่เป็นลบ ( >= 0)
  • รายการอินพุตถูกรับประกันว่ามีขนาด 7 อย่างแน่นอน
  • 0เมื่อไม่มีรุ้งสามารถเกิดขึ้นเราเอาท์พุท
  • รูปแบบอินพุตและเอาต์พุตมีความยืดหยุ่น สามารถเป็นรายการหรืออาร์เรย์ของจำนวนเต็มของทศนิยมสามารถนำมาจาก STDIN เอาต์พุตสามารถส่งคืนจากฟังก์ชันในประเภทเอาต์พุตที่เหมาะสมหรือพิมพ์โดยตรงไปยัง STDOUT

จำนวนสีขั้นต่ำที่จำเป็นสำหรับnปริมาณรุ้ง:

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

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

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,0ขอบกรณีแม้ว่า :( (มันไม่พอดีกับตรรกะ 1 ช่องว่าง)
โจนาธานอัลลัน

คำตอบ:


8

Pyth , 14 ไบต์

thS.ef<b*+tkyy

ชุดทดสอบ!

อย่างไร?

Algortihm

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)

kC(k,i)IiIiith

การดำเนินงาน

C.ekbTb<C(T,i)C(T,i)b และลบมันออกหนึ่งตัวเพื่อชดเชยออฟเซ็ต 1


3

Python 2 , 64 61 ไบต์

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

ลองออนไลน์!


รุ้งแต่ละสีใช้(3+i)+n*8สำหรับเลเยอร์nและสีi(0 = ม่วง ฯลฯ )

รวมสำหรับ x (3*i)*x + 8*x*(x+1)ชั้นจึงเป็น:

เราก็แก้หา n แล้วหาค่าต่ำสุด


ที่บันทึกไว้:

  • -3 ไบต์ขอบคุณ ovs

2
อาตอนนี้ฉันได้รับคำตอบนั้นแล้ว ...
Jonathan Frech


@ovs, ขอบคุณ :)
TFeld

3

05AB1E , 18 17 16 ไบต์

-1 ไบต์ขอบคุณ Magic Octopus Urn

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

ลองออนไลน์!

ปริมาณของสีที่จำเป็นสำหรับnรุ้งคือn (4n + [-1, 0, 1, 2, 3, 4, 5])


[ND4*6Ý<+*¹›1å#Nทำงานได้ แต่ฉันไม่รู้ว่าทำไม -1 ไบต์แม้ว่า
Magic Octopus Urn

@MagicOctopusUrn ขอบคุณ! นั่นแค่ใช้ดัชนีลูปแทนตัวแปรตัวนับ
Okx

ดูเหมือนว่าแปลกฉันไม่ต้องทำN>- เพราะคุณมี¾>มาก่อน
Magic Octopus Urn

@MagicOctopusUrn คำสั่งเพื่อเพิ่มตัวแปรตัวนับไม่ได้ผลักตัวแปรตัวนับ
Okx

2

JavaScript (ES6), 49 ไบต์

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

ลองออนไลน์!

อย่างไร?

P(n,k)nk

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

nvkP(n,k)

แต่เพื่อจุดประสงค์ในการเล่นกอล์ฟเราเริ่มต้นด้วยn === undefinedและใช้ค่าลบnหลังจากนั้น NaNย้ำเป็นครั้งแรกที่ประสบความสำเร็จเสมอเพราะทางด้านขวาของประเมินความไม่เท่าเทียมกันในการ ดังนั้นการทดสอบที่มีความหมายแรกคือหนึ่งในครั้งที่ 2 n == -1ด้วย



1

Excel VBA ขนาด 78 ไบต์

ฟังก์ชั่นไม่ระบุชื่อที่รับอินพุตจากช่วง[A1:G1]และส่งออกไปยังหน้าต่าง VBE ทันที

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

1

ถ่าน 21 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย: คำนวณจำนวนรุ้งที่เป็นไปได้โดยตรงกับแต่ละสีด้วยสูตรที่ฉันได้รับอย่างอิสระ แต่กลับกลายเป็นเช่นเดียวกับสูตรของ @ 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


1

เยลลี่ 14 ไบต์

มันยาก!

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

Monadic Link ยอมรับรายการจำนวนเจ็ดจำนวนเต็มที่ให้จำนวนเต็มซึ่งเป็นจำนวนรุ้งที่เป็นไปได้

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

น่าเสียดายที่วิธีการที่ไร้เดียงสาใด ๆ ดูเหมือนว่าจะใช้เวลา 16 ไบต์วิธีหนึ่งดังกล่าวคือ Ṃɓ_J×¥H÷‘H<¬Ȧð€Sอย่างไรก็ตามวิธีการที่ใช้ในที่นี้มีประสิทธิภาพมากกว่าและสั้นกว่ามาก!

วิธีนี้สร้างสแต็กรุ้งมากกว่าเพียงพอตามจำนวนอนุภาครวมถึงแถบอัลตร้าไวโอเลตและเพิ่มขึ้น 1 สำหรับแต่ละสแต็กซึ่งเป็นไปได้

การทดสอบความเป็นไปได้คือการตรวจสอบว่ามีเพียงแถบเดียวที่เป็นไปไม่ได้เนื่องจากเราต้องการอนุภาคแถบสีม่วงพิเศษ แต่มีค่าเป็นศูนย์

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

ฉันรู้สึกว่าคุณมันยากเกินกว่าที่ฉันจะบีบอัลกอริทึมของ Okx ใน 18 ไบต์ ...
Erik the Outgolfer

นอกจากนี้ยังมีความคิดที่ฉลาดด้วย§ỊS!
Erik the Outgolfer

1

05AB1E , 14 ไบต์

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

ลองออนไลน์!

n

อัลกอริทึม Pyth ⟶ 05AB1E อัลกอริทึม

มีวิธีการมากมายที่เราสามารถลองแก้ปัญหาความท้าทายนี้ได้ใน 05AB1E ดังนั้นฉันจึงลองใช้สองสามวิธีและวิธีนี้จะสั้นที่สุด การปรับสูตรดังกล่าวจากคำตอบ Pyth ของฉันโดยคำนึงว่า 05AB1E ใช้การจัดทำดัชนี 1 เราสามารถสร้างฟังก์ชันของเราดังนี้:

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

Ii

4n2+n(i2)Ii=0

โปรดทราบว่าความเท่าเทียมกันนี้ไม่แม่นยำ (แต่ขณะนี้ฉันไม่ทราบวิธีที่จะระบุอย่างเป็นทางการมากขึ้น) และการแก้ปัญหาของสมการนี้จะให้ผลเป็นจำนวนจุดลอยตัว แต่เราแก้ไขปัญหานี้โดยใช้การแบ่งพื้นแทนการแบ่งที่แม่นยำ หลังจากนั้น. อย่างไรก็ตามเพื่อดำเนินการต่อกับอาร์กิวเมนต์ของเราส่วนใหญ่คุณอาจคุ้นเคยกับการแก้สมการดังกล่าวดังนั้นที่นี่เรามีมัน:

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

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

n=2+(i2)2+16Iii8

ซึ่งเป็นความสัมพันธ์ที่แน่นอนที่คำตอบนี้นำไปใช้


1

C ++, 127 125 ไบต์

ตัดออกไป 2 ไบต์ด้วย 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;}

ลองออนไลน์!

ฟังก์ชันใช้อาร์เรย์แบบ C ของเจ็ด ints และส่งกลับค่า 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

คำอธิบาย:

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

สวัสดียินดีต้อนรับสู่ PPCG! ผมไม่ทราบว่า c ++ ดีเกินไป แต่ผมค่อนข้างมั่นใจว่าคุณสามารถกอล์ฟส่วนนี้: ไปนี้: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;} for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;นอกจากนี้คุณอาจให้รหัสTIO-linkพร้อมรหัสทดสอบหรือไม่
Kevin Cruijssen

@KevinCruijssen ขอขอบคุณ!
Max Yekhlakov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.