สุขสันต์วันฟีโบนักชี!


20

พื้นหลัง

วันนี้ (หรือเมื่อวาน) คือ (หรือเคย) 11/23 หรือวัน Fibonacci! จะมีวิธีใดที่ดีไปกว่าการเฉลิมฉลองการทำเค้ก fibonacci?


ตัวอย่าง

3

    ii
i_i_ii_i_i 

8

              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
            i ii i            
            i ii i            
            i ii i            
            i ii i            
            i ii i            
          i i ii i i          
          i i ii i i          
          i i ii i i          
        i i i ii i i i        
        i i i ii i i i        
      i i i i ii i i i i      
    i i i i i ii i i i i i    
i_i_i_i_i_i_i_ii_i_i_i_i_i_i_i

ท้าทาย

คุณไม่ได้ทำเค้กจริง ๆ เพียงแค่เทียนเพราะฉันไม่สามารถทำเค้กศิลปะ

ในการทำเค้กคุณต้องรับn หมายเลขฟีโบนัชชีก่อนเรียงจากน้อยไปมาก ความสูงของแท่งเทียน ( i) ถูกกำหนดโดยค่าของหมายเลขฟีโบนักชีในปัจจุบัน เทียนถูกคั่นด้วยเครื่องหมายขีดล่าง ( _)

เค้กควรมีความสมมาตร ดังนั้นเทียนควรจะพลิกและตัดแบ่ง

ตัวอย่างการก่อสร้าง

Input: 6
First 6 Fibonacci Numbers: 1, 1, 2, 3, 5, 8
Candle heights:

          i
          i
          i
        i i
        i i
      i i i
    i i i i
i i i i i i
-----------
1 1 2 3 5 8

Output would be:
          ii
          ii
          ii
        i ii i
        i ii i
      i i ii i i
    i i i ii i i i
i_i_i_i_i_ii_i_i_i_i_i 

หมายเลขฟีโบนักชีอ้างอิง

สำหรับการอ้างอิงต่อไปนี้เป็นตัวเลขแรก 15 หมายเลขฟีโบนักชี 1ในความท้าทายนี้คุณจะเริ่มต้นที่

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610

9
ฉันเสียใจที่จะแจ้งให้ West Coast ของสหรัฐอเมริกาว่าสำหรับส่วนใหญ่ของโลก 11/23 มากกว่าหรือเกือบ :( นี่เพิ่งเปลี่ยนจากcode-golfเป็นcode ที่เร็วที่สุด
cat

1
@sysreq ไม่เป็นไรพวกเขาเพียงแค่ต้องเดินทางไปยังชายฝั่งตะวันตก (ทันที) แล้วพวกเขาสามารถเพลิดเพลินกับวันฟีโบนักชีในช่วง 5 ชั่วโมงที่ผ่านมา (7 สำหรับฮาวาย): p
Downgoat

6
ความท้าทายนี้จะเป็นตำนานในรอบ 43 ปี (11/23/58)
Arcturus

9
ใน 43 ปีรูปแบบวันที่ mm / dd / yy จะเป็นประวัติ สิ่งมีชีวิตที่ชาญฉลาดทั้งหมดจะเปลี่ยนเป็น yyyy / mm / dd ... :-P

1
@sysreq การโพสต์คำตอบที่ตีกอล์ฟในภาษา verbose ได้รับการสนับสนุนอย่างมาก แน่นอนว่าคุณไม่ได้แข่งขันกับ Pyth แต่คุณสามารถแข่งขันกับคำตอบอื่น ๆ ในภาษาเดียวกันหรือในภาษาที่มีความละเอียดมาก
Martin Ender

คำตอบ:


2

Pyth, 31 ไบต์

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _   implicit: Q = input number
          u        tQ]\i          reduce the list [1, ..., Q-2], start with G=["i"]
            aGk                      append the empty string to G
           a   s>4G                  append the sum of the last 4 strings in G to G
                                  this gives ["i", "", "i", "", "ii", "", "iii",..]
       s_B                        extend the list with the reversed list
     .t                  d        pad to a rectangle with spaces and transposes
   J_                             reverse the order and assign to J
  PJ                              remove the last string of J
 a                                and append
                         XeJ" _   the last string of J with spaces replaced by "_"
j                                 print each string on a separate line


5

CJam, 41 39 ไบต์

"i""_"1$ri({1$1$4$+}*]),f{Se[}W<_W%+zN*

สิ่งนี้จะพิมพ์พื้นที่ว่างนำหน้าในจำนวนที่เหมาะสม ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

"i""_"1$ e# Push "i", "_", and a copy of "i".
ri(      e# Read an integer from STDIN and subtract 1.
{        e# Do that many times:
  1$     e#   Copy the last underscore.
  1$4$+  e#   Copy the last strings of i's and concatenate them.
}*       e#
]),      e# Wrap the results in an array, pop the last string, and get its length.
f{       e# For each remaining string, push the string and the length; then:
  Se[    e#   Pad the string to that length by prepending spaces.
}
W<       e# Remove the last string (underscore).
         e# We have now generated the columns of the left half of the output.
_W%+     e# Append a reversed copy (columns of right half).
z        e# Transpose rows with columns.
N*       e# Separate the rows by linefeeds.

3

TeaScript, 93 84 76 + 1 = 77 ไบต์

+1 ไบต์สำหรับ "อินพุตคือตัวเลข?" ช่องทำเครื่องหมาย

r×ß(p.R((w=F(x©-F(i¬©+"i"R(F(i¬±)t¡ß(j=i<w-1?" ":"_",(A=l¿i>0?j+l:l)µ)+Av©j§

เวอร์ชันที่ไม่ถูกปรับแต่ง:

r(x)m(#(p.R((w=F(x))-F(i+1))+"i"R(F(i+1))))t()m(#(j=i<w-1?" ":"_",(A=ls``.m(#i>0?j+l:l)j``)+Av))j`
`

ขอบคุณ@ Vɪʜᴀɴสำหรับเคล็ดลับ


คุณควรจะสามารถใช้rฟังก์ชั่นแทนA(x)f(0)เช่นr(x)m(#
Downgoat

@ Vɪʜᴀɴขอบคุณ มันArray.dupe()ทำอะไรมันไม่ทำงาน?
intrepidcoder

Array.dupe อาจเป็นชื่อที่ไม่ดีมันจะลบข้อมูลที่ซ้ำกันออกจากอาร์เรย์
Downgoat

@ Vɪʜᴀɴคุณควรใส่บทสรุปของแต่ละวิธีในส่วนชื่อคุณสมบัติที่มีอินพุต / เอาต์พุต args นอกจากนี้ Array.repeat และ String.reverse ก็ดีเช่นกัน
intrepidcoder

1
@sysreq ฉันหมายถึงไม่ได้ขอโทษด้วยความสับสน
intrepidcoder

3

Python 2, 117 ไบต์

a=b='i'
l=a,
exec"l+='_',b,;a,b=b,b+a;"*~-input()
for r in map(None,*l+l[::-1])[::-1]:print''.join(x or' 'for x in r)

แนวคิดนี้ง่ายมาก: สร้างภาพในคอลัมน์ที่เรียงจากล่างขึ้นบน, จากซ้ายไปขวาโดยที่ครึ่งขวาของมิเรอร์กลับด้านซ้าย คอลัมน์ถูกสร้างโดยการวนซ้ำ Fibonacci ซ้ำบนสตริงของi'สลับกับ_แถวด้านล่าง

หากต้องการพิมพ์รูปภาพด้วยคอลัมน์ที่เริ่มต้นจากด้านล่างเราจำเป็นต้องหมุนภาพซึ่งหมายถึงการเลื่อนและถอยหลัง น่าเสียดายที่ Python ไม่มีวิธีง่ายๆในการเปลี่ยนแถวของแถวที่มีความยาวไม่เท่ากัน built-in ziptruncates เป็นแถวที่สั้นที่สุด วิธีนี้ใช้map(None,_)กลอุบาย แต่ต้องแปลงพื้นที่ทั้งหมดเป็นNoneช่องว่างหลังจากนั้น


2

Haskell, 182 176 ไบต์

import Data.List
f=0:scanl(+)1f
b n c s|length s<n=b n c(c:s)|0<1=s
m s=s++reverse s
c n=mapM_ putStrLn$transpose$m$map(b(f!!n)' ')$intersperse"_"$map(\x->[1..f!!x]>>"i")[1..n]

โทรc.

( fถูกขโมยโดยไม่มีตำหนิจาก/programming/232861/fibonacci-code-golf )


คุณสามารถแทนที่โดยflip replicate 'i'.(f!!) \x->[1..f!!x]>>"i"
nimi

เยี่ยมมากขอบคุณ! นี่เป็นครั้งแรกที่ฉันเข้าใจเคล็ดลับการเล่นกอล์ฟแบบ monadic จริง ๆ แม้ว่าฉันจะยังไม่เกิดขึ้นกับตัวเอง ไม่มีเงื่อนงำเป็นวิธีการfทำงานยังคง ...
Leif Willerts

1

Matlab, 172 152 ไบต์

โชคไม่ดีที่ Matlab ไม่ได้สร้างในฟังก์ชัน Fibonacci และการจัดการสตริงเป็นบิตเที่ยวยุ่งยิ่ง

function t(n);f=@(n)getfield([0 1;1 1]^n,{3});m=char(flipud(bsxfun(@(a,b)(a<=f(b/2)&mod(b,2)==0)*'i',(1:f(n))',2:2*n)));m(end,2:2:end)='_';[m fliplr(m)]

ด้วยตัวแบ่งบรรทัด:

function t(n);
f=@(n)getfield([0 1;1 1]^n,{3});
m=char(flipud(bsxfun(@(a,b)(a<=f(b/2)&mod(b,2)==0)*'i',(1:f(n))',2:2*n)));
m(end,2:2:end)='_';
[m fliplr(m)]

1

ทับทิม, 151 146 142 137 132 ไบต์

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};s.map!{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map!{|a|v=a*'_ '[a.count(?i)<=>n];puts v+v.reverse}}

137 ไบต์

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};o=s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a*' ';v+v.reverse};o[-1]=o[-1].tr' ',?_;puts o}

142 ไบต์

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a*' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr' ',?_}}

146 ไบต์

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a.join' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr' ',?_}}

151 ไบต์

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+['i']*i}.transpose.map{|a|v=a.join ' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr ' ', '_'}}

Ungolfed:

-> n {
  s = 1,1
  3.upto(n) {
    s << s[-1] + s[-2]
  }
  s.map! { |i|
    [' '] * (s[-1]-i) + [?i] * i
  }.
  transpose.
  map! { |a|
    v = a * '_ '[a.count(?i)<=>n]
    puts v + v.reverse
  }
}

การใช้งาน:

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};s.map!{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map!{|a|v=a*'_ '[a.count(?i)<=>n];puts v+v.reverse}}[8]

เอาท์พุท:

              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
            i ii i            
            i ii i            
            i ii i            
            i ii i            
            i ii i            
          i i ii i i          
          i i ii i i          
          i i ii i i          
        i i i ii i i i        
        i i i ii i i i        
      i i i i ii i i i i      
    i i i i i ii i i i i i    
i_i_i_i_i_i_i_ii_i_i_i_i_i_i_i

1

Python 2, 213

บันทึก 12 ไบต์ด้วย DSM

def f(r):
 a=b=1
 while r:yield a;a,b=b,a+b;r-=1
n=list(f(input()))
n.remove(1)
h=max(n)-1
r=1
while h:
 l='  '*(len(n)+1)+('i '*r)[:-1];print(l+l[::-1]);h-=1
 if h in n:r+=1;n.pop()
l='i_'*r+'i_i'
print l+l[::-1]

เวอร์ชันที่ไม่ดี

max_height = input()
def fib(r):
    a=b=1
    while r:
        yield a
        a,b = b, a + b
        r-=1

numbers = [x for x in fib(max_height) if x>1]
highest = max(numbers) -1
rows = 1
while highest:
    line =' '*((len(numbers)+1)*2) + ' '.join('i'*rows)
    print(line + line[::-1])
    highest -= 1
    if highest in numbers:
        rows += 1
        numbers.pop()

line = '_'.join('i'*(rows+2))
print(line + line[::-1])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.