Code Golf Christmas Edition: วิธีการพิมพ์ต้นคริสต์มาสที่มีความสูง N


89

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

ทุกภาษาชื่นชมถ้าคุณเห็นภาษาที่นำไปใช้แล้วและคุณสามารถทำให้สั้นลงแก้ไขได้ถ้าเป็นไปได้ - แสดงความคิดเห็นเป็นอย่างอื่นและหวังว่าจะมีคนล้างความยุ่งเหยิง รวมบรรทัดใหม่และ White Spaces เพื่อความชัดเจน แต่อย่ารวมไว้ในจำนวนอักขระ

ต้นคริสต์มาสถูกสร้างขึ้นเช่นนี้โดยมี "ลำตัว" ซึ่งประกอบด้วยเพียงศูนย์กลาง "*"

N = 3:

   *
  ***
 *****
   *

N = 4:

    *
   ***
  *****
 *******
    *

N = 5:

     *
    ***
   *****
  *******
 *********
     *

N กำหนดความสูงของกิ่งก้านที่ไม่รวมลำต้นหนึ่งบรรทัด

สุขสันต์วันคริสต์มาส PPCG!

คำตอบ:


46

J , 24 ตัวอักษร

(,{.)(}:@|."1,.])[\'*'$~

   (,{.)(}:@|."1,.])[\'*'$~5
    *    
   ***   
  *****  
 ******* 
*********
    *    

คำอธิบาย:

'*'$~5
*****

[\'*'$~5
*    
**   
***  
**** 
*****

จากนั้น}:@|."1กลับแต่ละแถวและแถบปิดคอลัมน์สุดท้ายและลวดเย็บกระดาษมัน,.]

จากนั้น,{.วางคอลัมน์แรกไปที่ด้านล่าง

รายการก่อนหน้า :

29 ตัวอักษรไม่มีช่องว่างเลย

   ((\: i. @ #)}.) "$ 1 & '*'" 0>: 0 ~ I.3
  * * * *
 ***
*****
  * * * *
   ((\: i. @ #)}.) "$ 1 & '*'" 0>: 0 ~ I.11
          * * * *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
*********************
          * * * *

   NB นับจาก 1 ถึง n จากนั้น 1 อีกครั้ง
   >: 0 ~ I.3
1 2 3 1
   NB ทำซ้ำ '*' x แต่ละครั้ง
   $ & '*' "0>: 0 ~ I.3
* * * *
**
***
* * * *
   NB ย้อนกลับแต่ละแถว
   (\: i. @ #) "$ 1 & '*'" 0>: 0 ~ I.3
  * * * *
 **
***
  * * * *
   NB ถอดคอลัมน์นำหน้าออก
   } "$ 1 & '*'" 0>:. 0 ~ I.3

* * * *
**

   NB วางด้วยกัน
   ((\: i. @ #)}.) "$ 1 & '*'" 0>: 0 ~ I.3
  * * * *
 ***
*****
  * * * *

ด้วยอักขระเพิ่มอีกเพียง 9 ตัวคุณสามารถตั้งชื่อให้ฟังก์ชันนี้ได้c=:[:((\:i.@#),}.)"1[:$&'*'"0[:>:0,~i.
ephemient

11
พวกคุณใช้ห้องสมุดเอกสารประเภท J เพื่อเข้าใจโค้ดหรือไม่? :)

92

Brainfuck, 240 ตัวอักษร

              ,
             >++
            +++++
           +[-<---
          --->],[>+
         +++++++[-<-
        ----->]<<[->+
       +++++++++<]>>]<
      [->+>+>>>>>>>+<<<
     <<<<<<]>>>>++++++++
    [-<++++>]>++++++[-<++
   +++++>]+>>>++[-<+++++>]
  <<<<<<[-[>.<-]<[-<+>>+<]<
 [->+<]>>>>>[-<.>>+<]>[-<+>]
>.<<++<<<-<->]>>>>>>>-[-<<<<<
           <.>>>
           >>>]<
           <<<<.

ยังไม่เสร็จ ใช้งานได้ แต่ใช้กับตัวเลขหลักเดียวเท่านั้น

แก้ไข: เสร็จแล้ว! ใช้งานได้กับล่ามที่ใช้ 0 เป็น EOF ดูNOTEs ในแหล่งความคิดเห็นสำหรับผู้ที่มี -1

แก้ไขอีกครั้ง: ฉันควรทราบว่าเนื่องจาก Brainfuck ไม่มีวิธีมาตรฐานสำหรับการอ่านอาร์กิวเมนต์บรรทัดคำสั่งฉันใช้ stdin (อินพุตมาตรฐาน) แทน แน่นอนว่า ASCII

แก้ไขเป็นครั้งที่สาม: โอ้ที่รักดูเหมือนว่าฉันถอด.ตัวละคร (เอาท์พุท) ตัวอักษรเมื่อกลั่นตัวรหัส แก้ไขแล้ว...

นี่คือการจัดการหน่วยความจำพื้นฐานของลูปหลัก ฉันแน่ใจว่าสามารถปรับให้เหมาะสมอย่างมากเพื่อลดจำนวนตัวละครลง 30 หรือมากกว่านั้น

  1. ชั่วคราว
  2. สำเนาเคาน์เตอร์
  3. ตัวนับ (นับเป็น 0)
  4. อักขระช่องว่าง (ทศนิยม 32)
  5. อักขระดอกจัน (ทศนิยม 42)
  6. จำนวนเครื่องหมายดอกจันในบรรทัดปัจจุบัน (ตัวนับ 1 + 2 *)
  7. ชั่วคราว
  8. อักขระบรรทัดใหม่
  9. ชั่วคราว?
  10. จำนวนบรรทัดทั้งหมด (เช่นค่าอินพุต; เก็บไว้จนถึงส่วนท้ายสุดเมื่อพิมพ์ลำต้น)

เวอร์ชันย่อ:

,>++++++++[-<------>],[>++++++++[-<------>]<<[->++++++++++<]>>]<[->+>+>>>>>>>+<<<<<<<<<]>>>>++++++++[-<++++>]>++++++[-<+++++++>]+>>>++[-<+++++>]<<<<<<[-[>.<-]<[-<+>>+<]<[->+<]>>>>>[-<.>>+<]>[-<+>]>.<<++<<<-<->]>>>>>>>-[-<<<<<<.>>>>>>]<<<<<.

และรุ่นสวย:

ASCII to number
,>
++++++++[-<------>]  = 48 ('0')

Second digit (may be NULL)
,
NOTE:   Add plus sign here if your interpreter uses negative one for EOF
[ NOTE: Then add minus sign here
 >++++++++[-<------>]
 <<[->++++++++++<]>>  Add first digit by tens
]

Duplicate number
<[->+>+>>>>>>>+<<<<<<<<<]>>

Space char
>>++++++++[-<++++>]

Asterisk char
>++++++[-<+++++++>]

Star count
+

New line char
>>>++[-<+++++>]<<<

<<<

Main loop
[
Print leading spaces
-[>.<-]

Undo delete
<[-<+>>+<]
<[->+<]
>>

Print stars
>>>[-<.>>+<]

Add stars and print new line
>[-<+>]
>.<
<++

<<<

-<->
End main loop
]

Print the trunk
>>>>>>>
-[-<<<<<<.>>>>>>]
<<<<<.

Merry Christmas =)

1
สมองของฉันรู้สึกแย่ ..... ป่วย

3
โอ้พระเจ้า.
คนขี้ขลาดนิรนาม

63

Perl, 50 ตัวอักษร

(1 ช่องว่างที่เกี่ยวข้อง)

Perl: รุ่นหนึ่งบรรทัด:

print$"x($a-$_),'*'x($_*2+1),$/for 0..($a=pop)-1,0

และตอนนี้มี whitesapce มากขึ้น:

print $"  x ( $a - $_ ),             #"# Syntax Highlight Hacking Comment
      '*' x ( $_ * 2  + 1),
      $/
for 0 .. ( $a = pop ) - 1, 0;

$ perl tree.pl 3
   *
  ***
 *****
   *
$ perl tree.pl 11
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
   *****************
  *******************
 *********************
           *
$ 

คำอธิบายแบบขยายสำหรับผู้ใช้ที่ไม่ใช่ Perl

# print $Default_List_Seperator ( a space )  
#     repeated ( $a - $currentloopiterationvalue ) times,
print $" x ( $a - $_ ), 
#"# print '*' repeated( $currentloopiteration * 2 + 1 ) times. 
  '*' x ( $_ * 2  + 1),
# print $Default_input_record_seperator ( a newline )
  $/
# repeat the above code, in a loop, 
#   iterating values 0 to ( n - 1) , and then doing 0 again
for 0 .. ( $a = pop ) - 1, 0;
# prior to loop iteration, set n to the first item popped off the default list, 
#   which in this context is the parameters passed on the command line. 

25
อึศักดิ์สิทธิ์ ... Perl อย่างแท้จริงไม่สามารถอ่านได้

8
@zenazn เช่นกันควรสังเกตว่าการเล่นกอล์ฟส่วนใหญ่เป็นรหัสที่ไม่ดีในภาษาใด ๆ หากนี่เป็นการแข่งขันเพื่อรหัสที่ดีที่สุดเราก็สามารถชนะได้เช่นกัน
Kent Fredric

5
@zenazn: หลักฐานคุณสามารถเห็นเราร่วมมือกันและปรับปรุงรหัสของแต่ละคนข้างต้นซึ่งพิสูจน์ให้เห็นว่าเราสามารถอ่านรหัสอื่น ๆ ได้อย่างสมบูรณ์แบบ
Kent Fredric

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

2
@RobH: J เป็นลูกของ APL ในความรู้สึกบางอย่างมันไม่สามารถอ่านได้มากขึ้นเพราะไม่ได้ใช้ชุดอักขระของ APL ที่มีสัญลักษณ์พิเศษสำหรับการดำเนินการทุกครั้ง - มันโอเวอร์โหลดอักขระ ASCII ที่มีความหมายหลายอย่างแทน stackoverflow.com/questions/392788/1088931#1088931
ephemient

26

ภาษา: Python (ผ่านเชลล์), จำนวน Char: 64 (2 ช่องว่างที่สำคัญ)

python -c "
n=w=$1
s=1
while w:
    print' '*w+'*'*s
    s+=2
    w-=1
print' '*n+'*'"

$ sh ax6 11
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
   *****************
  *******************
 *********************
           *

8
สิ่งที่ฉันชอบมากที่สุดเกี่ยวกับวิธีแก้ปัญหานี้ก็คือหลามทำให้ยากที่จะเขียนโค้ดที่คลุมเครือมันเป็นหนึ่งในวิธีการแก้ปัญหาที่อ่านง่ายที่สุด

คุณกำลังใช้เชลล์เพื่อประมวลผลอาร์กิวเมนต์ซึ่งไม่ได้อยู่ในจิตวิญญาณของรหัส golf IMO การใช้ "import sys" และ "n = w = int (sys.argv [1])" และการเยื้องของอักขระ 1 ตัวสำหรับตัวลูปฉันใช้ตัวอักษร 89 ตัวสำหรับเวอร์ชันนี้

4
นี่คือวิธีที่ฉันเคยทำมาก่อน จิตวิญญาณของคำถามนี้คือการมีความสนุกสนานและนอกจากนี้ยังไม่มีข้อกำหนดของการใช้ภาษาเดียวเท่านั้น :) ดูคำตอบที่สมองเช่น ไม่มีข้อโต้แย้ง

26

x86 asm 16 บิต, 50 ไบต์

ไม่มีแอสเซมบลีเวอร์ชันหรือยัง :)

    bits 16
    org 100h

    mov si, 82h
    lodsb
    aaa
    mov cx, ax
    mov dx, 1
    push cx 
    mov al, 20h
    int 29h
    loop $-2
    push dx
    mov al, 2ah
    int 29h
    dec dx
    jnz $-3
    pop dx
    mov al, 0ah
    int 29h
    inc dx
    inc dx
    pop cx
    loop $-23
    shr dx, 1
    xchg cx, dx
    mov al, 20h
    int 29h
    loop $-2
    mov al, 2ah
    int 29h
    ret

(หมายเหตุ: N ถูก จำกัด ที่ 1 - 9 ในรุ่นนี้)

G:\>tree 9
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
         *

ดาวน์โหลดได้ที่นี่


24

ภาษา: Windows Batch Script ( ตกตะลึง! )

@echo off
echo Enable delayed environment variable expansion with CMD.EXE /V

rem Branches
for /l %%k in (1,1,%1) do (
set /a A=%1 - %%k
set /a B=2 * %%k - 1
set AA=
for /l %%i in (1,1,!A!) do set "AA=!AA! "
set BB=
for /l %%i in (1,1,!B!) do set BB=*!BB!
echo !AA!!BB!
)

rem Trunk
set /a A=%1 - 1
set AA=
for /l %%i in (1,1,!A!) do set "AA=!AA! "
echo !AA!*

ทำโทษ! ฉันชอบมัน

ดีมาก ... คุณจะได้รับ +1

2
การขยายตัวตัวแปรล่าช้าสามารถเปิดใช้งานโดยใช้setlocal enabledelayedexpansionคำสั่ง
Helen

เพื่อน. อย่างจริงจัง?

ไม่สามารถทำงานได้ ครั้งแรกที่ฉันลอง
Fabinout

21

Ruby, 64 ไบต์

n=ARGV[0].to_i
((1..n).to_a+[1]).each{|i|puts' '*(n-i)+'*'*(2*i-1)}

n=$*[0].to_i
((1..n).to_a<<1).each{|i|puts' '*(n-i)+'*'*(2*i-1)}

สุขสันต์วันคริสต์มาสทั้งหมด!

แก้ไข: ปรับปรุงเพิ่มตามที่ Joshua Swink แนะนำ


แดงฉันหวังว่าจะไม่มีใครลองเป็นทับทิม งานที่ดี.

นี่เป็นทับทิมสายดีมาก

ฉันดูเหมือนจะผิดเพี้ยนไปหรือไม่ ขออภัยไม่ใช่ความตั้งใจของฉัน! สุขสันต์วันคริสต์มาส! :)

ไม่ได้หมายความว่าเป็นคนใจร้ายและแน่นอนคุณพูดถูก! สุขสันต์วันคริสต์มาส!

1
ใน 1.9 คุณสามารถบันทึกตัวอักษรเพิ่มเติมได้: n=$*[0].to_i;puts [*1..n,1].map{|i|" "*(n-i)+"*"*(2*i-1)}นำลงมาที่ 58.

14

ภาษา: C #, จำนวน Char: 120

static void Main(string[] a)
{
    int h = int.Parse(a[0]);

    for (int n = 1; n < h + 2; n++)
        Console.WriteLine(n <= h ?
            new String('*', n * 2 - 1).PadLeft(h + n) :
            "*".PadLeft(h + 1));
    }
}

เพียงแค่โค้ดโดยไม่มีการจัดรูปแบบ (120 ตัวอักษร):

int h=int.Parse(a[0]);for(int n=1;n<h+2;n++)Console.WriteLine(n<=h?new String('*',n*2-1).PadLeft(h+n):"*".PadLeft(h+1));

เวอร์ชันที่มีอักขระ 109 ตัว (เฉพาะรหัส):

for(int i=1,n=int.Parse(a[0]);i<n+2;i++)Console.WriteLine(new String('*',(i*2-1)%(n*2)).PadLeft((n+(i-1)%n)));

ผลลัพธ์สำหรับ height = 10:

          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
          *

13

ภาษา: dc (ผ่านเปลือกหอย) จำนวนถ่าน: 83

รุ่น dc ที่สั้นกว่าเล็กน้อย:

dc -e '?d1rdsv[d32r[[rdPr1-d0<a]dsaxszsz]dsbx1-rd42rlbx2+r10Plv1-dsv0<c]dscxszsz32rlbx[*]p' <<<$1

แก้ไข: เปลี่ยนค่าคงที่ 10 เป็น $ 1


11
ท่านผู้ดีท่านคืออะไร

1
แค่อ่านหน้าคน ;-)

12

python, เคล็ดลับ "-c" ... @ 61 chars (และหนึ่งบรรทัด)

python -c"for i in range($1)+[0]:print' '*($1-i)+'*'*(2*i+1)"

จริงๆแล้วมันคือ 57 ตัวอักษรมีเพียงพื้นที่ '' เท่านั้นที่สำคัญตามข้อกำหนดของคำถาม

10

ต่อไปนี้เป็นรุ่น Haskell ที่ประหยัดพื้นที่ซึ่งมีความยาว 107 ตัวอักษร:

main=interact$(\g->unlines$map(\a->replicate(g-a)' '++replicate(a*2-1)'*')$[1..g]++[1]).(read::[Char]->Int)

ใช้มัน:

$ echo 6 | runhaskell tree.hs
     *
    ***
   *****
  *******
 *********
***********
     *

สุขสันต์วันคริสต์มาสทุกคน :)


10

ภาษา: dc (ผ่านเชลล์), จำนวน Char: 119 (1 พื้นที่สำคัญ)

เพียงเพื่อความสับสนของมัน :)

dc -e "$1dsnsm"'
[[ ]n]ss
[[*]n]st
[[
]n]sl
[s2s1[l2xl11-ds10<T]dsTx]sR
[lndlslRxlcdltlRxllx2+sc1-dsn0<M]sM
1sclMxlmlslRxltxllx
'

$ sh ax3 10
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
          *

เอ่อจริงจังแล้วเหรอ ฉันไม่เข้าใจบรรทัดเดียวของ: P

dc เป็นเครื่องคิดเลขแบบกลับด้าน 'คนดีซี' เป็นวิธีที่ชัดเจนที่จะไป :)

6

ดีกว่า C ++ ประมาณ 210 ตัวอักษร:

#include <iostream>
using namespace std;
ostream& ChristmasTree(ostream& os, int height) {
    for (int i = 1; i <= height; ++i) {
        os << string(height-i, ' ') << string(2*i-1, '*') << endl;
    }
    os << string(height-1, ' ') << '*' << endl;
    return os;
}

ลดขนาดเป็น 179:

#include <iostream>
using namespace std;ostream& xmas(ostream&o,int h){for(int i=1;i<=h;++i){o<<string(h-i,' ')<<string(2*i-1,'*')<<endl;}o<<string(h-1,' ')<<'*'<<endl;return o;}

ใช้ std; ใคร?

strager - เมื่อฉันเริ่มมี std เพียงไม่กี่ตัวเท่านั้น :: 'and' using namespace std; ' เป็นข้อความจำนวนมาก ฉันคิดว่าตอนนี้จะมีตัวละครน้อยลง

เวอร์ชั่นของคุณไม่มีประสิทธิภาพมากกว่าของฉันเพราะมันต้องสร้างสตริงรุ่นของฉันก็พิมพ์อักขระที่มันต้องการ :)
pyon

6

ภาษา: หลาม, ไม่มีกลอุบาย, 78 ตัวอักษร

import sys
n=int(sys.argv[1])
for i in range(n)+[0]:print' '*(n-i)+'*'*(2*i+1)

6

Groovy 62B

n=args[0]as Long;[*n..1,n].any{println' '*it+'*'*(n-~n-it*2)}

_

n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }

5

ปรับปรุงคำตอบของΤΖΩΤΖΙΟΥ ฉันไม่สามารถแสดงความคิดเห็นดังนั้นนี่คือโพสต์ใหม่ 72 ตัวอักษร

import sys
n=int(sys.argv[1])
for i in range(n)+[0]:
   print ("*"*(2*i+1)).center(2*n)

ใช้เคล็ดลับ "python -c" 61 ตัว

python -c "
for i in range($1)+[0]:
   print ('*'*(2*i+1)).center(2*$1)
"

ฉันได้เรียนรู้ฟังก์ชั่นศูนย์กลางและ "python -c" สามารถยอมรับรหัสบรรทัดมากกว่าหนึ่งรหัส ขอบคุณΤΖΩΤΖΙΟΥ


5

C # ใช้ Linq:

    using System;
    using System.Linq;
    class Program
        {
            static void Main(string[] args)
            {
                int n = int.Parse(args[0]);
                int i=0;
                Console.Write("{0}\n{1}", string.Join("\n", 
                   new int[n].Select(r => new string('*',i * 2 + 1)
                   .PadLeft(n+i++)).ToArray()),"*".PadLeft(n));
            }
       }

นักต้มตุ๋น 170 คน

int n=int.Parse(a[0]);int i=0;Console.Write("{0}\n{1}",string.Join("\n",Enumerable.Repeat(0,n).Select(r=>new string('*',i*2+1).PadLeft(n+i++)).ToArray()),"*".PadLeft(n));

5

AWK, 86 ตัวอักษรในหนึ่งบรรทัด

awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}'

echo "8" | awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}'
        #
       ###
      #####
     #######
    #########
   ###########
  #############
 ###############
        #

cat tree.txt
3
5

awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}' tree.txt
   #
  ###
 #####
   #
     #
    ###
   #####
  #######
 #########
     #

5

ภาษา: Java, Char count: 219

class T{ /* 219 characters */
  public static void main(String[] v){
    int n=new Integer(v[0]);
    String o="";
    for(int r=1;r<=n;++r){
      for(int s=n-r;s-->0;)o+=' ';
      for(int s=1;s<2*r;++s)o+='*';
      o+="%n";}
    while(n-->1)o+=' ';
    System.out.printf(o+"*%n");}}

สำหรับการอ้างอิงฉันสามารถโกนโซลูชัน Java ก่อนหน้านี้โดยใช้การเรียกซ้ำจนถึง 231 ตัวอักษรจากขั้นต่ำก่อนหน้า 269 แม้ว่าจะนานกว่าเล็กน้อยฉันก็ชอบโซลูชันนี้เพราะTเป็นวัตถุเชิง คุณสามารถสร้างฟอเรสต์ขนาดเล็กสุ่มTได้ นี่คือวิวัฒนาการล่าสุดของการฝึกฝน:

class T{ /* 231 characters */
  public static void main(String[] v){new T(new Integer(v[0]));}}
  String o="";
  T(int n){
    for(int r=1;r<=n;++r){
      x(' ',n-r);x('*',2*r-1);o+="%n";}
    x(' ',n-1);
    System.out.printf(o+"*%n");
  }
  void x(char c,int x){if(x>0){o+=c;x(c,x-1);}
 }

นับจำนวนตัวอักษรใหม่ของคุณคือ 251 (1 พื้นที่ที่เกี่ยวข้อง)

กำจัด "public void main main" ใช้ static static และคอมไพล์ด้วย java 6;)
Fabinout

ฉันรู้ว่ามันเกือบ 9 ปีแล้ว แต่คุณสามารถตีกอล์ฟบางสิ่ง: class T{public static void main(String[]v){long n=new Long(v[0]),r=1,s;String o="";for(;r<=n;r++){for(s=n-r;s-->0;)o+=' ';for(;++s<2*r;)o+='*';o+="\n";}while(n-->1)o+=' ';System.out.println(o+"*");}}(199 ตัวอักษร / ไบต์)
Kevin Cruijssen


5

21 ตัวอักษรที่มี dyalog APL

m,⍨⌽0 1↓m←↑'*'\¨⍨1,⍨⍳

⍳ให้เวกเตอร์ของจำนวนเต็มเริ่มต้นด้วย 1

1, ⍨เพิ่มหนึ่งไปยังจุดสิ้นสุดของเวกเตอร์ นี่จะเป็นตีนต้นไม้

'*' \ ¨⍨ให้เวคเตอร์ของ * -strings ด้วยความยาวที่กำหนดโดยเวกเตอร์ก่อนหน้า

↑แปลงเวคเตอร์เป็นเมทริกซ์และเพิ่มช่องว่างทางด้านขวา

m ←เก็บเมทริกซ์เป็น m

0 1 ↓ลดลงเป็นศูนย์แถวและคอลัมน์แรก

⌽ย้อนกลับเมทริกซ์

m, ⍨เชื่อมต่อกับ m ที่ด้านขวา


m,⍨⌽0 1↓m←->(⌽,0 1↓⊢)
ngn

4

ภาษา: C, จำนวน Char: 133

การปรับปรุง C-version

char s[61];

l(a,b){printf("% *.*s\n",a,b,s);}

main(int i,char**a){
  int n=atoi(a[1]);memset(s,42,61);
  for(i=0;i<n;i++)l(i+n,i*2+1);l(n,1);
}

ใช้งานได้และใช้ความสูงของต้นไม้เป็นอาร์กิวเมนต์ ต้องการคอมไพเลอร์ที่ยอมรับโค้ด K & R-style

ฉันรู้สึกสกปรกมากตอนนี้ .. รหัสนี้น่าเกลียด


ปัญหานี้มีปัญหาเหมือนกับการตัดครั้งแรกของฉันใน Java มันไม่ใช่โปรแกรมที่สมบูรณ์พร้อมการใช้อาร์กิวเมนต์บรรทัดคำสั่ง!

โอ้? จำเป็นหรือไม่ ไม่มีปัญหา. ฉันจะแก้ไขมัน

มีอักขระ 138 ตัวเมื่อมีการลบบรรทัดใหม่ที่ไม่จำเป็นทั้งหมด
Berk Güderสามารถ

ฉันนับ 133 (ออกเพียงช่องว่างและการตรวจสอบขนาดไฟล์)

4

R (62 ไบต์)

ฉันยังไม่เห็นวิธีแก้ปัญหา R ถูกต้องฉันถ้าฉันพลาดมัน

for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")

เอาท์พุท:

> N <- 3
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
  *
 ***
*****
  *
> 
> N <- 4
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
   *
  ***
 *****
*******
   *
> 
> N <- 5
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
    *
   ***
  *****
 *******
*********
    *

3

ภาษา: C, จำนวน Char: 176 (2 ช่องว่างที่เกี่ยวข้อง)

#include <stdio.h>
#define P(x,y,z) for(x=0;x++<y-1;)printf(z);
main(int c,char **v){int i,j,n=atoi(v[1]);for(i=0;i<n;i++){P(j,n-i," ")P(j,2*i+2,"*")printf("\n");}P(i,n," ")printf("*\n");}

3

รุ่นเชลล์ 134 ตัวอักษร:

#!/bin/sh
declare -i n=$1
s="*"
for (( i=0; i<$n; i++ )); do
    printf "%$(($n+$i))s\n" "$s"
    s+="**"
done
printf "%$(($n))s\n" "*"


3

ภาษา: Python, จำนวนถ่านที่สำคัญ: 90

มันน่าเกลียด แต่มันได้ผล:

import sys
n=int(sys.argv[1])
print"\n".join(" "*(n-r-1)+"*"*(r*2+1)for r in range(n)+[0])

...

$ python tree.py 13
            *
           ***
          *****
         *******
        *********
       ***********
      *************
     ***************
    *****************
   *******************
  *********************
 ***********************
*************************
            *

นับจำนวนตัวอักษรของคุณคือ 98 (2 ช่องว่างที่สำคัญผู้ที่อยู่ในเครื่องหมายคำพูด)

3

เนื่องจากนี่คือ CW: ฉันไม่ชอบโค้ดกอล์ฟที่ถูกจัดระเบียบเสมอในแง่ของ "จำนวนตัวละคร" หรือบางอย่าง พวกเขาไม่สามารถจัดระเบียบในแง่ของจำนวนคำแนะนำสำหรับคอมไพเลอร์ / ล่าม (หรือเกณฑ์ที่คล้ายกัน)? นี่คือโซลูชัน Ruby อีกครั้งและโดยพื้นฐานแล้วก็เหมือนกัน แต่ตอนนี้สำหรับการบริโภคของมนุษย์ด้วย:

SPACE = " "
ASTERISK = "*"
height_of_tree=ARGV[0].to_i
tree_lines = (1..height_of_tree).to_a
tree_lines.push 1 # trunk
tree_lines.each do | line |
   spaces_before = SPACE*(height_of_tree-line)
   asterisks = ASTERISK*(2*line-1) 
   puts spaces_before + asterisks
end

ฉันเห็นด้วยกับคำสั่งแรก ในแง่เช่นนี้ภาษาอย่าง Perl มีข้อได้เปรียบในการเริ่มต้น ควรเป็นจำนวนสเตมเทตหรือที่คล้ายกัน

ขอบคุณ ... ฉันถามคำถามเกี่ยวกับกอล์ฟเมื่อวานนี้และวิธีการทำอาจเป็นได้ด้วย "โทเค็น" ... ด้วยความยาวชื่อเป็นต้นไม่ได้ถูกลงโทษ



2

PHP, 111 ตัวอักษร

(อักขระตัวสุดท้ายควรเป็นบรรทัดใหม่)

<?php $n=$argv[1];for($r='str_repeat';$i<$n;$i++)echo $r(' ',$n-$i).$r('*',$i*2+1)."\n";echo $r(' ',$n).'*' ?>

รุ่นที่อ่านได้:

<?php

$n = $argv[1];

for ($r = 'str_repeat'; $i < $n; $i++)
    echo $r(' ', $n - $i) . $r('*' , $i * 2 + 1) . "\n";

echo $r(' ', $n) . '*'

?>

คุณสามารถบันทึกหลายตัวละครโดยการสร้างสตริงจากนั้นก็สะท้อน ฉันคิด. ลองดูสิ

ความคิดที่ดี แต่ฉันลองแล้วมันจะทำให้นานขึ้นเท่านั้น '$ t. = (... )' เป็นตัวอักษรหนึ่งตัวที่สั้นกว่า 'echo (... )' และจากนั้นคุณจะต้อง 'echo $ t' ในตอนท้ายเช่นกัน

ย่อให้สั้นลง 4 ตัวอักษรโดยลบ '$ i = 0;' ส่วนแรกของคำสั่ง for PHP ถือว่าตัวแปรที่ไม่มีอยู่ที่ใช้ในบริบทจำนวนเต็มเป็น 0 อยู่แล้ว! : P

บันทึกถ่านโดยใส่ $ r = .. ไว้ข้างในเพื่อ นอกจากนี้ฉันว่าอักขระบรรทัดใหม่ควรเป็นหนึ่งไบต์ไม่ใช่สอง =]

ใช่ฉันเพิ่งรู้ว่าฉันผิดโดยหนึ่งเพราะฉันนับโดยใช้หมายเลขคอลัมน์ในตัวแก้ไขข้อความของฉัน ฉันใช้ linux ดังนั้น newline char จึงเป็นหนึ่งไบต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.