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 9ją 12. (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.