Выведите изображение вашего исходного кода (не совсем-Quine)


29

Код гольф: распечатать изображение исходного кода.

Требования

  1. Должен выводить изображение самого исходного кода, а не версии, хранящейся в другом месте и извлекаемой во время выполнения.
  2. Код должен быть достаточно разборчивым, чтобы его можно было скопировать вручную и воспроизвести результаты.

Любой формат изображения применим.

Бонусы

  • -10% от вашей оценки, если вы разрешите более одного выходного формата.
  • -15%, если ваш код также является истинным квинем. т.е. не читает ее исходный код , но исходный код встраивается (см здесь для примера)
  • -30%, если ваш код строгий квин - то есть изображение кода встроено в программу (Piet solutions, я смотрю на вас).

Должен ли он быть разборчивым?
Тим Сегин

7
«Должен выводить само изображение кода, а не сохраненную версию из другого места». Разрешено и / или необходимо читать файл исходного кода?
Тим Сегин

29
Я только что реализовал решение в пробелах. Полученное изображение выглядит довольно скучно.
Говард

7
Вот интересная графическая картинка, написанная на Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Ответы:


25

ракушка

Под «Печать изображения исходного кода» я предполагаю, что на самом деле печать изображения на бумаге будет приемлемой.

#!/bin/sh
lpr $0

21

7
Не могли бы вы ответить на этот вопрос? Это стало нашей стандартной политикой для ответов из внешних источников. Это действительно круто, хотя!
Джонатан Ван Матре

@JonathanVanMatre К сожалению, извините. Это то, что я хотел сделать. Я думаю, что я не должен пытаться отвечать на вопросы, участвуя в другой дискуссии .
Парень со шляпой

Это нижняя из двух. -30% и -15%
Pureferret

14

PHP - 487 × 0,9 × 0,85 = 372,555 (2000 × 99 пикселей)

<?php $y="imagecolorallocate";$l=[
'<?php $y="imagecolorallocate";$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");

Если предупреждения в порядке: PHP - 479 × 0,9 × 0,85 = 366,435

<?php $y=imagecolorallocate;$l=[
'<?php $y=imagecolorallocate;$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);

Вы предоставляете функцию вывода для использования в качестве первого аргумента командной строки:

php timwolla.php imagepng

Решение с предупреждениями:


5
Я думаю, что это первый фактический quine, а не просто скрипт читает свой собственный исходный код или просто делает скриншот сам по себе.
nitro2k01

Два вопроса, можете ли вы использовать другое обозначение для своих десятичных дробей? Это немного сбивает с толку. И почему изображение такое маленькое? Трудно читать (по общему признанию, я на своем телефоне)
Pureferret

2
@Pureferret, просто увеличьте его. На самом деле он вполне читабелен, несмотря на пикселизацию.
Руслан

1
@Pureferret Просто изменил их, я никогда не помню, чтобы это было по-другому на английском ...
TimWolla

13

Пробел, 125



















Выводит файл изображения в формате pbm .

Если вы тестируете этот код, скопируйте его, нажав «Изменить», и скопируйте все между <pre>тегами.

Выход:

P1 1 1 0

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

17
Этот ответ не соответствует требованию 2. Изображение недостаточно читаемо, чтобы воспроизвести исходный код.
user2357112 поддерживает Monica

2
@ user2357112 Но вы не можете этого доказать. Это лазейка, которую я здесь использую.
duci9y

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

3
Простите французы, но хз! Правила гласят, что код должен быть разборчивым. Написание кода в Whitespace не отменяет этого. Это ваша программа, показанная в Sublime Text, когда она выбрана: i.imgur.com/A2ZaQwI.png Это разборчиво. Независимо от того, что ваша программа не выводит. И кроме того, вы не объяснили, является ли то, что ваша программа выводит, на самом деле вашим исходным кодом или просто буквально пустым изображением.
nitro2k01

13

Mathematica, 37 31 символ

(#2[#1[#0[#1,#2]]]&)[Defer,Rasterize]

(Rasterize[#1[#0[#1]]]&)[Defer]

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

Вдохновленный ответом в mathematica.stackexchange.com .


Объясните это ... для чего #n? Может быть, мы можем понять это.
Pureferret

По крайней мере, это работает без FrontEnd. (Попробовал Export["/tmp/out.png",%]после запуска этой команды)
Руслан

2
@Pureferret #nозначает nаргумент чистой функции (созданной в &точке). Все выражение расширяется до Rasterize[Defer[#0[Defer,Rasterize]]], где #0происходит рекурсивный вызов исходной чистой функции. В некотором смысле, это не строгий пример, но для его работы не требуется внешний интерфейс, и IMO - хорошее решение.
Руслан

Я восхищаюсь использованием Defer [] и Rasterize [] в качестве команд и объекта команд. Я никогда не видел рекурсию, представленную таким образом.
Майкл Стерн

10

AppleScript, 68 37

Хорошо, если вы можете вызвать ImageMagick в Zsh, то это тоже верно. Я до сих пор хакуюсь над чем-то более элегантным и необыкновенным для собственного удовольствия, но ради чистой игры в гольф, вот мы:

Новая версия

do shell script "screencapture q.jpg"

Старая версия

tell application "System Events" to keystroke "#" using command down

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

останови свою куину

do shell script "screencapture -c"

3
Я думаю, что квайн по определению производит свой исходный код как единственный выход, но не уверен, должно ли это относиться к этому вопросу. nyx.net/~gthompso/quine.htm
duci9y

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

Я считаю это обоснованным и ожидал чего-то подобного.
Pureferret

Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

3
Технически, ни один из них не может быть строгим, кроме ответа Пайта, потому что ни один из этих языков не воспринимает изображения в качестве исходного кода. Но я все еще полон решимости сделать свою версию более строгой. :)
Джонатан Ван Матре

8

Математика, 83

SelectionMove[InputNotebook[],Previous,Cell];Rasterize@NotebookRead@SelectedCells[]

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


1
Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

1
Не работает без интерфейса (в mathили MathKernel), даже с <<JavaGraphics`импортированным.
Руслан

8

Sh, X & ImageMagick 18.9:

 import -window root a.jpg

Это должно работать в любой оболочке, которая имеет ImageMagick.

Чтобы напечатать только код, добавьте clear &&это в 26.1

clear && import -window root a.jpg

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

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


Проверено на моем компьютере, все работает.
user12205

4
У меня не работало на консоли Linux . Вы можете добавить X к требованиям.
Илмари Каронен

2
Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

1
@nitro Я, возможно, неправильно использовал термин «Quine», но в первой строке моего поста упоминается только вывод изображения исходного кода. Сейчас я редактирую, чтобы уточнить мои первоначальные намерения, а также извлечь выгоду из истинных / строгих цитат.
Pureferret

1
Просто любопытно, я вижу биткойны и кошельки Litecoin; Сейчас ~ 3 года, какие-нибудь серьезные успехи? : D
Альберт Реншоу

5

HTML5 / Javascript: 615

<canvas id='i' width=500 height=5000></canvas><script>function d(){var e=document.getElementById("i");var t=e.getContext("2d");t.font="20px Arial";var n=400;var r=25;var i=(e.width-n)/2;var s=60;str="<canvas id='i' width=5000 height=500></canvas>\n<script>"+d+"d();"+wrapText+"<\/script>";wrapText(t,str,i,s,n,r)}function wrapText(e,t,n,r,i,s){var o=t.split(" ");var u="";for(var a=0;a<o.length;a++){var f=u+o[a]+" ";var l=e.measureText(f);var c=l.width;if(c>i&&a>0){e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r);u=o[a]+" ";r+=s}else{u=f}}e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r)}d()</script>

Демо: http://jsfiddle.net/E2738/2/

Можно щелкнуть правой кнопкой мыши по изображению и сохранить его в формате PNG.


2
это заканчивается<//script>
Не то, что Чарльз

1
в конце строки 11 в скрипке изменить +wrapText+"<//script>";на+wrapText+"<\/script>";
Люк

@Charles Спасибо за указание на это. Исправлена.
Клайд Лобо

4

Ява, 570 - 10% - 15% = 427,5

("filepath" включен), 554 - 10% - 15% = 415,5 ("filepath" не включен)
Спасибо Андреасу за удаление BufferedImageвjava.awt.image.BufferedImage

import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s="import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s=%s%s%s;char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,%spng%s,new java.io.File(%sfilepath%s));}}";char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,"png",new java.io.File("filepath"));}}

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

Для правильного просмотра перейдите по этой ссылке: http://i.stack.imgur.com/RRSDw.png

Это работает так же, как обычный quine, за исключением того, что выводит изображение. Текущий формат есть png, но формат можно легко изменить, заменив все экземпляры pngв программе любым форматом, который вы хотите.

В отличие от нескольких ответов здесь, это настоящая квинна; нет чтения файла программы.


Вы можете избавиться от других 24 символов, если заменить оба "java.awt.image.BufferedImage" на "java.awt.image. *"
Andreas

4

Javascript + JQuery 153 148

регулярное

(function f(){
  c=$('<canvas/>')[0];
  a=c.getContext('2d');
  l=('('+f+')()').split('\n');
  for(i=0;i<l.length;i++)
    a.fillText(l[i],5,12*(i+1));
  $('body').append('<img src="'
      +c.toDataURL("image/png")+'"/>')
})()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Golfed

function f(){c=$('<canvas>')[0];c.width=750;a=c.getContext('2d');a.fillText(f+'f()',5,9);$('body').append('<img src="'+c.toDataURL("png")+'"/>')}f()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1
Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

$? Вы используете JQuery, а?
Клайд Лобо

@ClydeLobo Да, кажется, он есть. Подождите, вы можете сделать Javascript без JQuery? Кто бы мог подумать!
Пьер Арло

@ClydeLobo Да, я. Но библиотеки должны быть разрешены. Это действительно ничем не отличается от программы на C, использующей stdio.hxD. Написание программы без JQuery легко, хотя. Просто замените $('<canvas/>')[0]на document.createElement('canvas')и $('body').appendс document.write. jQuery спас меня байты.
aebabis

3

zsh, 57 × 0,9 = 51,3

Передайте ему имя выходного файла в качестве аргумента.

convert -annotate +0+10 "$(<$0)" -size 320x14 xc:white $1

Производит:

Пример вывода


1
это Zsh или ImageMagick?
Кая

@Kaya: Ну, оба. Язык zsh (или bash, но не Posix), а библиотека / инструмент - ImageMagick (или GraphicsMagick, если вы предпочитаете) - как PHP с GD или Ruby с RMagick.
Ry-

1
@Pureferret: Добавлено.
Ry-

Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

3

C99 (с использованием SDL и SDL_ttf), 414 354 346 - 15% = 294,1

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

Это довольно безобразно без дополнительных разрывов строк, но, к сожалению, они должны отсутствовать. Функция рендеринга текста вообще не обрабатывает управляющие символы, поэтому любые разрывы строк в коде должны выводиться вручную при выводе.

Вот тот же код, но с некоторыми дополнительными переносами строк, добавленными для удобочитаемости:

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,
SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))
SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),
(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],
(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

К сожалению, это также не добавляет разрывы строк к графическому выводу:

выход

Вывод по-прежнему четкий, хотя с 9-точечным выводом и красным цветом шрифта, он немного капризный. Вы можете улучшить его за счет характера путем замены 9с 12. (Обратите внимание, что размер получающегося изображения жестко закодирован до 2048x80. Чтобы учесть различия в различных шрифтах, к правому краю и начальному значению было добавлено немало избыточного, достаточного для того, чтобы шрифт размера 12 по-прежнему удобно помещался Однако, если вы хотите увеличить его, размеры, вероятно, также должны быть изменены.)

Команда для сборки программы:

gcc -Wall -o imgquine imgquine.c -lSDL_ttf `sdl-config --cflags --libs`

Программа предполагает, что q.ttfпри запуске существует файл шрифта, который вызывается в текущем каталоге. Я позаботился об этом заранее, выполнив следующую команду (которая должна работать на большинстве современных Linux):

ln -s `fc-match --format='%{file}' sans` ./q.ttf

(Не стесняйтесь импортировать свой собственный любимый шрифт TrueType.)

После запуска программы вывод изображения будет создан в текущем каталоге в файле с именем q.bmp. К сожалению, растровые файлы Windows являются единственным выходным форматом, который предоставляет эта программа. Добавление большего количества форматов вывода потребует ссылки в большем количестве библиотек.

Обратите внимание, что в этой программе используется синтаксис C99 для введения непростых литеральных значений, что значительно сокращает количество переменных, которые необходимо определить. Это то, что больше игроков в гольф C должны использовать в своих интересах.


2

C # - 498 - 15% = 423,3

Это, вероятно, может быть в гольф больше. Я никогда не делал квины или такую ​​графику в C #:

using System;using System.Drawing;class Q{static void Main(){var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f="using System;using System.Drawing;class Q{{static void Main(){{var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f={0}{1}{0},e={3}{0}{2}{0};g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}}}",e=@"D:\p.png";g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}

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

Добавление поддержки другого формата было бы легко. Не уверен, что оно того стоит.


2

Рубин, 104 символа

require "RMagick"
include Magick
Draw.new.annotate(i=Image.new(999,99),0,0,0,9,File.read($0))
i.display

Пример вывода для каждого запроса: i.imgur.com/jMC594C.png


У вас есть пример вывода?
Pureferret

@Pureferret см. Редактирование
Shelvacu

1
Не строгий квин. (Не генерирует программно собственный исходный код.)
nitro2k01

1

Питон: 255 238 -10% -15% = 195,075 182,07

import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r="import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r=%r;D.Draw(i).text((0,0),r%%r,fill=255);i.save(sys.argv[1])";D.Draw(i).text((0,0),r%r,fill=255);i.save(sys.argv[1])

Использование:

python imgquine.py quine.jpg

Это настоящая сущность, которая выводит выходные данные в файл, указанный в командной строке. Формат файла устанавливается просто путем изменения расширения имени файла (например, quine.jpgдля JPEG и quine.pngдля PNG).

Пример вывода (изображение 2000x20):

Quine output


Вы можете сохранить некоторые символы, используя 2e3вместо 2000.
Кая

@ Кайя: Нет, я не могу, к сожалению: 2e3это floatи Image.newтребует intс.
nneonneo

о беспокойство, я предполагал, что это будет принуждено.
Кая
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.