Виведіть зображення свого вихідного коду (не дуже-а-Quine)


29

Код гольфу: друк зображення вихідного коду.

Вимоги

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

Будь-який формат зображення застосовується.

Бонуси

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

Чи повинен він бути розбірливим?
Тім Сегейн

7
"Потрібно вивести саме зображення коду, а не збережену версію з іншого місця." Чи дозволено та / або потрібно читати файл вихідного коду?
Тім Сегуїн

29
Я щойно реалізував рішення в області пробілів. Отримане зображення виглядає досить нудно.
Говард

7
Ось цікава картина-квінка, написана на Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Відповіді:


25

оболонки

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

#!/bin/sh
lpr $0

21

7
Не могли б ви відповісти вікі на цю відповідь? Це стало нашою стандартною політикою щодо відповідей із зовнішніми джерелами. Це дійсно круто, хоча!
Джонатан Ван Матре

@JonathanVanMatre Whoops, вибачте. Це я мав намір зробити. Я думаю, я не повинен намагатися відповідати на питання під час участі в іншій дискусії .
Хлопець з капелюхом

Це нижній з двох. -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 підтримує Моніку

2
@ user2357112 Але ви не можете цього довести. Це лазівка, яку я тут експлуатую.
duci9y

21
Так, я можу, використовуючи теорію інформації. Повністю жорстке обгрунтування виходитиме за рамки коментаря в 600 символів, але суть його полягає в тому, що ваше зображення тотожне зображенню коду, який не працює.
user2357112 підтримує Моніку

3
Пробачте французів, але BS! У правилах зазначено, що код повинен бути розбірливим. Введення коду в Whitespace цього не заперечує. Це ваша програма, яка відображається в піднесеному тексті, коли вибрано: i.imgur.com/A2ZaQwI.png Це розбірливо. Незалежно від результатів програми. І крім того, ви не пояснили, що ваша програма виводить насправді ваш вихідний код чи просто буквально порожнє зображення.
nitro2k01

13

Математика, 37 31 ряд

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

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

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

Натхненний відповіддю на сайті mateica.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
Я думаю, що quine за визначенням виробляє свій вихідний код як єдиний вихід, але не впевнений, чи має це стосуватися цього питання. nyx.net/~gthompso/quine.htm
duci9y

Так, я насправді намагаюся розібратися, як змусити його вибрати лише область коду власного вікна, але я подумав, що буду рухатись до цього, щоб посадити свій прапор на території AppleScript.
Джонатан Ван Матре

Я вважаю це дійсним і очікував чогось подібного.
Pureferret

Не сувора королева. (Не програмує власний вихідний код.)
nitro2k01

3
Технічно жоден із них не може бути суворим королевою, окрім відповіді Piet, оскільки жодна з цих мов не бере зображення як вихідний код. Але я все-таки налаштований зробити більш сувору версію моєї. :)
Джонатан Ван Матре

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

Вибірка зразка:

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


Тестований на моєму комп’ютері, він працює.
користувач12205

4
Не працював для мене на консолі Linux . Ви можете додати X до вимог.
Ілмарі Каронен

2
Не сувора королева. (Не програмує власний вихідний код.)
nitro2k01

1
@nitro Я, можливо, неправильно використовував термін "Quine", але в першому рядку моєї публікації згадується лише зображення зображення вихідного коду. Зараз я редагую, щоб уточнити свій початковий намір, а також на користь справжнім / суворим лайкам.
Pureferret

1
Просто цікаво, я бачу кошельки bitcoin та 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

( "Шлях до файлу" в комплекті), 554 - 10% - 15% = 415,5 ( "Шлях до файлу" не входить в комплект )
Завдяки Andreas для видалення 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

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

На відміну від кількох відповідей тут, це справжня королева; відсутність читання файлу програми.


ви можете позбутися ще 24 символів, замінивши "java.awt.image.BufferedImage" на "java.awt.image. *"
Андреас

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>

Гольф

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 Yup, здається, він є. Зачекайте, ви можете робити Javascript без JQuery? Хто б міг подумати!
П’єр Арло

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

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.
Ри-

1
@Pureferret: Додано.
Ри-

Не сувора королева. (Не програмує власний вихідний код.)
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. (Зверніть увагу, що розмір отриманого зображення жорстко закодований до 2048х80. Для урахування відмінностей у різних шрифтах до правої межі та провідної частини додано неабиякий надлишок, щоб шрифт розміру-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

Це, ймовірно, може бути більше гольфу. Я ніколи раніше не робив quines або подібну графіку в 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 див. Редагувати
Шельваку

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, який малює вихід у файл, вказаний у командному рядку. Формат файлу встановлюється просто шляхом зміни розширення імені файлу (наприклад, quine.jpgдля JPEG та quine.pngPNG).

Приклад виводу (зображення 2000x20):

Квінте вихід


Ви можете зберегти деякі символи, використовуючи 2e3замість 2000.
Кая

@Kaya: Ні, я, на жаль, не можу: 2e3є float, і Image.newвимагає ints.
nneonneo

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