Keluarkan gambar dari kode sumber Anda (bukan-cukup-Quine)


29

Golf kode: Cetak gambar kode sumber.

Persyaratan

  1. Harus menampilkan gambar kode sumber itu sendiri, bukan versi yang disimpan di tempat lain dan diambil pada saat dijalankan.
  2. Kode harus cukup dapat dibaca untuk disalin dengan tangan dan mereproduksi hasilnya.

Format gambar apa pun berlaku.

Bonus

  • -10% dari skor Anda jika Anda mengizinkan lebih dari satu format output.
  • -15% jika kode Anda juga quine 'benar'. yaitu tidak membaca kode sumbernya tetapi kode sumber disematkan (lihat di sini untuk contoh)
  • -30% jika kode Anda adalah quine ketat - yaitu gambar kode tertanam dalam program (solusi Piet, saya melihat Anda.).

Apakah itu harus terbaca?
Tim Seguine

7
"Harus menampilkan gambar kode itu sendiri, bukan versi yang disimpan dari tempat lain." Apakah diizinkan dan / atau diharuskan membaca file kode sumber?
Tim Seguine

29
Saya baru saja mengimplementasikan solusi di whitespace. Gambar yang dihasilkan terlihat cukup membosankan.
Howard

7
Berikut ini adalah quine gambar menarik yang ditulis dalam Piet: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Jawaban:


25

kulit

Dengan "Cetak gambar kode sumber", saya berasumsi bahwa sebenarnya mencetak gambar di atas kertas dapat diterima.

#!/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");

Jika peringatan baik-baik saja: 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);

Anda menyediakan fungsi output untuk digunakan sebagai argumen baris perintah pertama:

php timwolla.php imagepng

Solusi dengan peringatan:


5
Saya pikir ini adalah quine aktual pertama dan bukan hanya skrip membaca kode sumbernya sendiri, atau hanya mengambil tangkapan layar sendiri.
nitro2k01

Dua pertanyaan, dapatkah Anda menggunakan notasi yang berbeda untuk desimal Anda? Agak membingungkan. Juga mengapa gambarnya sangat kecil? Sulit dibaca (harus diakui saya menggunakan ponsel saya)
Pureferret

2
@ Pureferret hanya memperbesarnya. Ini sebenarnya cukup mudah dibaca meskipun sedang di pixelized.
Ruslan

1
@ Pureferret Baru saja mengubah mereka, saya tidak pernah ingat itu berbeda dalam bahasa Inggris ...
TimWolla

13

Spasi, 125



















Keluarkan file gambar dalam format pbm .

Jika Anda menguji kode ini, harap salin dengan mengklik "Edit", dan menyalin semua di antara <pre>tag.

Keluaran:

P1 1 1 0

7
salinan dengan tangan, menyipit di layar untuk melihat perbedaan halus antara spasi dan tab .... menjalankan program .... hard drive meledak
Jonathan Van Matre

17
Jawaban ini tidak memenuhi persyaratan 2. Gambar tidak cukup dapat dibaca untuk mereproduksi kode sumber.
user2357112 mendukung Monica

2
@ user2357112 Tapi Anda tidak bisa membuktikannya. Itulah celah yang saya manfaatkan di sini.
duci9y

21
Ya saya bisa, menggunakan teori informasi. Sebuah pembenaran yang sangat ketat akan berada di luar lingkup komentar 600 karakter, tetapi intinya adalah bahwa gambar Anda identik dengan gambar kode yang tidak berfungsi.
user2357112 mendukung Monica

3
Maafkan orang Prancis, tapi BS! Aturan menyatakan bahwa kode harus dapat dibaca. Menulis kode di Whitespace tidak meniadakan hal itu. Ini adalah program Anda yang diperlihatkan dalam Teks Sublim, ketika dipilih: i.imgur.com/A2ZaQwI.png Ini terbaca. Apapun output program Anda tidak. Dan selain itu, Anda belum menjelaskan apakah apa yang dihasilkan oleh program Anda sebenarnya adalah kode sumber Anda atau hanya gambar kosong.
nitro2k01

13

Mathematica, 37 31 karakter

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

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

masukkan deskripsi gambar di sini

Terinspirasi oleh jawaban di Mathematica.stackexchange.com .


Jelaskan ... untuk apa #nnya? Mungkin kita bisa mengetahuinya.
Pureferret

Setidaknya itu berfungsi tanpa FrontEnd. (Dicoba dengan Export["/tmp/out.png",%]setelah menjalankan perintah ini)
Ruslan

2
@ Pureferret #nberarti nargumen fungsi murni (dibuat pada saat &itu). Seluruh ekspresi diperluas ke Rasterize[Defer[#0[Defer,Rasterize]]], di mana #0panggilan rekursif dari fungsi murni asli. Di satu sisi, ini bukan quine yang ketat, tetapi tidak perlu antarmuka untuk bekerja, dan IMO solusi yang bagus.
Ruslan

Saya mengagumi penggunaan Tunda [] dan Rasterisasi [] sebagai perintah dan objek perintah. Saya belum pernah melihat rekursi yang disajikan seperti ini sebelumnya.
Michael Stern

10

AppleScript, 68 37

Baiklah, jika Anda dapat memanggil ImageMagick di zsh maka ini juga valid. Saya masih meretas sesuatu yang lebih elegan dan of-the-quine-spirit untuk kepuasan saya sendiri, tetapi untuk golfiness murni, di sini kita:

Versi baru

do shell script "screencapture q.jpg"

Versi lama

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

Saya membayangkan ini masih akan dipukuli, tetapi AppleScript lama yang verbose melakukan tiruan dari kejelasan yang mengagumkan untuk yang satu ini.

hentikan quine Anda

do shell script "screencapture -c"

3
Saya pikir quine, menurut definisi, menghasilkan kode sumbernya sebagai satu - satunya output, tetapi tidak yakin apakah itu berlaku untuk pertanyaan ini. nyx.net/~gthompso/quine.htm
duci9y

Ya, saya sebenarnya mencoba mencari cara untuk memilihnya hanya dengan memilih area kode dari jendelanya sendiri, tetapi saya pikir saya akan terus maju dan melempar ini untuk menanam bendera saya di wilayah AppleScript.
Jonathan Van Matre

Saya menganggap ini sebagai valid dan mengharapkan sesuatu seperti ini.
Pureferret

Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
nitro2k01

3
Secara teknis, tak satu pun dari ini bisa menjadi quines ketat kecuali jawaban Piet, karena tidak satu pun dari bahasa-bahasa ini mengambil gambar sebagai kode sumber. Tapi saya masih bertekad untuk membuat versi saya yang lebih ketat. :)
Jonathan Van Matre

8

Mathematica, 83

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

masukkan deskripsi gambar di sini


1
Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
nitro2k01

1
Tidak berfungsi tanpa frontend (dalam mathatau MathKernel), bahkan dengan <<JavaGraphics`impor.
Ruslan

8

Sh, X & ImageMagick 18.9:

 import -window root a.jpg

Ini harus bekerja di shell yang memiliki ImageMagick.

Untuk mencetak hanya kode yang didahului clear &&ini keluar pada 26.1

clear && import -window root a.jpg

Output sampel:

masukkan deskripsi gambar di sini


Diuji di komputer saya, itu berhasil.
user12205

4
Tidak bekerja untuk saya di konsol Linux . Anda mungkin ingin menambahkan X ke persyaratan.
Ilmari Karonen

2
Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
nitro2k01

1
@nitro Saya mungkin telah menyalahgunakan istilah 'Quine' tetapi baris pertama dari posting saya hanya menyebutkan keluaran gambar kode sumber. Saya mengedit sekarang untuk memperjelas maksud asli saya, dan juga untuk mendapatkan quine benar / ketat.
Pureferret

1
Hanya ingin tahu, saya melihat dompet bitcoin dan litecoin; Sekarang ~ 3 tahun kemudian, ada keuntungan serius? : 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/

Orang dapat mengklik kanan pada gambar dan menyimpannya sebagai PNG


2
berakhir dengan<//script>
Bukan berarti Charles

1
pada akhir baris 11 dalam perubahan biola +wrapText+"<//script>";ke+wrapText+"<\/script>";
Luke

@ Charles Terima kasih telah menunjukkan itu. Tetap.
Clyde Lobo

4

Java, 570 - 10% - 15% = 427.5

( "filepath" termasuk), 554-10% - 15% = 415,5 ( "filepath" tidak termasuk)
Terima kasih kepada Andreas untuk menghapus BufferedImagedijava.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"));}}

Keluaran:masukkan deskripsi gambar di sini

Untuk melihatnya dengan benar, lihat tautan ini: http://i.stack.imgur.com/RRSDw.png

Ini berfungsi seperti quine biasa, kecuali itu output ke gambar. Format saat ini png, tetapi format dapat dengan mudah diubah dengan mengganti semua instance pngdalam program dengan format apa pun yang Anda inginkan.

Tidak seperti beberapa jawaban di sini, ini adalah quine sejati; tidak ada pembacaan file program.


Anda dapat menyingkirkan 24 karakter lain jika Anda mengganti "java.awt.image.BufferedImage" dengan "java.awt.image. *"
Andreas

4

Javascript + JQuery 153 148

Reguler

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

Golf

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
Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
nitro2k01

$? apakah Anda menggunakan jQuery juga ??
Clyde Lobo

@ClydeLobo Yup, sepertinya dia. Tunggu, Anda bisa melakukan Javascript tanpa JQuery? Siapa yang pernah berpikir!
Pierre Arlaud

@ClydeLobo Ya saya. Tapi perpustakaan harus diizinkan. Benar-benar tidak berbeda dari program C yang menggunakan stdio.hxD. Menulis program tanpa jQuery itu mudah. Ganti saja $('<canvas/>')[0]dengan document.createElement('canvas')dan $('body').appenddengan document.write. jQuery menyelamatkan saya byte.
aebabis

3

zsh, 57 × 0,9 = 51,3

Berikan nama file keluaran sebagai argumen.

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

Menghasilkan:

Contoh output


1
apakah itu zsh atau imagemagick?
Kaya

@Kaya: Ya, keduanya. Bahasanya adalah zsh (atau bash, tapi itu bukan Posix), dan pustaka / alat adalah ImageMagick (atau GraphicsMagick, jika Anda suka) - seperti PHP dengan GD atau Ruby dengan RMagick.
Ry-

1
@ Pureferret: Ditambahkan.
Ry-

Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
nitro2k01

3

C99 (menggunakan 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});}
)

Ini sangat jelek tanpa jeda baris lagi, tetapi sayangnya mereka harus absen. Fungsi rendering teks sama sekali tidak mengontrol karakter, jadi setiap jeda baris dalam kode harus diterjemahkan secara manual dalam output.

Berikut kode yang sama tetapi dengan beberapa jeda baris tambahan untuk keterbacaan:

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

Sayangnya, ini juga tidak menambahkan jeda baris ke output grafis:

keluaran

Outputnya masih terbaca, meskipun dengan output 9-point dan warna font merah, agak sedikit menyolok. Anda dapat memperbaikinya dengan mengorbankan karakter dengan mengganti 9dengan 12. (Perhatikan bahwa dimensi gambar yang dihasilkan hardcoded ke 2048x80. Untuk mengakomodasi perbedaan dalam berbagai font, sedikit kelebihan telah ditambahkan ke margin kanan dan depan, cukup sehingga font ukuran-12 harus tetap pas dengan nyaman Jika Anda ingin meningkatkannya lebih jauh, dimensi mungkin perlu diubah juga.)

Perintah untuk membangun program adalah:

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

Program ini mengasumsikan bahwa ada file font yang dipanggil q.ttfdi direktori saat ini ketika dijalankan. Saya menangani hal ini sebelumnya dengan menjalankan perintah berikut (yang seharusnya bekerja pada kebanyakan Linux modern):

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

(Sebaliknya, silakan mengimpor font TrueType favorit Anda sendiri.)

Setelah menjalankan program, output gambar akan dibuat di direktori saat ini, dalam file bernama q.bmp. Sayangnya file bitmap Windows adalah satu-satunya format output yang disediakan oleh program ini. Menambahkan lebih banyak format output akan membutuhkan penautan di lebih banyak perpustakaan.

Perhatikan bahwa program ini memanfaatkan sintaksis C99 untuk memperkenalkan nilai-nilai literal yang tidak sederhana, sehingga secara signifikan mengurangi jumlah variabel yang perlu didefinisikan. Ini adalah sesuatu yang harus dimanfaatkan oleh lebih banyak pegolf C.


2

C # - 498 - 15% = 423.3

Ini mungkin bisa lebih banyak golf. Saya belum pernah melakukan quine atau gambar seperti ini di C # sebelumnya:

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

Keluaran: masukkan deskripsi gambar di sini

Menambahkan dukungan format yang berbeda akan mudah. Tidak yakin apakah itu sepadan.


2

Ruby, 104 karakter

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

Contoh output, per permintaan: i.imgur.com/jMC594C.png


Apakah Anda memiliki contoh output?
Pureferret

@ Pureferret lihat edit
Shelvacu

1
Bukan quine yang ketat. (Tidak secara terprogram menghasilkan kode sumbernya sendiri.)
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])

Pemakaian:

python imgquine.py quine.jpg

Ini adalah quine sejati yang menarik output ke file yang ditentukan pada commandline. Format file diatur hanya dengan mengubah ekstensi nama file (mis. quine.jpgUntuk JPEG dan quine.pnguntuk PNG).

Contoh output (gambar 2000x20):

Output quine


Anda dapat menyimpan beberapa karakter dengan menggunakan 2e3bukan 2000.
Kaya

@Kaya: Tidak, sayangnya, saya tidak bisa: 2e3adalah a float, dan Image.newmenuntut ints.
nneonneo

oh repot, saya berasumsi itu akan dipaksakan.
Kaya
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.