Wyświetl obraz swojego kodu źródłowego (niezupełnie Quine)


29

Code golf: Wydrukuj obraz kodu źródłowego.

Wymagania

  1. Musi wyświetlać obraz samego kodu źródłowego, a nie wersję przechowywaną gdzie indziej i pobieraną w czasie wykonywania.
  2. Kod musi być wystarczająco czytelny, aby można go było skopiować ręcznie i odtworzyć wyniki.

Obowiązuje dowolny format obrazu.

Bonusy

  • -10% twojego wyniku, jeśli zezwolisz na więcej niż jeden format wyjściowy.
  • -15%, jeśli twój kod jest również „prawdziwą” quine. tzn. nie czyta kodu źródłowego, ale kod źródłowy jest osadzony (patrz tutaj przykład)
  • -30%, jeśli twój kod jest ścisłym quine - tj. Obraz kodu jest osadzony w programie (rozwiązania Piet, patrzę na ciebie.)

Czy to musi być czytelne?
Tim Seguine,

7
„Musi wyświetlać sam obraz kodu, a nie zapisaną wersję z innego miejsca.” Czy jest dozwolone i / lub wymagane, aby odczytać plik kodu źródłowego?
Tim Seguine

29
Właśnie wdrożyłem rozwiązanie w białych znakach. Powstały obraz wygląda dość nudno.
Howard

7
Oto interesujący obrazek napisany w Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Odpowiedzi:


25

muszla

Przez „Wydrukuj obraz kodu źródłowego” zakładam, że rzeczywiście wydrukowanie obrazu na papierze byłoby dopuszczalne.

#!/bin/sh
lpr $0


14

PHP - 487 × 0,9 × 0,85 = 372,555 (2000 × 99px)

<?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");

Jeśli ostrzeżenia są poprawne: 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);

Podajesz funkcję wyjściową, która ma być używana jako pierwszy argument wiersza poleceń:

php timwolla.php imagepng

Rozwiązanie z ostrzeżeniami:


5
Myślę, że to pierwsza rzeczywista quine, a nie tylko skrypt czyta własny kod źródłowy lub po prostu robi zrzut ekranu.
nitro2k01

Dwa pytania, czy możesz użyć innej notacji dziesiętnej? To jest trochę mylące. Również dlaczego obraz jest tak mały? Trudno to odczytać (co prawda rozmawiam przez telefon)
Pureferret

2
@Pureferret po prostu to powiększa. Jest właściwie całkiem czytelny, mimo że jest pikselowany.
Ruslan

1
@Pureferret Właśnie je zmieniłem, nigdy nie pamiętam, żeby było inaczej po angielsku…
TimWolla,

13

Biała spacja, 125



















Wysyła plik obrazu w formacie PBM .

Jeśli testujesz ten kod, skopiuj go, klikając „Edytuj” i kopiując wszystko między <pre>tagami.

Wydajność:

P1 1 1 0

7
kopiuje ręcznie, mrużąc oczy na ekranie, aby zobaczyć subtelne różnice między spacjami i tabulatorami .... uruchamia program .... dysk twardy eksploduje
Jonathan Van Matre

17
Ta odpowiedź nie spełnia wymagania 2. Obraz nie jest wystarczająco czytelny, aby odtworzyć kod źródłowy.
user2357112 obsługuje Monikę

2
@ user2357112 Ale nie możesz tego udowodnić. To luka, którą tu wykorzystuję.
duci9y

21
Tak, mogę, używając teorii informacji. W pełni rygorystyczne uzasadnienie wykraczałoby poza zakres komentarza złożonego z 600 znaków, ale jego sedno polega na tym, że obraz jest identyczny z obrazem kodu, który nie działa.
user2357112 obsługuje Monikę

3
Wybaczcie Francuzom, ale BS! Reguły stanowią, że kod musi być czytelny. Pisanie kodu w Whitespace tego nie neguje. To jest twój program pokazany w Sublime Text, gdy jest wybrany: i.imgur.com/A2ZaQwI.png To jest czytelne. Cokolwiek twój program nie generuje. Poza tym nie wyjaśniłeś, czy to, co program generuje, jest faktycznie kodem źródłowym, czy po prostu dosłownie pusty obraz.
nitro2k01

13

Mathematica, 37 31 znaków

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

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

wprowadź opis zdjęcia tutaj

Zainspirowany odpowiedzią na mathematica.stackexchange.com .


Wyjaśnij to ... po co są #n? Może uda nam się to rozgryźć.
Pureferret,

Przynajmniej działa bez FrontEnd. (Próbowałem Export["/tmp/out.png",%]po uruchomieniu tego polecenia)
Ruslan

2
@Pureferret #noznacza nargument funkcji czystej (utworzonej w &punkcie). Całe wyrażenie rozszerza się na Rasterize[Defer[#0[Defer,Rasterize]]], gdzie #0jest rekurencyjne wywołanie pierwotnej czystej funkcji. W pewnym sensie nie jest to ścisły quine, ale nie wymaga nakładki do działania, a IMO jest dobrym rozwiązaniem.
Ruslan,

Podziwiam użycie Defer [] i Rasterize [] zarówno jako poleceń, jak i przedmiotu poleceń. Nigdy wcześniej nie widziałem takiej rekurencji.
Michael Stern,

10

AppleScript, 68 37

W porządku, jeśli możesz wywołać ImageMagick w Zsh, to również jest poprawne. Nadal hackuję coś bardziej eleganckiego i ducha quine dla mojej własnej satysfakcji, ale dla czystej golfisty, oto:

Nowa wersja

do shell script "screencapture q.jpg"

Stara wersja

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

Wyobrażam sobie, że nadal będzie to pobity, ale stary, pełen języka AppleScript robi godną podziwu imitację zwięzłości.

zatrzymaj swój quine

do shell script "screencapture -c"

3
Myślę, że quine z definicji wytwarza swój kod źródłowy jako jedyne wyjście, ale nie jestem pewien, czy powinno to dotyczyć tego pytania. nyx.net/~gthompso/quine.htm
duci9y

Tak, właściwie próbuję wymyślić, jak sprawić, by wybrał tylko obszar kodu własnego okna, ale pomyślałem, że pójdę dalej i rzucę to, aby umieścić moją flagę na terytorium AppleScript.
Jonathan Van Matre

Uważam to za słuszne i oczekiwałem czegoś takiego.
Pureferret,

Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

3
Z technicznego punktu widzenia żaden z nich nie może być ścisłym quine, z wyjątkiem odpowiedzi Piet, ponieważ żaden z tych języków nie przyjmuje obrazów jako kodu źródłowego. Ale nadal jestem zdeterminowany, by stworzyć bardziej ostrzejszą wersję mojej. :)
Jonathan Van Matre

8

Mathematica, 83

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

wprowadź opis zdjęcia tutaj


1
Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

1
Nie działa bez nakładki (w mathlub MathKernel), nawet w przypadku <<JavaGraphics`importu.
Ruslan

8

Sh, X i ImageMagick 18.9:

 import -window root a.jpg

Powinno to działać w dowolnej powłoce, która ma ImageMagick.

Aby wydrukować tylko kod poprzedzający, clear &&pojawia się w 26.1

clear && import -window root a.jpg

Przykładowe dane wyjściowe:

wprowadź opis zdjęcia tutaj


Testowany na moim komputerze działa.
user12205,

4
Nie działało dla mnie na konsoli Linux . Możesz dodać X do wymagań.
Ilmari Karonen

2
Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

1
@nitro Być może źle użyłem terminu „Quine”, ale w pierwszym wierszu mojego postu wspomniano tylko o wyprowadzeniu obrazu kodu źródłowego. Teraz edytuję, aby wyjaśnić moje pierwotne zamiary, a także aby skorzystać z prawdziwych / ścisłych wskazówek.
Pureferret,

1
Po prostu ciekawy, widzę portfele bitcoin i litecoin; Teraz ~ 3 lata później, jakieś poważne zyski? : D
Albert Renshaw,

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>

Demo: http://jsfiddle.net/E2738/2/

Możesz kliknąć obraz prawym przyciskiem myszy i zapisać go jako PNG


2
kończy się na<//script>
Nie że Charles

1
na końcu linii 11 w skrzypcach zmień +wrapText+"<//script>";na+wrapText+"<\/script>";
Łukasz

@Charles Dzięki za zwrócenie na to uwagi. Naprawiony.
Clyde Lobo,

4

Java, 570 - 10% - 15% = 427,5

(„ścieżka pliku” w zestawie), 554 - 10% - 15% = 415,5 („ścieżka pliku” nie jest wliczony)
Podziękowania dla Andreasa za usunięcie BufferedImagewjava.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"));}}

Wydajność:wprowadź opis zdjęcia tutaj

Aby wyświetlić poprawnie, zobacz ten link: http://i.stack.imgur.com/RRSDw.png

Działa to tak jak zwykły quine, z tą różnicą, że wysyła obraz. Obecny format jest png, ale format można łatwo zmienić, zastępując wszystkie wystąpienia pngprogramu dowolnym formatem.

W przeciwieństwie do kilku odpowiedzi tutaj jest to prawdziwy quine; brak odczytu pliku programu.


możesz pozbyć się kolejnych 24 znaków, jeśli zamienisz oba „java.awt.image.BufferedImage” na „java.awt.image. *”
Andreas

4

JavaScript + JQuery 153 148

Regularny

(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>

Grał w golfa

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
Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

$? czy używasz również jQuery?
Clyde Lobo,

@ClydeLobo Tak, wygląda na to, że jest. Zaraz, możesz robić Javascript bez JQuery? Kto by pomyślał!
Pierre Arlaud,

@ClydeLobo Tak, jestem. Ale biblioteki powinny być dozwolone. To naprawdę nie różni się od programu C używającego stdio.hxD. Pisanie programu bez jQuery jest jednak łatwe. Wystarczy wymienić $('<canvas/>')[0]z document.createElement('canvas')i $('body').appendz document.write. jQuery zapisał mi bajty.
aebabis

3

zsh, 57 × 0,9 = 51,3

Przekaż wyjściową nazwę pliku jako argument.

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

Produkuje:

Przykładowe dane wyjściowe


1
czy to zsh czy imagemagick?
Kaya

@Kaya: Cóż, oba. Językiem jest zsh (lub bash, ale nie jest to Posix), a biblioteką / narzędziem jest ImageMagick (lub GraphicsMagick, jeśli wolisz) - jak PHP z GD lub Ruby z RMagick.
Ry-

1
@Pureferret: Dodano.
Ry-

Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

3

C99 (przy użyciu SDL i 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});}
)

Jest to dość brzydkie bez kolejnych podziałów linii, ale niestety muszą być nieobecne. Funkcja renderowania tekstu w ogóle nie wykrywa znaków kontrolnych, więc wszelkie podziały wiersza w kodzie muszą być renderowane ręcznie na wyjściu.

Oto ten sam kod, ale z pewnymi dodatkowymi podziałami linii dla czytelności:

#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});}
)

Niestety nie powoduje to również podziału linii na wynik graficzny:

wydajność

Wyjście jest nadal czytelne, choć przy 9-punktowym wydruku i czerwonym kolorze czcionki jest nieco zwięzłe. Możesz go ulepszyć kosztem postaci, zastępując 912. (Należy zauważyć, że wymiar wynikowego obrazu jest zakodowany na stałe do 2048 x 80. Aby uwzględnić różnice w różnych czcionkach, dodano odpowiedni nadmiar do prawego marginesu i na początku, na tyle, że czcionka o rozmiarze 12 powinna nadal wygodnie pasować Jeśli jednak chcesz go zwiększyć, wymiary prawdopodobnie będą również musiały zostać zmienione).

Polecenie do zbudowania programu to:

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

Program zakłada, że q.ttfpo uruchomieniu plik czcionki jest wywoływany w bieżącym katalogu. Zadbałem o to wcześniej, uruchamiając następującą komendę (która powinna działać na większości współczesnych Linuksów):

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

(Zamiast tego możesz zaimportować swoją ulubioną czcionkę TrueType.)

Po uruchomieniu programu obraz wyjściowy zostanie utworzony w bieżącym katalogu, w pliku o nazwie q.bmp. Niestety pliki bitmapowe systemu Windows są jedynym formatem wyjściowym udostępnianym przez ten program. Dodanie większej liczby formatów wyjściowych wymagałoby łączenia w większej liczbie bibliotek.

Zauważ, że ten program wykorzystuje składnię C99 do wprowadzania nieprostych wartości literalnych, co znacznie zmniejsza liczbę zmiennych, które należy zdefiniować. Jest to coś, z czego powinno skorzystać więcej golfistów C.


2

C # - 498 - 15% = 423,3

To może być bardziej golfa. Nigdy wcześniej nie robiłem quinesów ani tego rodzaju grafiki w 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);}}

Wydajność: wprowadź opis zdjęcia tutaj

Dodanie obsługi innego formatu byłoby łatwe. Nie jestem jednak pewien, czy warto.


2

Ruby, 104 znaki

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

Przykładowe dane wyjściowe na żądanie: i.imgur.com/jMC594C.png


Czy masz przykładowy wynik?
Pureferret,

@Pureferret patrz edycja
Shelvacu

1
Nie jest to ścisły quine. (Nie programowo generuje własnego kodu źródłowego.)
nitro2k01

1

Python: 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])

Stosowanie:

python imgquine.py quine.jpg

To jest prawdziwa quine, która zwraca dane wyjściowe do pliku określonego w wierszu poleceń. Format pliku ustawia się po prostu przez zmianę rozszerzenia nazwy pliku (np. quine.jpgDla JPEG i quine.pngPNG).

Przykładowe dane wyjściowe (obraz 2000 x 20):

Moc wyjściowa


Możesz zapisać niektóre znaki, używając 2e3zamiast 2000.
Kaya

@Kaya: Nie, niestety nie mogę: 2e3jest floati Image.newwymaga ints.
nneonneo

och, przeszkadza, przyjąłem, że to będzie wymuszone.
Kaya
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.