9 отворів Code Golf - Kickoff


12

Виклик вже 9 лунок (і ще один тут ), але це було так минулого року. А крім того, я вже близько 2 місяців (хоча це здається назавжди). І значно відрізняється.

Рада лідерів: (зауважте, що зважування для отворів ще не встановлено)

+---------------+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|Competitor     | Language   | Hole 1 | Hole 2 | Hole 3 | Hole 4 | Hole 5 | Hole 6 | Hole 7 | Hole 8 | Hole 9 | Total  |
+----------------------------------------------------------------------------------------------------------------------+
|Dennis         |CJam        |        | 31     |        |        |        |        |        |        |        | 31     |
+----------------------------------------------------------------------------------------------------------------------+
|Optimizer      |CJam        |        | 35     |        |        |        |        |        |        |        | 35     |
+----------------------------------------------------------------------------------------------------------------------+
|Martin Büttner |Mathematica |        | 222    |        |        |        |        |        |        |        | 222    |
+----------------------------------------------------------------------------------------------------------------------+
|Cameron        |Python      | 878    |        |        |        |        |        |        |        |        | 878    |
+----------------------------------------------------------------------------------------------------------------------+
|bubalou        |Processing 2| 717    |        |        |        |        |        |        |        |        | 717    |
+----------------------------------------------------------------------------------------------------------------------+
|Doorknob       |Python 2    |        |        |0.079711|        |        |        |        |        |        |0.079711|
+----------------------------------------------------------------------------------------------------------------------+
|Vulcan         |Java        |        |        |0.6949  |        |        |        |        |        |        |0.6949  |
+----------------------------------------------------------------------------------------------------------------------+
|Eli            |C++         |        |        |1.42042 |        |        |        |        |        |        |1.42042 |
+---------------+------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+

Інші отвори:

Останнім часом тут повільно, тож я тут, щоб почати наступне поле для гольфу на 9 лунок, включаючи трохи все, що я бачив тут у своєму (хоча і обмеженому) досвіді. Це потягне за собою:

  • Ст
  • Графічний вихід
  • Гра життя Конвея
  • Король пагорба
  • Колмогорова складність
  • Лайки
  • Обробка зображення
  • Математика
  • Класичний код гольфу.

Я дуже з нетерпінням чекаю, що ти можеш зробити!

Правила змагань

  • Ви виберете 1 мову для всіх лунок (у яких ви берете участь ... див. Пункт 4 для отримання додаткової інформації).
  • Для всіх дірок - стандартні лазівки (все ще) не смішні.
  • Наступний виклик з’явиться, коли я побачу, що є достатня кількість матеріалів, наданих достатньо часу. Наприклад, король пагорба займе більше часу.
  • Ви не повинні брати участь у всіх дірах. Якщо ви виявите, що лунка є особливо складною, не встигнете це зробити і т. Д., Ви отримаєте в 2 рази більше балів, як найменший бал. Будь ласка, не скористайтеся цим правилом, залишивши 1 відповідь гольфскрипту з 12 символами та взявши 24 як бал.

Оцінка балів

  • Ваш результат базується на кульмінації балів з усіх лунок
  • Найнижчі виграші (відповідно до реального гольфу)
  • Таблиця лідерів буде розміщена вгорі цієї сторінки

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

Однак будь ласка, будьте терплячі, коли я не зможу.

І, без подальшої прихильності, перший виклик!

Плазмовий глобус

Плазмовий куля є улюбленою іграшкою кожного:

введіть тут опис зображення

Ваша робота - намалювати одну.

Ви повинні намалювати основу:

введіть тут опис зображення

земна куля:

введіть тут опис зображення

Тесла річ (?)

введіть тут опис зображення

І, звичайно, круті плазмові пагони:

введіть тут опис зображення

Однак, коли ви покладете руку біля земної кулі (або провідного об'єкта, як мені каже Вікіпедія), він притягує плазму .

Ваш глобус повинен це відображати.

Якщо говорити кількісно, ​​ваш глобус має максимум 16 пагонів (див. Малюнок вище). "Об'єкт" на поверхні земної кулі (заданий кутом у радіанах) буде містити "струмопровідну силу", тобто кількість променів, які вона притягує. Таким чином, об'єкт потужністю 5 залучатиме 5 променів (одна лінія товщиною 5), залишаючи 11 для рівномірного розподілу серед решти земної кулі :

введіть тут опис зображення

Зауважимо, що
1. чорне коло посередині залишається над плазмою
2. що в цьому прикладі кут був би pi / 2.

У вас може бути більше одного провідного об’єкта, і в такому випадку не потрібно, щоб пагони були однаково розташовані один від одного. Однак вони відносно відстані. Наприклад, це нормально для двох об'єктів, 1 під кутом pi / 4 потужності 5 і іншого під кутом 5pi / 3 потужністю 3:

введіть тут опис зображення

Ви повинні мати можливість бачити кожну з кінцевих точок пагонів (плазми).

Однак, враховуючи об'єкт (або суму об'єктів), потужність яких перевищує 16, земна куля "зламається":

введіть тут опис зображення

Примітки

  • Діаметр земної кулі в 1,5 рази більший, ніж довжина основи, яка є квадратом
  • Коли земна куля зламається, глобус знаходиться з правого боку. Вона дотична до правого боку основи, а також до землі. Не повинно бути плазми, коли плазменний шар землею порушений (чому? Особливості безпеки, звичайно! Ні слова про те, як він зламався, в першу чергу.)
  • Колір всього, крім пагонів, повинен бути чорним та товщиною 1 пікселя. Колір плазми має відтінок 245 - 280, а насиченість / значення 100. Використовуйте це під "HSV", якщо ви не маєте поняття, про що я говорю.

Вхідні дані

Введення можна через STDIN / аргументи командного рядка / будь-що або через аргументи функції.

Повинно бути 2 входи - довжина основи плазмової кулі (включити вісь, якщо використовується векторна графіка) та масив таких об’єктів:

[[angle,power],[angle,power],[angle,power]]

Отже, для жодних об'єктів (див. Перше зображення з 16 рядків) введенням буде

100,[]

Для наступного (один об'єкт, потужність 5) було б:

100,[[1.570796,5]]

Для останнього прикладу:

100,[[0.785398,5],[5.23598,3]]

Це код-гольф, тому найкоротший код у байтах виграє.


@ MartinBüttner Якщо зображення не зменшується, коли довжина основи зменшується, додайте вісь
Stretch Maniac

У вашому другому прикладі. Що робити, якщо другий об’єкт опинився -3/8π? У такому випадку воно буде перетинатися саме з одним із інших балок. Чи треба в такому випадку обертати всі балки? Якщо так, я думаю, вам потрібно вказати, наскільки віддалені окремі промені повинні бути від об'єктів, викликаних об'єктом.
Мартін Ендер

1
е .... чому стовпець "отвір 2" у дошці вже заповнений, навіть якщо відповіді немає?
xem

2
Маленька допомога для кращого візуалізації цього: inear.se/plasmaball
CSᵠ

1
@xem гм, є відповіді на дірку 2, так чому б не опублікувати їх? Це не обов'язково повинно йти по порядку ...
Stretch Maniac

Відповіді:


4

Обробка 2 - 717 символів

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

int j,m,b,k,d,l;float w,c,h,x,y,z;float v[],p[],g[];void setup(){j=m=d=0;c=z=0;String i[]= loadStrings("f.txt");i[0]=i[0].replace("[","").replace("]","");String o[]=split(i[0],',');v=new float[o.length];p=new float[o.length-1];for(String s:o){if(!s.equals("")){v[j]=Float.parseFloat(s);}j++;}w=v[0];size((int)w*3,(int)w*3);h=w*.75;l=v.length;noLoop();}void draw(){translate(w/2,height);scale(1,-1);rect(0,0,w,w);if(l>2){while(m<j-1){m+=2;c+=v[m];}}if(c>16){ellipse(w+h,h,2*h,2*h);rect(w/2,w,1,h);}else{ellipse(w/2,w+h,2*h,2*h);rect(w/2,w,1,h);b=16;m=1;stroke(#1500ff);if(l>2){while(m<j){p[m-1]=cos(v[m])*h;p[m]=sin(v[m])*h;strokeWeight(v[m+1]);line(w/2,w+h,p[m-1]+w/2,p[m]+w+h);b-=v[m+1];m+=2;}}strokeWeight(1);c=(PI*2)/b;k=b;g=new float[b+b];while(b>0){g[d]=cos(z+c*b)*h;g[d+1]=sin(z+c*b)*h;m=0;if(l>2){while(m<j-1){if(abs(g[d]-p[m])<.1 && abs(g[d+1]-p[m+1])<.1){b=k+1;z=z+.1;d=-2;break;}m+=2;}}b--;d+=2;}d--;while(d>0){line(w/2,w+h,g[d]+w/2,g[d-1]+w+h);d-=2;}}stroke(#000000);fill(#000000);ellipse(w/2,w+h,w/9,w/9);}

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

читає у файлі (f.txt), який знаходиться в папці даних ескізу, щоб отримати його введення. Я використовував ідею Камерона про зміщення вільних балок, поки вони не перетинаються.

int j,m,b,k,d,l;
float w,c,h,x,y,z;
float v[],p[],g[];
void setup(){
j=m=d=0;
c=z=0;
String i[]= loadStrings("f.txt");
i[0]=i[0].replace("[","").replace("]","");
String o[]=split(i[0],',');
v=new float[o.length];
p=new float[o.length-1];
for(String s:o){if(!s.equals("")){v[j]=Float.parseFloat(s);}j++;}
w=v[0];
size((int)w*3,(int)w*3);
h=w*.75;
l=v.length;
noLoop();
}

void draw()
{
  translate(w/2,height);
  scale(1,-1);
  rect(0,0,w,w);
  if(l>2) 
  {
    while(m<j-1)
    {
      m+=2;
      c+=v[m];
    }
  }
  if(c>16)
  {
    ellipse(w+h,h,2*h,2*h);
    rect(w/2,w,1,h);
  }
  else
  {
    ellipse(w/2,w+h,2*h,2*h);
    rect(w/2,w,1,h);
    b=16;m=1;
    stroke(#1500ff);
    if(l>2)
    { 
      while(m<j)
      {
        p[m-1] = cos(v[m]) * h;
        p[m] = sin(v[m]) * h;
        strokeWeight(v[m+1]);
        line(w/2,w+h,p[m-1]+w/2,p[m]+w+h);
        b-=v[m+1];
        m+=2;
      }
    }
    strokeWeight(1);
    c=(PI*2)/b;
    k=b;
    g=new float[b+b];
    while(b>0)
    {
      g[d] = cos(z+c*b) * h;
      g[d+1] = sin(z+c*b) * h;
      m=0;
      if(l>2)
      {
        while(m<j-1)
        {
          if(abs(g[d]-p[m])<.1 && abs(g[d+1]-p[m+1])<.1)
          {
            b=k+1;
            z=z+.1;
            d=-2;
            break;
          }
          m+=2;
        }
      }
      b--;
      d+=2;
    }
    d--;
    while(d>0)
    {
      line(w/2,w+h,g[d]+w/2,g[d-1]+w+h);
      d-=2;
    }
  }
    stroke(#000000);
    fill(#000000);
    ellipse(w/2,w+h,w/9,w/9);
}

Приклади:

100, [[0.785398,3], [5.23598,5]]

куля плазми 1

100, []

куля плазми 2

100, [[1.72398,12], [5.23598,5]]

куля плазми 3

отримати обробку тут


3

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

Це далеко не добре для гольфу, але я хотів побачити відповідь на цю дірку.

import matplotlib.pyplot as P
from math import *
L=len
M=min
Y=P.plot
K=P.Circle
Z=P.gcf().gca().add_artist
f=sin
g=cos
k={'color':(0,0,0)}
j={'color':(.16,0,1)}
def Q(S,C):
    P.axis([-S,S*2.5,0,S*3.5],**k)
    Y([0,S,S,0,0],[0,0,S,S,0],**k)
    Y([S/2,S/2],[S,7*S/4],**k)
    Z(K([S/2,7*S/4],S/20,**k))

    k['fill']=False

    A,B=zip(*C)

    N=16-sum(B)
    if N<0:
        Z(K([7*S/4,3*S/4],3*S/4,**k))

    else:
        Z(K([S/2,7*S/4],3*S/4,**k))
        if L(C)==0:
            D(16,0,S)
        elif L(C)==1:
            D(N,A[0],S)
            Y([S/2,S/2+3*S*g(A[0])/4],[7*S/4,7*S/4+3*S*f(A[0])/4],linewidth=B[0],**j)
        else:
            for c in C:
                Y([S/2,S/2+3*S*g(c[0])/4],[7*S/4,7*S/4+3*S*f(c[0])/4],linewidth=c[1],**j)
            D(N,J(N,A),S)
    P.show()


def J(N,A):
    T=d=0
    t=2*pi/N
    while d<0.1:
        T+=0.1
        d=M(M(a-T-floor((a-T)/t)*t for a in A),\
            M(T+ceil((a-T)/t)*t-a for a in A))
    return T


def D(N,I,S):
    a=I
    for i in range(N):
        Y([S/2,S/2+3*S*g(a)/4],[7*S/4,7*S/4+3*S*f(a)/4],**j)
        a+=2*pi/N

І деякі результати вибірки

Q(100,[[pi/4,6],[-4.2*pi/8,1]])

введіть тут опис зображення

Q(100,[[0.785398,10],[5.23598,7]])

введіть тут опис зображення

Q(100,[[pi/4,3],[pi/2,3],[3*pi/2,2],[5*pi/4,2]])

введіть тут опис зображення


Як це забезпечує те, що індуковані об'єктом та вільні промені ніколи не перетинаються?
Мартін Ендер

Я обертаю променеві промені на невелику кількість, поки не знайду орієнтацію, яка забезпечує проміння променів не менше ніж на 0,1 радіана, один від одного
Камерон

Ага, правда, я очікував щось подібне. Дякуємо за уточнення!
Мартін Ендер

Np, я намагався вирішити, як максимально збільшити мінімальну відстань між будь-яким об'єктом, що викликається об'єктом, і будь-яким вільним променем, але це, здається, є складним питанням
Камерон

1
A,B=zip(*C)слід зберегти кілька байтів
gnibbler

1

Пітон 2.7, 378 375

from turtle import *;import sys
(s,P),A,B=eval(sys.argv[1]),90,180
n,S=sum([b for(a,b) in P]),.75*s;l=16-n
for i in 'abcd':fd(s);lt(A)
pu()
if l<0:goto(s+S,0)
else:goto(s/2,s)
pd();circle(S);pu();goto(s/2,s);lt(A);pd();fd(S)
def C():fd(S);fd(-S)
if n<16:
 color('blue')
 for i in range(l):rt(360/l);C()
 for a,p in P:pensize(p);rt(a*57.3);C()
color('black')
shape('circle')

Він зчитує його параметри з аргументу командного рядка.

Зразкові зображення:

(параметри = 100,[[0.785398,5],[5.23598,3]])

тесла

(параметри = 100,[])

tesla2

(параметри = 100,[[1.72398,12],[5.23598,5]])

tesla3


Я не зміг перевірити це, але тут трохи гольфу
0WJYxW9FMN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.