Показать логотип хакера

56

Возможно, вы слышали о «логотипе хакера», также называемом «эмблема хакера». Это выглядит так:

логотип хакера

Это образец математической симуляции под названием Игра Жизни. Планер - это самый простой образец Жизни, который движется, и самый узнаваемый из всех моделей Жизни.

Соревнование

Задача довольно проста: показать логотип хакера. Это определяется как:

  • Сетка 3х3 с рамкой, белым фоном и серыми линиями сетки.
  • Пять черных точек, расположенных на планере GoL.
  • Ничего больше.

Правила

  • Черные точки должны заполнять 40% - 80% их отдельных ячеек сетки.
  • Вы отобразите эмблему с графическим выводом, но без ASCII .
  • Вывод должен быть не менее 30х30 пикселей .
  • Вывод должен иметь только цвета серый, черный и белый .
  • Каждый блок сетки в сетке будет иметь одинаковый размер. Сетка будет обычным квадратом 3х3 .
  • Вы не можете извлекать логотип из Интернета или вашей файловой системы.
  • Ваша программа будет отображать логотип на пустом экране / окне. Если он заканчивается, он должен сделать это нормально.
  • Обратите внимание, что «точки» не обязательно означает «круги». «Точка» - это одиночная геометрическая фигура, центрированная по центру ячейки сетки с одной поверхностью. Например, если круг или квадрат будут квалифицироваться как точка, два треугольника или шахматная доска не будут.

Победитель

Поскольку это , выигрывает самый короткий ответ на каждом языке!

Пожалуйста, включите скриншот вывода вашей программы в свой ответ.

MD XF
источник
21
Я понятия не имел, что это назвали Логотипом Хакера. Я использовал его в качестве своего аватара на некоторых сайтах, думаю, это делает меня хакером.
Марк Томас
15
@MarkThomas что или GoL ботаник xD
Стивен
3
@DavidConrad «очистить экран» означает, что если вы используете IDE / интерфейс со встроенной графикой, вы не можете отобразить его с существующим текстом на экране. Да, вы можете отобразить его в окне.
MD XF
3
Допускается ли использование нескольких оттенков серого (и связанных с ними цветов) из-за сглаживания?
Ян Миллер
3
Нужно ли отображать вывод или мы можем его вернуть или сохранить в файл?
TheLethalCoder

Ответы:

27

Mathematica, 62 байта

Grid[{{,a=██,},{,,a},{a,a,a}},Frame->All,FrameStyle->Gray]

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

Mathematica, 71 байт

Grid[{{,l=Graphics@Disk[],},{,,l},{l,l,l}},Frame->All,FrameStyle->Gray]


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

J42161217
источник
2
Я думаю, что вы можете сохранить байты, используя чистую функцию Graphics@Disk[]в качестве аргумента.
CalculatorFeline
Если вы имеете в виду эту таблицу [{{, #,}, {,, #}, {#, #, #}}, Frame-> All, FrameStyle-> Grey] & @ Graphics @ Disk [], то это 72 байта
J42161217
3
Вариант 69 байт на этом: Rasterize@Grid[{{,●,},{,,●},{●,●,●}},Frame->All,FrameStyle->Gray]. ● является двухбайтовым символом Unicode. Поскольку это не обязательно должен быть круг, возможно, какой-нибудь символ ASCII мог бы работать, чтобы удовлетворить требование 40% -80%.
Ян Миллер
на самом деле я сделал это до 62 байтов, отвечающих всем требованиям
J42161217
Я думаю, что вам нужно Rasterizeили что-то подобное, чтобы соответствовать требованию, так graphical output but no ASCII artкак символы по-прежнему выбираются в сетке как символы Юникода.
Ян Миллер
33

CSS + HTML, 56 + 84 = 140 байт, 52 + 84 = 136 байт.

Сохранено 4 байта путем включения предложений из комментариев.

td{border:1px solid#888;line-height:.4;font-size:3em
<table cellspacing=0><tr><td><td><td><tr><td><td><td><tr><td><td><td>

При этом используется символ UTF-8, длина которого составляет 2 байта, а также преимущество любезности синтаксиса HTML.

Осьминог
источник
3
Неплохо; это довольно умно, используя !
MD XF
3
Очень круто. Я думаю, что вы можете сохранить один байт line-height:.4;, а другой, пропустив закрытие,}
ETHproductions
5
Разве использование • не считается искусством ASCII, что противоречит правилам вызова?
Hankrecords
2
@StephenS Звучит как очень бесполезное различие, плюс я не вижу смысла запрещать искусство ASCII, но разрешать искусство Unicode. Что касается ОП, говорящего, что это было умно, мой комментарий был фактически направлен на ОП, я забыл вставить @.
Hankrecords
4
Единственный ответ Code Golf, который я когда-либо понимал, по крайней мере, я так считаю.
Уве Кейм
25

GLSL (фрагментный шейдер), 278 235 256 байт

precision highp float;void main(){vec2 a=gl_FragCoord.xy/20.-.2;ivec2 b=ivec2(a);a-=vec2(b)+.5;if(b.x>2||b.y>2)discard;gl_FragColor=a.x<-.5||a.y<-.5||a.x>.3||a.y>.3?vec4(.5,.5,.5,1.):length(a+.1)<.4&&(b.x+b.y-3)*b.y==0?vec4(0.,0.,0.,1.):vec4(1.,1.,1.,1.);}

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

Посмотрите это в действии: http://glslsandbox.com/e#40717.2

Frxstrem
источник
1
Хм ... граница проходит всю графику? Кроме того, вы уверены, что круги составляют только 80% от сетки?
MD XF
12
Круг, который касается всех четырех сторон окружающего его квадрата, заполняет пропорцию π / 4 квадрата, или около 78,5%.
Грег Мартин
Я уменьшил размер вашего кода до 222 байт:precision highp float;void main(){vec2 a=gl_FragCoord.xy/20.-.2;ivec2 b=ivec2(a);a-=vec2(b)+.5;gl_FragColor=vec4(vec3(a.x<-.5||a.y<-.5||a.x>.3||a.y>.3?.5:length(a+.1)<.4&&(b.x+b.y-3)*b.y==0?.0:1.)*float(b.x<3&&b.y<3),1.);}
Габор Фекете
21

Python 2 ,  169  140 байт

from turtle import*
up()
shape("square")
color("gray",[1]*3)
i=9
while i:
 i-=1;goto(20-i/3*20,20-i%3*20);stamp()
 if 302&2**i:dot(15,0,0,0)

Фактический размер, 61 на 61, нанесенный на гораздо больший холст 300 на 400:

фактический размер

Отображение сетки пикселей:

версия сетки пикселей

Точки используют 177 пикселей в диапазоне 40% -80%, независимо от того, учитывается ли белая заливка 19 на 19 (144,4–288,8) или 21 на 21, включая обе границы (176,4–352,8).

Примечание: программа завершает работу и закрывает окно холста, как только рисунок завершен, чтобы ручное закрытие окна добавляло строку done().

turtleпакет Python, разработанный для вводного графического программирования Перо начинается x,y=0,0с середины холста размером 300 на 400 пикселей (по умолчанию), upподнимает перо, gotoперемещает перо, shapeзадает форму пера с именованной формой ( "square"это предопределенная форма с шириной пикселя по умолчанию 21 ), colorзадает цвет, где два параметра устанавливают штрих (по умолчанию ширина 1) и заливку; Байт сохраняется с помощью параметра (r,g,b)кортежа, чтобы заменить его "white"с [1,1,1]использованием умножения списка [1]*3. Наконец dotрисует точку с заданной шириной в пикселях и цвете. Значение ширины точки по умолчанию слишком мало, чтобы его можно было квалифицировать, 9поэтому я сделал его эстетичным и квалифицированным 15. Цвет точки может быть"black"но распакованный (r,g,b)кортеж 0,0,0короче на два байта.

Ручка должна удаляться от любой точки на конце, так как в противном случае серая / белая ручка скрывает точку.

Сетки пересекаются с использованием DIV ( /) и Mod ( %) из iначиная с 8( iинициализируются , 9но декрементируются в начале whileцикла) и работает вниз 0, компенсируя результаты 2,1,0с -1,0,1использованием (1-...)и масштабирования каждого до размера сетки , используя коэффициент 20 (обратите внимание, что 20-i/3*20на самом деле байтов меньше, чем 20*(1-i/3), то же самое для %). Это производит порядок [нижний левый, центральный левый, верхний левый, нижний средний, центральный средний, верхний средний, нижний правый, правый центральный, верхний правый] и требует " hasDot" оценки [1,0,0,1,0,1,1,1,0], который 302в двоичной системе это может получить доступ путем проверки iй мощности двух компонент302с использованием побитового-и, 302&2**i.

Джонатан Аллан
источник
Очень хороший подход и намного короче, чем я думал, можно было бы использовать turtle.
Мачта
14

Applesoft BASIC , 479 476 516 515 483 482 байта

-32 с использованием нечитаемых имен переменных: P
-1, потому что Apple решила быть волшебной и позволила мне использовать неявное / несуществующее GOTO

Вот моя собственная (очень подходящая) программа для примера вывода, в котором не используются кружки:

1GR:POKE49234,0:COLOR=15:FORI=0TO39:VLIN0,47ATI:NEXT:COLOR=5:S=21:W=S:H=27:X=INT((40-W)/2):Y=INT((48-H)/2):D=INT(W/3):DX=D:C=Y+H:G=X+W:FORI=0TO3:VLINY,C ATX+I*D:NEXT:D=INT(H/3):FORI=0TO3:HLINX,G ATY+I*D:NEXT:YH=INT(D/2):Z=Y+H-YH:XH=INT(DX/2):COLOR=0:FORI=0TO2:B=Z:A=X+XH+I*DX:GOSUB5:NEXT:B=B-D:GOSUB5:B=B-D:A=A-DX:GOSUB5:K=PEEK(-16384):IFK<128THEN2:K=PEEK(-16368):TEXT:HOME:END 
5VLINB+2,B-3ATA:VLINB+2,B-3ATA-1:VLINB+2,B-3ATA+1:VLINB+2,B-3ATA+2:VLINB,B-1ATA-1:VLINB,B-1ATA+2:RETURN

Выход:

MD XF
источник
1
Я не уверен, что это действительно так, поскольку строку 1 длиной более 239 символов невозможно ввести обычными методами, по крайней мере, на // e.
insert_name_here
1
@insert_name_here Вы должны сохранить его в файл на диске.
MD XF
14

Машинный код IA-32, 81 80 байт

HexDump:

60 8b f9 b8 50 35 20 20 ab b8 32 35 36 20 ab ab
ab fe 4f fe 33 c9 66 49 51 8a c1 d4 55 50 8a c5
d4 55 5b b2 80 84 c0 74 1f 84 db 74 1b b2 ff 2c
10 3c 35 77 13 93 2c 10 3c 35 77 0c 8d 0c 58 8a
cd b0 e4 d2 e0 79 01 42 92 aa 59 e2 cb aa 61 c3

Это fastcallвызываемая функция, doitкоторая возвращает изображение в формате PGM в предоставленном буфере. Использование:

char buf[256 * 256 + 256];
doit(buf);

FILE* f = fopen("k.pgm", "wb");
fwrite(buf, 1, sizeof buf, f);
fclose(f);

Выход:

логотип хакера

Я использовал разрешение 256x256, потому что это круто, он позволяет ecxавтоматически разбивать индекс пикселя на координаты yв chи xв cl. Кроме того, формат файла PGM требует число 255 в заголовке изображения.

Внутренние квадраты 54х54 (41% клеток по площади).

Исходный код (может быть скомпилирован Visual Studio):

    pushad;                 // save all registers
    mov edi, ecx;           // edi is now the pointer to output
    mov eax, '  5P';        // PGM file header
    stosd;                  // store it
    mov eax, ' 652';        // the number 256 and a space
    stosd;                  // store the width
    stosd;                  // store the height
    stosd;                  // store maximum brightness
    dec byte ptr [edi-2];   // fix maximum brightness to 255

    xor ecx, ecx;           // initialize the counter of pixels
    dec cx;                 // to 65535
myloop:
    push ecx;

    mov al, cl;             // al = cl = x coordinate in the image
    _emit 0xd4;             // divide by 85
    _emit 85;               // ah = x cell number, al = x coordinate in cell
    push eax;
    mov al, ch;             // al = ch = y coordinate in the image
    _emit 0xd4;             // divide by 85
    _emit 85;               // ah = y cell number, al = y coordinate in cell
    pop ebx;                // bh = x cell number, bl = x coordinate in cell

    mov dl, 0x80;           // gray pixel value
    test al, al             // is cell boundary (y)?
    je output1;
    test bl, bl;            // is cell boundary (x)?
    je output1;

    mov dl, 255;            // white pixel value
    sub al, 16;
    cmp al, 53;
    ja output1;             // if outside the inner square, output white
    xchg eax, ebx;          // exchange the registers to shorten following code
    sub al, 16;
    cmp al, 53;
    ja output1;             // if outside the inner square, output white

    lea ecx, [ebx * 2 + eax]; // cell index = y * 2 + x
    mov cl, ch;
    mov al, 0xe4;           // load the bitmap for the glider pattern
    shl al, cl;             // shift the needed but into SF
    jns output1;            // the bit was 0? - output white
    inc edx;                // the bit was 1? - change to black

output1:
    xchg eax, edx;
    stosb;                  // output the byte

    pop ecx;
    loop myloop;
    stosb;                  // output an additional gray pixel
    popad;
    ret;

Образец клетки

0 1 0
0 0 1
1 1 1

может быть представлен "оптимизированной" битовой картой из 7 битов.

Биты индексируются выражением y * 2 + x, где (x,y)находится ячейка. Это выражение дает одинаковый индекс для 2 пар клеток. Это счастливое совпадение, что значения битов там одинаковы.

anatolyg
источник
1
Это круто, но я делаю 42*42/85/85только 24,4%.
Джонатан Аллан
@JonathanAllan: Белые части ячейки имеют размер только 84х84, но да, ящик 42х42 - это только четверть ящика 84х84.
Ник Маттео
Я попросил разъяснений (если он пойдет в область, я надеюсь, что это не слишком сложно обновить).
Джонатан Аллан
Решение вынесено - это область ...
Джонатан Аллан
Я увеличил черные точки с 42 до 54. Это минимум, он составляет 40% по площади, и они уже стали безобразными ...
anatolyg
14

HTML & CSS, 155 байт

Оказывается, HTML действительно прощает ошибки синтаксиса.

1 байт сохранен благодаря @Octopus · 1 байт сохранен благодаря @Downgoat · 2 байт сохранен благодаря @StephenS

2 байта сохранены благодаря @Ryan · 3 байта сохранены благодаря @styfle · 4 байта сохранены благодаря @Ferrybig

13 байтов сохранено благодаря @SteveBennett

p{height:33px;width:33px;border-radius:50%;background:#000;margin:0
<table cellspacing=0 border=1><td><td><p><td><tr><td><td><td><p><tr><td><p><td><p><td><p

Уриэль
источник
2
Укажите, в каком браузере (и какой версии) он работает - он не работает в Opera 45.
Paŭlo Ebermann
2
Фрагмент не работает для меня, используя Chrome 58.0.3029.110 (64-разрядная версия) в Windows. В какой версии Chrome он работает?
Джонатан Аллан
Это не отображает круги с Safari 10.1 на macOS Sierra (10.12.4).
Р. Кап
точки также не отображаются с Chromium 55.0.2883.87 (64-разрядная версия).
Дилан Миус
Также не видно точек на Chrome для Android (58.0.3029.83)
Spikatrix
11

R ( 130 119 113 байтов)

plot(c(2,4,6,4,6),c(2,2,2,6,4),an=F,ax=F,xli=(l=c(1,7)),yli=l,xaxs="i",yaxs="i",pch=16,cex=19);grid(3,lt=1);box()

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

mschilli
источник
Вы можете использовать axes=Fдля замены xaxt="n",yaxt="n". Если вы удваиваете все значения координат, вы сохраняете 4 чистых байта (но не можете использовать 1:3,2:3хитрость).
user2390246
@ user2390246: спасибо за предложения. Я не нашел много времени для игры в гольф. Я уверен, что есть больше возможных улучшений. Пришлось добавить ;box()как axes=Fи снимает рамку. Кроме того , как axesэто plotпараметр , а не передается parчерез , ...как xaxt/ yaxt, она даже не нужно быть прописаны полностью.
17
1
Вы можете сбрить 7 байтов путем (1) замены c(1,7)переменной ( l=c(1,7)); (2) замена annна an; (3) замена [xy]liна [xy]li; и (4) удаление второго, избыточный аргумент для grid: grid(3,lt=1). На самом деле, я взял на себя смелость редактировать это в (на рассмотрении).
Конрад Рудольф
1
@KonradRudolph Кажется уместным: codegolf.meta.stackexchange.com/questions/1615/…
Мэтт
@Matt Хм. Кажется, что это имеет смысл, если применяется принципиально иная оптимизация, а не просто реализация простых улучшений. Справедливо.
Конрад Рудольф
9

Python 2,7, 214 311 309 байт

from matplotlib.pyplot import*
f,x=subplots()
j=(0,0),(1,0),(2,0),(1,2),(2,1)
for i in j:x.add_artist(Circle((i),.4,color='k'))     
x.tick_params(labelbottom='off',labelleft='off')
for o in x.spines.values():o.set_edgecolor('gray')
for s in 'xy':exec"x.set_"+s+"ticks((.5,1.5,2.5));"+s+"lim(-.5,2.5);"
grid()

Это моя первая попытка в код-гольфе, поэтому я уверен, что это можно улучшить. Я хотел бы не устанавливать пределы, но похоже, что matplotlib не может определить, что я нарисовал круги там, где сделал. Без установки xlim () и ylim () отображаются только два нижних круга.

Выход:

редактировать

Редактировать: Исправлен цвет границ и убраны номера тиков. Я должен сказать, что matplotlib очень плотно сформулирован и не слишком дружелюбен к изменению цвета осей.

Срезал 3 байта благодаря @DJMcMayhem

Редактировать: снял два байта, установив мои тики в качестве кортежа внутри функций set_ticks.

Джо Хабел
источник
Извините, цифры на графике не допускаются. Кроме того, граница серая?
MD XF
3
Добро пожаловать на сайт! Это хороший первый ответ. :)
DJMcMayhem
1
Я вижу некоторые мелкие помехи: 1) Вы можете объединить строки 5 и 6, чтобы удалить один пробел и символ новой строки (-2 байта) 2), если порядок установки xy_ticks и xy_lim не имеет значения, вы можете сделать что-то подобное for s in'xy':exec"x.set_"+s+"ticks(a);"+s+"lim(-.5,2.5);". (Я не проверял это, хотя, так что я не уверен)
DJMcMayhem
8

Bash + ImageMagick, 233 226 символов

convert xc: +antialias -resize 31 -draw "stroke gray fill none ${r=rectangle} 0,0 10,30$r 20,0 30,30$r 0,0 30,10$r 0,20 30,30stroke #000 fill #000 ${c=circle} 15,5 15,8$c 25,15 25,18$c 5,25 5,28$c 15,25 15,28$c 25,25 25,28" x:

Образец вывода:

Планер нарисован с помощью Bash и ImageMagick

Bash + ImageMagick, 215 символов

convert xc: -resize 31 -draw "stroke gray fill none ${r=rectangle} 0,0 10,30$r 20,0 30,30$r 0,0 30,10$r 0,20 30,30stroke #000 fill #000 ${c=circle} 15,5 15,8$c 25,15 25,18$c 5,25 5,28$c 15,25 15,28$c 25,25 25,28" x:

Владелец вопроса еще не ответил на вопрос сглаживания, и некоторые другие решения также имеют дополнительные оттенки серого, добавленные сглаживанием, поэтому на данный момент этот более короткий выглядит также приемлемым.

Образец вывода:

Планер нарисован с помощью Bash и ImageMagick - со сглаживанием

manatwork
источник
8

Ruby, 144 166 164 148 144 байта

require'ruby2d'
set background:'grey'
c=482;g=2,13,24;d=0
g.map{|y|g.map{|x|Square.new(x,y,9);Square.new(x+2,y+2,5,"black")if c[d]>0;d+=1}}
show

Выход:

выход

Изменить: теперь имеет серые линии сетки.

Марк Томас
источник
3
Я вижу несколько возможностей для игры в гольф здесь. Для начала d=d+1имеет более короткую форму ( d+=1) и ==1здесь эквивалентно >0. Также подумайте, что происходит, когда вы устанавливаете c в Fixnum вместо массива :-)
RJHunter
1
@RJHunter Я пропустил низко висящие фрукты! И я думал о таких вещах, как создание битового поля с помощью c, но не смог придумать способ, который на самом деле короче в реализации.
Марк Томас
2
Возможно, на удивление, в Ruby встроена поддержка битовых полей! Вы можете получить доступ к целому числу, []как если бы это был массив битов (только для чтения, но здесь все в порядке).
RJHunter
@ RJHunter спасибо! Все, что мне нужно было сделать, это изменить c на соответствующий номер. Уменьшил его совсем немного.
Марк Томас
Вы можете изменить , g=[2,13,24]чтобы g=2,13,24и заменить eachс map.
Джордан
8

PNG, 105 100 байт

PNG изображение    (т.е. этот файл изображения)

Учитывая, что HTML и другие языки, не относящиеся к программированию, разрешены , мне было любопытно посмотреть, сколько я смогу сыграть в простое отображаемое в браузере изображение, чтобы служить базовым сравнением. Результат сжимается с помощью инструментов с открытым исходным кодом optipng ( -o7 -zm1-9 -strip all) и pngwolf . Я также экспериментировал с zopflipng , но результаты были больше. Другие инструменты сжатия с закрытым исходным кодом могут сбрить еще пару байтов.

Данные изображения в base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTgAAAABJRU5ErkJggg==

Правка Я заставил точки коснуться верхней и нижней частей ячейки, чтобы вызвать большую повторяемость в шаблоне пикселей и, таким образом, улучшить степень сжатия. Но не волнуйтесь, точка все еще только заполняет (7 * 9) / (9 * 9) ≈ 78% своей ячейки.


Нестандартный PNG, 88 байт

Как отмечает @anatolyg , есть некоторый потенциал игры в гольф, удаляющий кусок IEND (12 байтов). Технически IEND требуется стандартом . Однако каждый фрагмент PNG содержит свой собственный размер и информацию о контрольной сумме. Поэтому не обязательно иметь конечный маркер. И действительно, все протестированные браузеры могут отображать изображение без проблем.

К сожалению (или к счастью), это нестандартное изображение отклонено imgur, поэтому я не могу его загрузить. Это кодировка base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTg==

Meyer
источник
Я не уверен, если это действительно. PNGэто не язык программирования.
DJMcMayhem
4
Спасибо MD XF. @DJMcMayhem Ни HTML. Но, учитывая небольшой размер изображения, я представил его как интересную нестандартную запись.
Мейер
4
Кроме того, добро пожаловать в PPCG, @Meyer! :)
Мартин Эндер
1
Вы можете удалить несколько байтов в конце файла и сохранить изображение. Может зависеть от зрителя, хотя; Я полагаю, что большинству зрителей не требуется, например, присутствие конечного фрагмента.
Анатолий
7

Октава , 127 124 байта

Удалено 3 байта благодаря Луису. gridдостаточно (вместо grid on).

spy([0,1,0;0,0,1;1,1,1],'.k',300),set(gca,'XTick',.5:4,'XTickLabel','','YTick',.5:4,'YTickLabel',''),axis(.5+[0,3,0,3]),grid

Выходы (после сохранения):

Обратите внимание, что на выходе отображаются серые линии сетки в окне графика. Они чернеют при сохранении (по какой-то причине).

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

Ну, это было долго и грязно! Пришлось пройти через множество модификаций, чтобы это соответствовало спецификациям.

Объяснение и, надеюсь, немного игры в гольф в ближайшее время ...

Стьюи Гриффин
источник
Это выглядит не очень скучно, но, поскольку ОП дал ответ с похожим результатом, я думаю, что это нормально ..
L3viathan
2
Я думаю, что соотношение высоты и ширины зависит от платформы. Добавьте, 'square'чтобы он был квадратным на всех платформах. spy([0,1,0;0,0,1;1,1,1],'.k',80),set(gca,'XTick',.5:4,'XTickLabel','','YTick',.5:4,'YTickLabel',''),axis(.5+[0,3,0,3],'square'),grid on,
Стьюи Гриффин
7

Обработка, 212 198 байт

background(-1);noFill();stroke(99);rect(0,0,99,99);rect(0,33,99,33);rect(33,0,33,99);fill(0);int f=25;ellipse(15,83,f,f);ellipse(50,83,f,f);ellipse(83,83,f,f);ellipse(83,50,f,f);ellipse(50,15,f,f);

По сути, мы используем простую обработку, чтобы нарисовать белый фон, затем устанавливаем прозрачность прямоугольников, используемых для сетки, и рисуем их штрихи серым цветом. Мы продолжаем, определяя прямоугольник, снова устанавливая значение заполнения, чтобы заполнить круги черным цветом, и определяем круги пятерок.

Вуаля!

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

Вы можете добавить

strokeWidth(2); 

или больше, чтобы лучше видеть цвет штрихов.

(Это мой первый Code-Golf, надеюсь, я все сделал правильно.)

РЕДАКТИРОВАТЬ: Благодаря Kritixi Lithos! Убрал переводы строк, изменил на int f = 25 и использовал -1 в фоновом режиме (float)

Zep
источник
1
Отличный первый гольф, и добро пожаловать в PPCG!
MD XF
1
Вы можете сохранить несколько байт, удалив символ новой строки, изменяя float f=25;к int f=25;и используя background(-1)вместоbackground(255);
Kritixi Lithos
6

Тикз, 193 175 170 байт

\documentclass[tikz]{standalone}\begin{document}\tikz{\def\a{)rectangle(}\def~{)circle(1)(}\draw(4,6\a2,0)(0,\a6,6)(0,2\a6,4);\fill(1,1~3,1~5,1~5,3~3,5~,)}\end{document}

Вот вывод:

Выход

Мастер пшеницы
источник
3
@MDXF Это разрезает близко, но так как это идеальные круги и квадраты, они составляют π / 4 квадрата, который составляет всего около 79% площади.
Пшеничный волшебник
Блин, посмотрел на вызов и имел точно такую ​​же идею;)
racer290
4

MATL , 74 69 68 64 62 байта

4:6B&f,.5+w]'k.'5Y08W5$XG7lZG1$3ZG1tZG4:"@th1Kh'k'3$XG1Mbw3$XG

Попробуйте это в MATL Online! (Это займет несколько секунд.)

Вывод онлайн-переводчика:

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

Луис Мендо
источник
4

Обработка, 134 байта

Вдохновленный @Zep, вот мой однострочный процессинг (а также мой первый гольф-код):

stroke(127);for(int i=0;i<9;i++){int x=i%3*30;int y=i/3*30;fill(255);rect(x+5,y+5,30,30);if(i==1||i>4){fill(0);ellipse(x+20,y+20,23,23);}};

Спасибо за @Kritixi Lithos за его блестящие советы, как сбрить несколько байтов!

планер в обработке

Георгий Профенца
источник
Добро пожаловать в PPCG и хороший первый ответ! Как утверждает Theraot, все представления должны иметь заголовок, который содержит язык и количество пользователей. Кроме того, вы можете сыграть в гольф несколько байтов, объявив все переменные в цикле for, например, for(int i=0,x,y;...чтобы вы могли сбросить intтело цикла. Кроме того, fill(255);может стать простоfill(-1);
Kritixi Lithos
Я не проверял, но я думаю , вы можете опускать +20при установке значения xи y, таким образом , что вы можете изменить , rectчтобы rect(x+5,y+5,30,30);и ellipseк ellipse(x+20,y+20,23,23);и сохранить два байта.
Kritixi Lithos
4

LaTeX + Tikz, 155 байт

\documentclass[tikz]{standalone}\begin{document}\tikz{\draw(0,0)grid(3,3);\foreach\x/\y in{0/0,1/0,2/0,2/1,1/2}\fill(\x+.5,\y+.5)circle(.5);}\end{document}

результат

TonioElGringo
источник
1
Это 1/0делает разделение?
wizzwizz4
Извините, но нет, это простой разделитель пар xи yкоординат.
TonioElGringo
Вы должны быть в состоянии сэкономить несколько байтов, увеличив все на 2, чтобы вы .5стали справедливыми 1.
Крис
@Chris Встроенная сетка по умолчанию создает ячейки единичной длины, и для ее [step=2]создания требуется примерно 8 байтов (добавление ). Упрощение координат для рисования кругов не сохранит достаточно байтов. (Вы получаете 157 байт , если вы это делаете)
TonioElGringo
@TonioElGringo Ах, правда. Научит меня комментировать, не проверяя его в первую очередь;)
Крис
4

SmileBASIC, 125 байт

GCLS-1GCOLOR #GRAY
GBOX.,8,30,38GBOX 10,8,20,38GBOX.,18,30,28G.,1G 1,2G-1,3G.,3G 1,3DEF G X,Y
GPUTCHR X*10+12,Y*10,58081,.END

58081 (U + E2E1, который находится в блоке «Область личного пользования») - это код символа для символа круга. Поместить его в строку тоже можно, но поскольку в UTF-8 он закодирован как 3 байта, он будет такой же длины (и не будет отображаться здесь правильно).

Уценка ужасна

12Me21
источник
1
Всегда приятно видеть базовые ответы!
Тейлор Скотт
3

C #, 333 байта

using System.Drawing;_=>{var b=new Bitmap(31,31);var g=Graphics.FromImage(b);g.FillRectangle(Brushes.White,0,0,31,31);for(int x=0,y;x<3;++x)for(y=0;y<3;++y){g.DrawRectangle(Pens.Gray,x*10,y*10,10,10);if(x==1&y<1|x>1&y==1|y>1)g.FillEllipse(Brushes.Black,x*10+1,y*10+1,8,8);}b.Save("t.png");System.Diagnostics.Process.Start("t.png");};

Полная / Отформатированная версия:

using System.Drawing;
Action<int> a = _ =>
{
    var b = new Bitmap(31, 31);
    var g = Graphics.FromImage(b);

    g.FillRectangle(Brushes.White, 0, 0, 31, 31);

    for (int x = 0, y; x < 3; ++x)
        for (y = 0; y < 3; ++y)
        {
            g.DrawRectangle(Pens.Gray, x * 10, y * 10, 10, 10);
            if (x == 1 & y < 1 | x > 1 & y == 1 | y > 1)
                g.FillEllipse(Brushes.Black, x * 10 + 1, y * 10 + 1, 8, 8);
        }

    b.Save("t.png");
    System.Diagnostics.Process.Start("t.png");
};

Идея проста: мы создаем графический объект из изображения и используем его, чтобы сделать изображение полностью белым. Затем зациклите каждый квадрат изображения, рисуя ограничивающий прямоугольник. Если это одно из мест для точки, мы тоже это рисуем. Наконец, мы сохраняем изображение в файл и позволяем Windows решить, как его открыть, в моем случае оно открывается с помощью Windows Photo Viewer.

Использование a Processдля показа изображения и сохранение в файл намного короче, чем создание форм Windows или приложения WPF, из-за всех различных классов и лишнего пуха, необходимого для их создания.

Выход:

Выход

TheLethalCoder
источник
Я не думаю, что вам нужно использовать Process.Start, например, ответ Титуса просто выводит изображение, не открывает его
Джереми Томпсон
@JeremyThompson правила гласят, что вы должны отобразить изображение
TheLethalCoder
3

PHP, 221 + 2 байта

<?imagefill($i=imagecreatetruecolor(31,31),0,0,~0);function q($i,$x,$y,$f){imagerectangle($i,$x*=10,$y*=10,$x+10,$y+10,5e6);$f?:imagefilledellipse($i,$x+5,$y+5,8,8,0);}for($p=16;$p--;)q($i,$p&3,$p>>2,53>>$p&1);imagepng($i);

Сохранить в файл; позвоните в браузер. Если ваш браузер отображает бред,
вставьте header("Content-Type:image-png");перед imagepng($i);.

выходТочки не очень круглые; это из-за небольших пропорций.

сломать

function q($i,$x,$y,$f){        # function to draw quadrant:
    imagerectangle($i,$x*=10,$y*=10,$x+10,$y+10,5e6);   # draw lines in 0x4c4b40
    $f?:imagefilledellipse($i,$x+5,$y+5,8,8,0);         # if bit not set, draw dot
}

imagefill($i=
    imagecreatetruecolor(31,31) # create image
    ,0,0,~0);                   # fill with 0xffffff (white)
for($p=16;$p--;)q($i,           # loop through positions, call function
    $p&3,                           # $x=lower two bits
    $p>>2,                          # $y=upper two bits
    53>>$p&1                        # $f=one bit from %0000 0000 0011 0101
);                                      # (reversed inverted bit mask for dots)
imagepng($i);                   # output image

Я думаю, что 0x4c4b40квалифицируется как приблизительный серый. Если нет, добавьте четыре байта.

Titus
источник
3

R 313 236 байт

l=c(1,7)
bmp('r',400,400)
plot(x=c(4,6,2,4,6),c(6,4,2,2,2),cex=14,pch=19,xlim=l,ylim=l,xlab='',ylab='',xaxs='i',yaxs='i',axes=F)
a=function(s,...){axis(s,labels=F,tck=1, col="gray",lwd=9,...)}
a(1,xaxp=c(l,3))
a(2,yaxp=c(l,3))
dev.off()

Пересмотренный код, основанный в основном на комментариях от @ user2390246, сэкономил 77 байт. Очень ценю помощь.

Кроме того, вы хотите добавить вызов к более короткому R-решению @mschilli. Он показывает элегантный способ решения проблемы графических значений по умолчанию.

Выход

Идет в файл с именами "р". Опущение и расширение спасли мне четыре байта. Но затем мне пришлось отредактировать расширение файла обратно на «bmp», чтобы загрузить его. Так что, возможно, я не должен получить кредит на эти четыре байта.

Логотип хакера

Комментарий

Я подумал: «Эта графика - не что иное, как простой график с пятью точками. Должно быть простым делом реализовать язык с надежными графическими возможностями данных. Давайте попробуем это в R.» Но тогда мне пришлось потратить порядка 80% байтов, просто работая над графическими значениями по умолчанию R.

Вроде не тот инструмент для работы ....

Я не мог найти менее подробный способ гарантировать размер и соотношение сторон графики, чем путем вызова конструктора bmp и затем dev.off (). Комбинация составляет 25 байтов. Если ваш R-сеанс настроен правильно, вы можете получить графику, которая выглядит более или менее правильно, не тратя эти байты, но она не является надежной или непротиворечивой.

CCB60
источник
1
Несколько предложений: вообще не определяйте свой фрейм данных b, просто поместите два безымянных вектора непосредственно в plotфункцию. Используйте c(l,3)для xaxpи yaxp. Вы можете просто использовать Fдля false, нет необходимости определять его. И определите новую функцию, a(x,...)которая вызывает, axis(x)но имеет значения по умолчанию для меток, tck и т. Д., Чтобы вам не нужно было указывать их все дважды.
user2390246
Вы также можете использовать, axes=Fа не xaxt='n',yaxt='n'. И вы забыли использовать .5при определении, lхотя вы использовали этот трюк позже.
user2390246
1
На самом деле, что, если вы удвоили все значения координат, чтобы полностью избавиться от этих надоедливых .5?
user2390246
1
Если вы уже собираетесь удалить .bmpрасширение файла, вы можете просто назвать его r.
MD XF
@ user2390246 - Большое спасибо за предложения. Суммарно сохранено порядка 70 байтов. Это был мой первый опыт игры в гольф в R, и вы заметили множество ошибок Tyro, которые я, вероятно, должен был увидеть. В следующий раз я буду знать лучше.
CCB60
3

TI-BASIC, 218 140 137 байт

Примечание: это количество байтов немного завышено. Программа использует только 85 токенов, но это сохраняется в 137 байтах. Кроме того, если вы используете не цветной калькулятор, вы можете сохранить еще 4 токена, потому что вам не нужно указывать цвет (по умолчанию синий), но я не знаю, достаточно ли велики их экраны для этот вызов, потому что у меня нет ни одного.

prgmHACKER (138 байт, 86 токенов):

{0,1,2,1,2}→L1
{0,0,0,2,1}→L2
.3→R
For(I,0,5
L₁(I)+.5→A
L₂(I)+.5→B
For(N,0,R,dX
√(R²-N²
Line(A+N,B-Ans,A+N,B+Ans,BLACK
Line(A-N,B-Ans,A-N,B+Ans,BLACK
End
End

Для правильного отображения эта программа требует, чтобы Xmin = Ymin = 0, Xmax = Ymax = 3, Xscl = Yscl = 1. Также необходимо правильно установить dX, но калькулятор делает это для вас, когда вы устанавливаете любую другую переменную окна. Я не мог видеть, сколько места эти переменные использовали в оперативной памяти.

Кроме того, параметры формата должны быть {RectGC, CoordOff, GridLine, GridColor: MEDGRAY, Оси: OFF, ExprOff, BorderColor: 1, Background: OFF}, но это переключаемые значения и не занимающие дополнительного места в зависимости от настройки.

latias1290
источник
Чтобы вывести список из списка, вы можете выразить их как, {0,1,2,1,2}а {0,0,0,2,1}затем добавить 0.5к каждому элементу.
wizzwizz4
Попробовал это, но это не изменило объем оперативной памяти, используемой списками. Однако вы дали мне идею избавиться от списков в ОЗУ и определить их при запуске программы, сэкономив 78 байт в ОЗУ.
latias1290
Заказывайте в гольфе людей! Измените L1и L2на L₁и L₂, так как вы уже используете их. Я думаю, что вы можете удалить }и L₁(I)+.5→A=> .5+L₁(Iи L₂(I)+.5→B=> .5+L₂(I→B.
Захари
3

R 119 114 111 байт

(Спасибо @JayCe за сохранение мне 3 байта)

Не короче, чем другое решение R , но совершенно другой подход:

layout(matrix(c(1,9,2:8),3,,T))
par(mar=0*1:4)
for(i in 1:9){frame();if(i>4)points(.5,.5,,19,cex=29);box(fg=8)}

Используется макет, в котором 4 первых графика - это пустые ячейки, а 5 других - с точками в них.

Планер

plannapus
источник
Можно ли сделать короче, чем другое решение, используя позиционные аргументы: здесь
JayCe
@ JayCe действительно, спасибо!
plannapus
3

Excel VBA, 180 байт

Анонимная функция окна VBE Immediate, которая не требует ввода и вывода в объект листа по умолчанию ( Sheet1).

Cells.RowHeight=48:Cells.Interior.Color=-1:[B2:D4].Borders.Color=7434613:For Each s In[{21,32,13,23,33}]:Sheet1.Shapes.AddShape(9,48*(s\10)+4,Mid(s,2)*48+4,40,40).ShapeStyle=8:Next

Комментируемая версия

Cells.RowHeight=48                      ''  Make the Cells square
Cells.Interior.Color=-1                 ''  Remove the default grid
[B2:D4].Borders.Color=7434613           ''  Create the 3x3 gray grid at range `B2:D4`
For Each s In [{21,32,13,23,33}]        ''  Assign and iterate over a list of where
                                        ''  to place the dots; This list is a range that 
                                        ''  is coerced into a numeric array

    Sheet1.Shapes.AddShape(         _   ''  Add a shape to the Sheet1 object
                9,                  _   ''  An Oval (msoShapeOval)
                48*(s\10)+4,        _   ''  At the calculated value from the left
                Mid(s,2)*48+4,      _   ''  At the calculated value from the top
                40,                 _   ''  that is 40 units wide
                40                  _   ''  and is 40 units tall
                ).ShapeStyle=8          ''  and is black filled with a black outline

Next                                    ''  repeat to end of list

Выход

Логотип хакера

-6 байт для использования [{21,32,13,23,33}]болееSplit("21 32 13 23 33")

-2 байта для использования Mid(s,2)болееRight(s,1)

-3 байта для использования (s\10)болееLeft(s,1)

Тейлор Скотт
источник
2

Октава 107 94 103 байта

scatter([1:3,3,2],[1,1,1:3],1e5,zeros(5,3),'.');axis off;a=[1,7]/2;for i=.5:3.5;line(a,i);line(i,a);end

или же

plot([1:3,3,2],[1,1,1:3],'k.','markersize',250);axis off;a=[1,7]/2;for i=.5:3.5;line(a,i);line(i,a);end

оба решения составляют 103 байта.

Тасос Папастилиану
источник
2
Я считаю, что точки должны быть черными
TheLethalCoder
ну, интересно, Matlab интерпретирует скаляр как точку, а не транслирует ее. так что вместо line([x1,x2],y)тебя надо делатьline([x1,x2],[y,y])
Тасос Папастилиану
2

Apple Swift (iOS - CoreGraphics / QuartzCore) - 832 байта

Я нарисовал форму полностью, используя Quartz для устройства Apple iOS. К сожалению, это не особо внимательный язык, поэтому результат довольно большой, но это настолько мало, насколько я могу его себе представить.

UIGraphicsBeginImageContext(CGSize(width:60,height:60));let c=UIGraphicsGetCurrentContext()!;UIColor.lightGray.setStroke();c.addRect(CGRect(x:0,y:0,width:60,height:60));c.move(to: CGPoint(x:20,y:0));c.addLine(to: CGPoint(x:20,y:60));c.move(to: CGPoint(x:40,y:0));c.addLine(to: CGPoint(x:40,y:60));c.move(to: CGPoint(x:0,y:20));c.addLine(to: CGPoint(x:60,y:20));c.move(to: CGPoint(x:0,y:40));c.addLine(to: CGPoint(x:60, y:40));c.strokePath();UIColor.black.setFill();c.addEllipse(in:CGRect(x:22,y:2,width:16,height:16));c.addEllipse(in:CGRect(x:42,y:22,width:16,height:16));c.addEllipse(in:CGRect(x:2,y:42,width:16,height:16));c.addEllipse(in:CGRect(x:22,y:42,width:16,height:16));c.addEllipse(in:CGRect(x:42,y:42,width:16,height:16));c.fillPath();let i=UIGraphicsGetImageFromCurrentImageContext();sub.addSubview(UIImageView(image:i))

Более читаемая версия для всех, кто интересуется:

    UIGraphicsBeginImageContext(CGSize(width: 60, height: 60))
    let c = UIGraphicsGetCurrentContext()!

    UIColor.lightGray.setStroke()
    c.addRect(CGRect(x: 0, y: 0, width: 60, height: 60))
    c.move(to: CGPoint(x: 20, y: 0))
    c.addLine(to: CGPoint(x: 20, y: 60))
    c.move(to: CGPoint(x: 40, y: 0))
    c.addLine(to: CGPoint(x: 40, y: 60))
    c.move(to: CGPoint(x: 0, y: 20))
    c.addLine(to: CGPoint(x: 60, y: 20))
    c.move(to: CGPoint(x: 0, y: 40))
    c.addLine(to: CGPoint(x: 60, y: 40))
    c.strokePath()

    UIColor.black.setFill()
    c.addEllipse(in: CGRect(x: 22, y: 2, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 42, y: 22, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 2, y: 42, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 22, y: 42, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 42, y: 42, width: 16, height: 16))
    c.fillPath()

    let i = UIGraphicsGetImageFromCurrentImageContext()
    sub.addSubview(UIImageView(image: i))

Вот результат, полученный в iOS Simulator: Выход

Джейкоб Кинг
источник
2

SVG + HTML, 146 138 135 133 байта

<svg>
<path fill=none stroke=#ccc d=m.5.5h30v30h-30zh10v30h10v-30zv10h30v10h-30 />
<path d=m11,1h9v9m1,1h9v9m-29,1h9v9m1-9h9v9m1-9h9v9>

Благодаря снисходительному анализатору HTML xmlns="http://www.w3.org/2000/svg"объявление может быть опущено, а также кавычки атрибутов и закрывающий тег. Эта версия решает некоторые проблемы других HTML-решений:

  • «Точка» гарантированно заполнит не менее 40% своей ячейки (§1)
  • Он не использует внешнюю графику, например шрифты (§2, §6)
  • Сетка идеально квадратная (§5)

Отредактируйте Shaved off 8 байтов, используя тот факт, что подпути не нужно закрывать для заполнения .

Редактировать В соответствии с грамматикой svg , не обязательно разделять запятую ( .5,.5). Я также отказался от явной заливки, чтобы изменить направление рисования одной линии с отрицательного на положительное, сохранив черту. И, наконец, я изменил счет, чтобы не включать завершающий перевод строки, извините за ошибку новичка.

Править Изучение из другого ответа на Codegolf, я заменил финал 9 />с 9>. Это прекрасно работает во всех протестированных браузерах.

Meyer
источник
2

Python 3 + PyGame, 238 байт

from pygame import*
d=display
s=d.set_mode([55]*2)
s.fill([255]*3)
f=lambda*a:draw.line(s,[128]*3,*a)
for x in[0,18,36,54]:
 f((x,0),(x,55));f((0,x),(55,x))
for x,y in zip([3,5,1,3,5],[1,3,5,5,5]):draw.circle(s,[0]*3,(x*9,y*9),7)
d.flip()

Казалось бы, произвольные константы от меня пытаются сделать изображение максимально большим, не жертвуя байтами.

С непечатными символами, 229 байт

from pygame import*
d=display
s=d.set_mode([55]*2)
s.fill([255]*3)
f=lambda*a:draw.line(s,[128]*3,*a)
for x in b'\0␒$6':
 f((x,0),(x,55));f((0,x),(55,x))
for x,y in zip(b'␃␅␁␃␅',b'␁␃␅␅␅'):draw.circle(s,[0]*3,(x*9,y*9),7)
d.flip()

Я заменил списки байтовыми литералами, что сохраняет кучу символов, но непечатные символы не могут отображаться здесь должным образом. Я заменил непечатные символы на их графические эквиваленты U + 2400-U + 2421 для отображения.

Скриншот

Райан МакКэмпбелл
источник