Роздрукуйте ялинку


26

Змагання

Роздрукуйте гарну ялинку з власною зіркою вгорі, використовуючи найкоротший можливий код. Зірка дерева - це зірочка ( *), а тіло дерева зроблене з 0дерева. Висота повинна бути 10 рядів. Кожен рядок повинен бути належним чином з відступом так, щоб попередній рядок був по центру наступного. Будь-який заданий рядок повинен мати на 2 більше 0, ніж попередній, за винятком першого, який є зіркою, і другого, який має лише один 0. Результат виглядає приблизно так:

          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

Розрив зав’язки для дерев висоти з можливістю зміни без зміни програмного забезпечення (крім зміни параметра висоти)

Будь ласка, вставте отримане дерево свого коду!


Таблиця лідерів


3
Не зовсім дублікат, але є такий на SO: Code Golf Christmas Edition: як роздрукувати ялинку висотою N
Hasturkun

Відповіді:


17

Гольфскрипт, 27 символів

" "9*"*"9,{n\.4$>\.+)"0"*}%

Отримане дерево виглядає приблизно так:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

Версія, яка використовує параметр висоти лише один раз, на один символ довша:

9." "*"*"@,{n\.4$>\.+)"0"*}%

Зчитування висоти від stdin (з введенням "10" для генерування прикладу дерева) займає стільки ж символів (28):

~,)" "*"*"@{n\.4$>\.+)"0"*}%

56

Я знаю, що це не відповідає специфікаціям, але я подумав, що спробую додати трохи дерев тут, наслідуючи цю класичну арт-різдвяну сценку ASCII Джоан Г. Старк .

Я не намагався відтворити всю картину - це було б трохи забагато - але лише дерево, для якого я представляю цю 138-байтну програму Perl:

$_=join$/,qw'11| 8\2_2/ 9(\o/) 5---2/1\2--- 10>*<',map(11-$_.A.AA x$_,2..11),'9\|H|/';s/\d+/$"x$&/eg,s/A/substr">>>@*O<<<",rand 9,1/eg,say

І, звичайно, ось зразок результату:

           |
        \  _  /
         (\o/)
     ---  / \  ---
          >*<
         >O><@
        <><<>><
       @><><>@<<
      @<O><*@*>>O
     OO@@*O<<<*<OO
    ><<>@><<>@<><><
   >><O<>>><@*>>><<O
  *<>*<><<>@><O*>><*<
 O><><<@<*>><O*@>O><>*
O<><<><@O>>*O*OO<><<>O>
         \|H|/

Спробуйте в Інтернеті!

У коді використовується sayфункція Perl 5.10+ і тому її потрібно запустити за допомогою перемикача командного рядка -M5.010(або -E). (Насправді, просто замінюючиsay в кінці на printце уникне цього, ціною ще двох байтів і втратою нового рядка після останнього рядка виводу.)

Зауважте, що основна маса дерева генерується випадковим чином, тому розміщення прикрас буде змінюватися між тирами. Однак ангел, підставка і верхній ряд дерева закріплені.


Щоб ця популярна відповідь не була видалена в основному за допомогою політики, запровадженої після її опублікування , ось також рішення, сумісне з технічними характеристиками, (45 байт, також Perl 5):

$_=$"x10 ."*";say,s/ 0/00/,s/\*?$/0/ while/ /

Спробуйте в Інтернеті!

Як і програма вище, цю також потрібно запустити на Perl 5.10+ за допомогою -M5.010перемикача, щоб увімкнути цю sayфункцію. Очевидно, що це він дає такий самий нудний результат, як і всі інші сумісні записи, які я не буду турбуватися повторювати тут. (Це також тривіально змінює розмір, змінюючи номер 10на будь-яке інше значення.)


1
Чудово! Не за специфікацією, але я думаю, що спеціальна нагорода суддів призначена саме для вас! :)
Averroes

6
це відбиває прислівники специфіки позаду, +2, якщо я міг.
Крис

3
Вибачте, але згідно правил, відповіді, які не відповідають специфікації, потрібно видалити.
mbomb007


1
Чи можете ви, будь ласка, перемістити правильну відповідь вгору та додати заголовок?
Денніс

13

GolfScript (33 символи)

Версія з фіксованою висотою:

;8:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

Або точно такої ж довжини

;8:^' '*.'*'+n@'0'+^{.n\(;'00'+}*

Дерево виглядає надзвичайно схоже на всі інші:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Версія, яка бере висоту від stdin:

~((:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

Початок попереднього рядка - одна з кращих посмішок, яку я зробив у «корисній» програмі GolfScript.


10

Сценарій оболонки, 44 символи

printf %9c\\n \* 0|sed ':x
p;s/ 0/000/;tx
d'

Друкує це дерево:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

9

Клен, 30/37 символів

Натхненний записом "Математика" містера Віззара , я представляю цю команду Maple 12 з 30 знаків:

<`*`,('cat(0$2*i+1)'$i=0..8)>;

Вихід:

                              [        *        ]
                              [                 ]
                              [        0        ]
                              [                 ]
                              [       000       ]
                              [                 ]
                              [      00000      ]
                              [                 ]
                              [     0000000     ]
                              [                 ]
                              [    000000000    ]
                              [                 ]
                              [   00000000000   ]
                              [                 ]
                              [  0000000000000  ]
                              [                 ]
                              [ 000000000000000 ]
                              [                 ]
                              [00000000000000000]

Я також можу позбутися дужок ціною ще семи символів:

`*`;for i in$0..8 do;cat(0$2*i+1);od;

Вихід опущений - він виглядає так, як вище, лише без дужок. На жаль, я не знаю жодного способу уберегти Maple від вставлення порожніх рядків між вихідними рядками в текстовому режимі. Це краще виглядає в класичному режимі робочого аркуша. Я думаю, я міг би включити скріншот ...

screenshot

(На екрані зображено попередню 44-знакову версію команди, але я лінивий, щоб переробити її. Вихід все одно той же.)

О, і так, розмір повністю регулюється: просто замініть 8 на n -2 для n -row дерева. При першому рішенні перехід вище 25 рядків (або 10 в графічному інтерфейсі) вимагає також налаштування інтерфейсу (rtablesize = , хоч n ).

(Псал. Я думав, що мені вдалося перемогти GolfScript з останньою версією, але на жаль ... )


8

Перл, 42 ч

say$"x9,"*";say$"x(9-$_),"00"x$_,0for 0..8

Вихід:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

Висоту дерева можна змінити між 1 і 11 рядками, замінивши 8в кінці значеннями від -1до 9. Перехід вище 11 рядків вимагає також збільшити на два 9s раніше в коді, який контролює, наскільки далеко від лівої частини екрана дерево відступає.


У цього 11 рядків: P Незначні зміни, я здогадуюсь
Аверро

@Averroes: Так, я спершу припускав, що це повинно бути 10 рядків плюс зірка, але потім я насправді порахував рядки у вихідному зразку та виправив його.
Ільмарі Каронен

8

Гровий, 65

(p={c,r->println' '*(9-r)+(c*(r*2-1))})'*',1;(1..9).each{p'0',it}

Дивно, але дерево виглядає так:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Частина "Опублікувати дерево" виходить на те, щоб принести трохи різдвяного духу на цей сайт: P
Averroes

Також у ваших теж 11 рядків!
Аверрое

Я можу це виправити, скоригувавши параметри висоти!
Арман

8

Рубі, 46 символів

puts" "*8+?*;9.times{|i|puts"%8s0"%(v=?0*i)+v}

Для того, щоб змінити висоту, вам доведеться змінити і 8, і, звичайно, також 9. Вихід програми такий:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Редагувати : Неодмінно я опустив результат у першому поданні.


1
Ви забули опублікувати вихід. :)
Ільмарі Каронен

7

PowerShell, 41

" "*8+"*";0..8|%{" "*(8-$_)+"0"+"0"*$_*2}

Не дивно, що виводить те саме дерево, що і всі інші :-p

Якщо ви параметризуєте ці 8, це отримає розмір вашої консолі, скажімо, 48 символів :

" "*($w=8)+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

Або, як повномасштабний сценарій, який бере аргумент, 53 символи :

param($w)" "*$w+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

Називається, виглядає так:

PS>: Get-Tree.ps1 8
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

7

Пітон 3: 62 символи

print(' '*9+'*',*('\n'+' '*(9-i)+'0'*(i*2+1)for i in range(9)))

Вихід:

        * 
        0 
       000 
      00000 
     0000000 
    000000000 
   00000000000 
  0000000000000 
 000000000000000
00000000000000000

Зауважте, що це по суті долає відповідь @ Ante на 11 символів, оскільки ця відповідь при перетворенні на Python 3 використовує 73 символи.

Змініть кожне 9на інше значення для різної висоти.


3
Я думаю, ви також можете втратити місце раніше for.
badp

@badp Спасибі - змінився з 63 на 62!
Казарк

6

Пітона, 59

print' '*9+'*'
for i in range(9):print' '*(9-i)+'0'*(i*2+1)

Хороша робота - це свідчить про те, що хоч відповідь від @Ante стає довшою в Python 3, моя відповідь Python 3 коротша в Python 2 ( printне функція).
Казарк

6

Пролог: 183 або 186

r(0,_,L,L).
r(N,C,L,[C|T]):-N>0,M is N-1,r(M,C,L,T).
y(S,T,C):-r(T,C,[10],X),r(S,32,X,Y),atom_codes(A,Y),write(A).
x(A,B):-A>0,y(A,B,48),C is A-1,D is B+2,x(C,D).
x(N):-y(N,1,42),x(N,1).

Друкує:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
false.

Може бути надалі для певних перекладачів (наприклад, використовуючи вкладку / 1 на SWI)

Викликати з x (N). Де N - кількість рядків у фактичному дереві (без зірки). Надавши йому фіксовану висоту, це знизить його до 183


6

С

Це версія С Уейда Танді, але трохи змінена:

           ;
          int
         main(
        ){int i
       =-1,j=0,c
      =10;while(j
     ++<c){printf(
    " ");}{;printf(
   "*");}while(++i<c
  ){for(j=-2;++j<c-i;
 )printf(" ");for(j=0;
++j<2*i;){printf("0");}
          ;;;
        printf(
         "\n")
          ;}}


5

Applesoft BASIC, 143 символи

Оскільки це запитання нагадує мені домашнє завдання, яке я мав ще в середній школі (коли вони навчали на Apple // e):

1INPUTH:X=(H*2)-2:C=(X/2):S$="*":O=0:GOSUB2:S$="0":FORO=0TOX-2STEP2:GOSUB2:NEXT:END
2FORS=0TOC-(O/2):?" ";:NEXT:FORI=0TOO:?S$;:NEXT:?"":RETURN

Я використовував JavaScript Applesoft BASIC, знайдений тут: http://www.calormen.com/applesoft/

ВИХІД:

?10
          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

5

Пролог: 127 символів

p:-write('        *'),h(1).
h(L):-(L<10,nl,w(L,-8),h(L+1));!.
w(L,N):-(N<9,N<L,(L>abs(N)->write('0');write(' ')),w(L,N+1));!.

Вихід:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
true 

Використовується Prologтому, що я не зміг бити Groovyрекорд, не дивлячись на його код :(.


5

PostScript (з параметризованою висотою), 114 символів

/h 9 def/b{{( )=print}repeat}def
h -1 0{dup h eq{dup b(*)=}if dup b h sub neg 2 mul 1 add{(0)=print}repeat()=}for

Вихід:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
0000000000000000000

Що, ти хотів це роздрукувати?


4

JavaScript (Rhino: 108, Node: 114, Conskle Dev Webkit: 119, jQuery Plugin: 132)


Носоріг - найкоротший (на 108 символів), оскільки (а) його printфункція має коротке ім'я та (б) дозволить призначити вбудовані функції в коротше ім'я змінної. Так:

h=10,p=print,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Node.js приходить ближче до другого (на 114 символів), оскільки його функція друку console.logмає більш довге ім'я, але ми також дозволимо призначити це для короткої змінної:

h=10,p=console.log,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Однак консоль Webkit Dev Console (і, мабуть, і Firebug теж) вважає p=console.logтрохи надмірна (коли ви намагаєтесь зателефонувати p(), вона скаржиться на вас). Отже, ми повинні подовжити речі на 119 символів:

h=10,m='0',a=Array(h-1),s=a.join(' ');with(console){log(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();log(a.join(' ')+m);}}

(Цікаво, що withнас тільки рятує персонаж).


Нарешті ... плагін jQuery (все ще в твіттері зі 132 символами!):

$.fn.xms=function(h){var m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$(this).css({textAlign:'center'}).html(l.join('\n<br/>'));}

І ви можете викликати його в нижній частині нижньої частини цієї сторінки: $('#footer').xms(3)

Звичайно, це не повинен бути плагіном ... оскільки нам, мабуть, доведеться використовувати консоль JavaScript, щоб додати його на сторінку і викликати її, ми могли просто зробити фрагмент jQuery :

h=10,m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$('#footer').css({textAlign:'center'}).html(l.join('\n<br/>'));

яка важить більш конкурентоспроможних 116 символів - насправді це вибиває іншу реалізацію консолі розробника. Але, знову ж таки, використання jQuery та / або механізму компонування браузера може вважатися обманом. :)


4

С, 67

Я знаю, що це вже давно закінчено, але це моя перша спроба кодового гольфу, і я думаю, що у мене є досить приємне рішення C.

Цікаво, що я придумав це незалежно від дуже подібного рішення @ Патріка.

І так, я не виграю ніяких зв'язків зі своїми твердими цінностями;) Я все одно задоволений.

i;main(){for(;i<10;++i)printf("%*s%0*c\n",i?9-i:8,"",i*2,i?32:42);}
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
Натисніть будь-яку кнопку, щоб продовжити . . .

4

Oracle

select lpad('*', 11) from dual
union all
select rpad(' ', 10 - level) || rpad(' ', level * 2, '0') from dual
connect by level <= 9;


          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

10 rows selected.

4

PHP, 106 символів

На 7 менше попереднього:

<?php echo str_pad(' ',9)."*\n";for($i=0;$i<9;$i++){echo str_pad("",9-$i).str_pad("",($i*2)+1,"0")."\n";}

2
увімкніть короткі теги і збережіть собі 3 символи, або скористайтеся <?=і збережіть ще 5 з "відлуння".
Бромбомб

Я знаю, що спізнююсь на 8 місяців, але codegolf.stackexchange.com/a/6783/4967 :)
Лі

4

LOLCODE, 527 байт

CAN HAS STDIO?
HAI 1.2
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 8
    VISIBLE " "!
IM OUTTA YR LOOP
VISIBLE "*"
I HAS A SPACES
SPACES R 8
I HAS A ZEROS
ZEROS R 1
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 9
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN SPACES
        VISIBLE " "!
    IM OUTTA YR LOOP
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN ZEROS 
        VISIBLE "0"!
    IM OUTTA YR LOOP
    VISIBLE ""
    SPACES R DIFF OF SPACES AN 1
    ZEROS R SUM OF ZEROS AN 2
IM OUTTA YR LOOP
KTHXBYE

Спробуйте в Інтернеті!

Вихід:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

1
Це код-гольф , тому, будь-ласка, додайте до заголовка кількість байтів вашого подання.
lirtosiast

4

Пітон, 70 символів

Не таке коротке, але рекурсивне рішення :-)

def a(s):
 print s
 if s<"0":a(s[1:]+"00")
print" "*8+"*"
a(" "*8+"0")

Змініть 8, щоб встановити висоту.


4

Javascript, 119 символів

Виходи на консоль firebug

i=h=9;a=new Array(h);a[0]=a.join(' ');b=a.join('000');a[0]+='*';while(i)a[i--]=b.substr(i,h+i);console.log(a.join('\n'))


        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

2
Це насправді 120 символів.
Роб Фокс

3

PHP 113

Зрозумів, що я би задзвонив у версії php:

113 символів (налаштуйте, $hщоб змінити висоту, кількість рядків включає зірку):

$h=10;for($n=0;$n<$h;$n++){$i=$n>0?$n:1;$c=$n<1?"*":"0";echo str_repeat(" ",$h-$i).str_repeat($c,($i*2)-1)."\n";}

Я намагався зробити його коротким, не читабельним, і ми вже знали, що php не може змагатися за стислість, тому це нічого не виграє, все-таки весела маленька головоломка тхо.

вихід є специфікацією:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Жорстке кодування litlle трохи більше, 103 символів (ви не можете побачити пробіли в першому відлунні всередині цього коментаря) $ n = 0; echo "* \ n"; for ($ i = 9; $ i> 0; $ i -, друкуйте str_repeat ('', $ i) .str_repeat ('0', $ n + 9- $ i). "\ n", $ n ++);
Луція

ваш твердокодований перший рядок вийде з рівноваги, якщо ви зміните висоту дерева Тхо :-(
Kris

3

С, 77

i;main(c){printf("%*c\n",c,42);while(i<c)printf("%*s%0*d\n",c-i,"",i++*2+1,0);}

Перш ніж уважніше прочитати специфікацію printf, у мене було це миле маленьке число до 138 символів:

#define x sprintf(b,
#define y printf(b,
i;main(c){char b[9]="%%%dc\n",*t="%%%ds%%0%dd\n";x b,c);y 42);while(i<c)x t,c-i,i++*2+1),y "",0);}

3

Ява, 192 (198 з парам.)

class V{public static void main(String[]a){int c=10,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

Друкує запитане дерево:

        *           
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Для змінної висоти, трохи довше:

class W{public static void main(String[]a){int c=a.length,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

Довжина списку аргументів командного рядка визначає висоту (наприклад, java W a a a a a , дасть висоту 5).

(Це в основному версія Java для рішення C Wade Tandy.)


Я знаю, що це було розміщено деякий час назад :), але ось я бачу дві речі: 1. Ви можете використовувати інтерфейс замість класу в java 8 2. щоб зберегти два символи, while (++i < c) {-> for (s += "*";++i < c;s = "") {, і видалити s += "*";іs = "";
Reinis Мазейки

3

Вім, 18 байт

17i0<esc>qqYPxr q8@qa*

Спробуйте його в Інтернеті у зворотно сумісному V-перекладачі!

Хоча це дуже схожий підхід, як і моя V відповідь, цей - ні не конкурують , так як Vim божевільний старий. :)

Пояснення:

17i0<esc>               " Insert 17 '0's
         qq     q       " Start recording into register 'q'
           YP           " Duplicate this line upwards
             x          " Delete one character
              r         " Replace this character with a space
                 8@q    " Playback macro 'q' 8 times
                    a*  " Append an asterisk

3

Скала, 74 байти

val h=10;println(" "*h+"*");for(i<-0 to h-2)println(" "*(h-i)+"0"*(i*2+1))

h - висота дерева

Вихідні дані

        *          
        0          
       000         
      00000        
     0000000       
    000000000      
   00000000000     
  0000000000000    
 000000000000000   
00000000000000000  

2

C, 80

i=9,k=10,j;main(F){while(i)putchar(++j<i?32:j<k?48-F*6:(i-=!F,k+=!F,F=j=0,10));}

Ініціалізуйте k до висоти дерева, i до k-1. F - прапор першого рядка. З огляду на відсутність аргументів, F має бути 1 при введенні.

Трохи довша (81) версія, де f - прапор першого рядка:

i=9,k=10,j,f;main(){while(i)putchar(++j<i?32:j<k?42+f*6:(i-=f,k+=f,f=1,j=0,10));}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.