Kaynak kodunuzun bir görüntüsünü çıktılar (oldukça-bir-Quine değil)


29

Code golf: Kaynak kodunun bir görüntüsünü yazdırın.

Gereksinimler

  1. Kaynak kodun görüntüsünü, başka bir yerde saklanan ve çalışma zamanında alınan bir sürümle göstermemelidir.
  2. Kod elle kopyalanacak ve sonuçları yeniden oluşturacak kadar okunaklı olmalıdır.

Herhangi bir görüntü formatı uygulanabilir.

Bonuslar

  • Birden fazla çıktı formatına izin veriyorsanız puanınızın% -10'u.
  • -15%, eğer kodunuz aynı zamanda 'true' quine ise. yani kaynak kodunu okumuyor ancak kaynak kodu gömülü ( örneğin, buraya bakınız )
  • -30% Eğer kodunuz katı bir quine ise - yani kodun görüntüsü programa dahil edilmiştir (Piet çözümleri, sana bakıyorum.).

Okunabilir olmak zorunda mı?
Tim Seguine

7
"Başka bir yerden kaydedilmiş bir sürüm değil, kod görüntüsünün kendisini çıkarması gerekir." Kaynak kod dosyasını okumak için izin var mı ve / veya gerekli mi?
Tim Seguine

29
Az önce boşlukta bir çözüm uyguladım. Ortaya çıkan görüntü oldukça sıkıcı görünüyor.
Howard

7
İşte Piet ile yazılmış ilginç bir resim yazı tipi: mamememo.blogspot.be/2009/10/piet-quine.html
ProgramFOX

Yanıtlar:


25

kabuk

"Kaynak kodun bir görüntüsünü yazdır" ile, bir resmi kağıda yazdırmanın kabul edilebilir olacağını varsayıyorum.

#!/bin/sh
lpr $0


14

PHP - 487 × 0.9 × 0.85 = 372.555 (2000x99px)

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

Uyarılar uygunsa: 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);

İlk komut satırı argümanı olarak kullanılacak çıktı işlevini sağlarsınız:

php timwolla.php imagepng

Uyarılarla çözüm:


5
Sanırım bu ilk gerçek sorgu ve sadece bir senaryo kendi kaynak kodunu okumuyor veya sadece ekran görüntüsünü alıyor.
nitro2k01

İki soru, ondalık sayılarınız için farklı bir gösterim kullanabilir misiniz? Hafifçe kafa karıştırıcı. Ayrıca görüntü neden bu kadar küçük? Okumak zor (kuşkusuz ben telefondayım)
Pureferret

2
@Pureferret sadece yakınlaştırır. Pikselleştirilmesine rağmen aslında oldukça okunur.
Ruslan

1
@Pureferret Sadece onları değiştirdim, ingilizcede farklı olduğunu asla hatırlamıyorum…
TimWolla

13

Boşluk, 125



















Pbm biçiminde bir görüntü dosyası çıkarır .

Bu kodu test ediyorsanız, lütfen "Düzenle" yi tıklayarak kopyalayın ve <pre>etiketler arasındaki her şeyi kopyalayın .

Çıktı:

P1 1 1 0

7
ekranından kurtararak elle kopya, boşluklar ve sekmeler arasındaki ince farkları görmek için .... ishal programı .... sabit disk patlar
Jonathan Van Matre

17
Bu cevap şart 2'yi karşılamıyor. Resim kaynak kodunu çoğaltmak için yeterince okunamıyor.
user2357112

2
@ user2357112 Ama bunu kanıtlayamazsınız. Burada sömürdüğüm boşluk bu.
duci9y

21
Evet, bilgi teorisini kullanarak yapabilirim. Tamamen titiz bir gerekçe 600 karakterlik bir yorumun kapsamının ötesinde olacaktır, ancak bunun asıl amacı görüntünüzün çalışmayan bir kod görüntüsüyle aynı olmasıdır.
user2357112 18

3
Afedersiniz, ama bs! Kurallar, kodun okunaklı olması gerektiğini belirtir. Boşlukta kod yazmak bunu ihmal etmez. Bu, seçildiğinde Sublime Text'de gösterilen programınızdır: i.imgur.com/A2ZaQwI.png Bu okunur. Programın çıktısı ne olursa olsun. Ayrıca, programınızın çıktılarının aslında kaynak kodunuz mu yoksa tam anlamıyla boş bir resim mi olduğunu açıklamamışsınızdır.
nitro2k01

13

Mathematica, 37 31 karakter

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

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

görüntü tanımını buraya girin

Mathematica.stackexchange.com adresindeki bir cevaptan ilham almıştır .


Açıkla ... #n ne için? Belki çözebiliriz.
Pureferret

En azından FrontEnd olmadan çalışıyor. ( Export["/tmp/out.png",%]Bu komutu çalıştırdıktan sonra
Ruslan

2
@Pureferret saf bir fonksiyonun argümanı ( noktada yaratılmış ) #nanlamına gelir . Bütün ekspresyon genişler burada, orjinal olarak saf fonksiyonunun yinelemeli bir çağrıdır. Bir bakıma, bu kesin bir sorgu değil, fakat çalışmak için herhangi bir ön uç gerektirmiyor ve IMO iyi bir çözüm. n&Rasterize[Defer[#0[Defer,Rasterize]]]#0
Ruslan

Defer [] ve Rasterize [] 'in hem komutlar hem de komutların nesnesi olarak kullanılmasına hayranım. Daha önce bu şekilde sunulan özyineleme görmemiştim.
Michael Stern

10

AppleScript, 68 37

Tamam, ImageMagick'i zsh ile çağırabilirseniz, bu da geçerlidir. Hala kendi tatmim için daha zarif ve quine-ruhu olan bir şeyi hackledim, fakat saf golf için, işte biz:

Yeni sürüm

do shell script "screencapture q.jpg"

Eski versiyon

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

Bunun hala yenileceğini hayal ediyorum, ancak çok eski AppleScript bunun için takdire şayan bir taklit yapıyor.

kes sesini

do shell script "screencapture -c"

3
Sanırım bir quine, tanımı gereği kaynak kodunu tek çıktısı olarak üretiyor , ancak bu soru için geçerli olup olmadığından emin değil. nyx.net/~gthompso/quine.htm
duci9y

Evet, aslında kendi penceresinin sadece kod alanını seçmeye nasıl karar vereceğimi bulmaya çalışıyorum, ancak devam edeceğim ve bayrağımı AppleScript bölgesine yerleştirmek için bunu fırlatacağımı düşündüm.
Jonathan Van Matre

Bunu geçerli olarak düşünüyorum ve böyle bir şey bekliyordum.
Pureferret

Sıkı bir değil. (Programlı bir şekilde kendi kaynak kodunu oluşturmaz.)
nitro2k01 06.03.2016

3
Teknik olarak, bunlardan hiçbiri Piet cevabı dışında katı quine olamaz çünkü bu dillerden hiçbiri görüntüleri kaynak kod olarak çekmez. Ama hala daha katı bir versiyonumu yapmaya kararlıyım. :)
Jonathan Van Matre

8

Mathematica, 83

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

görüntü tanımını buraya girin


1
Sıkı bir değil. (Programlı bir şekilde kendi kaynak kodunu oluşturmaz.)
nitro2k01 6.03.2014

1
Ön uç olmadan (içinde mathveya içinde MathKernel), <<JavaGraphics`ithal olsa bile çalışmaz .
Ruslan

8

Sh, X ve ImageMagick 18.9:

 import -window root a.jpg

Bu ImageMagick olan herhangi bir kabukta çalışması gerekir.

Sadece ön kod yazdırmak için clear &&bu 26.1 de çıkıyor

clear && import -window root a.jpg

Örnek çıktı:

görüntü tanımını buraya girin


Bilgisayarımda test edildi, çalışıyor.
user12205,

4
Benim için Linux konsolunda çalışmadı . Gereksinimlere X eklemek isteyebilirsiniz .
Ilmari Karonen

2
Sıkı bir değil. (Programlı olarak kendi kaynak kodunu oluşturmaz.)
nitro2k01 6.03.2014

1
@nitro 'Quine' terimini kötüye kullanmış olabilirim, ancak yazımın ilk satırı yalnızca kaynak kodun bir görüntüsünü vermekten bahsediyor. Şimdi asıl amacımı açıklığa kavuşturmak ve ayrıca gerçek / kesin sorgulara erişmek için düzenleme yapıyorum.
Pureferret

1
Sadece merak ediyorum, bitcoin ve litecoin cüzdanları görüyorum; Şimdi ~ 3 yıl sonra, ciddi bir kazanım var mı? : 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>

Gösteri: http://jsfiddle.net/E2738/2/

Bir resmin üzerine sağ tıklayıp bir PNG olarak kaydedebilirsiniz


2
ile biter<//script>
Charles

1
keman değişimde hattının 11 yılı sonunda +wrapText+"<//script>";kadar+wrapText+"<\/script>";
Luke

@Charles Buna dikkat çektiğin için teşekkürler. Sabit.
Clyde Lobo

4

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

= 415.5 (dahil değildir "filepath")% 15 - ( "filepath" dahil), 554-10%
çıkarılması için Andreas sayesinde BufferedImageolarakjava.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"));}}

Çıktı:görüntü tanımını buraya girin

Düzgün görüntülemek için bu bağlantıya bakın: http://i.stack.imgur.com/RRSDw.png

Bu, bir görüntüye çıkışı dışında, normal bir quine gibi çalışır. Geçerli format png, ancak pngprogramdaki tüm örnekleri istediğiniz format ile değiştirerek format kolayca değiştirilebilir .

Buradaki birkaç cevabın aksine, bu gerçek bir yalın; program dosyasını okumam.


"java.awt.image.BufferedImage" 'ı "java.awt.image. *" ile değiştirirseniz, başka bir 24 karakterden kurtulabilirsiniz.
Andreas

4

Javascript + JQuery 153 148

Düzenli

(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
Sıkı bir değil. (Programlı bir şekilde kendi kaynak kodunu oluşturmaz.)
nitro2k01 06.03.2016

$? jQuery de kullanıyor musunuz?
Clyde Lobo

@ClydeLobo Yup, öyle görünüyor. JQuery olmadan Javascript yapabilir misin? Kim düşünebilirdi!
Pierre Arlaud

@ClydeLobo Evet öyleyim. Ancak kütüphanelere izin verilmelidir. Gerçekten de stdio.hxD kullanan bir C programından farklı değil . Programın jQuery olmadan yazılması kolaydır. Sadece yerini $('<canvas/>')[0]ile document.createElement('canvas')ve $('body').appendile document.write. jQuery beni bayt kurtardı.
aebabis

3

zsh, 57 × 0.9 = 51.3

Çıktı dosya adını argüman olarak iletin.

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

üretir:

Örnek çıktı


1
Bu zsh mı yoksa imagemagick mi?
Kaya

@Kaya: Her ikisi de. Dil zsh (ya da bash, ancak Posix değil) ve kütüphane / araç ImageMagick (ya da eğer istersen GraphicsMagick) - GD ile PHP veya RMagick ile Ruby gibi.
Ry -

1
@Pureferret: Eklendi.
Ry -

Sıkı bir değil. (Programlı bir şekilde kendi kaynak kodunu oluşturmaz.)
nitro2k01 06.03.2016

3

C99 (SDL ve SDL_ttf kullanılarak), 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});}
)

Bu, daha fazla satır kesmesi olmadan oldukça çirkin, fakat ne yazık ki yok olmaları gerekiyor. Metin oluşturma işlevi kontrol karakterlerini hiç doldurmaz, bu nedenle koddaki satır sonları çıktıda manuel olarak oluşturulmalıdır.

İşte aynı kod, ancak okunabilirlik için atılan bazı ekstra satır sonları ile:

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

Ne yazık ki, bu grafik çıktısına satır kesmeleri de eklemiyor:

çıktı

Çıktı hala okunaklı, ancak 9 nokta çıktı ve kırmızı yazı tipi rengiyle biraz sivri. Sen değiştirerek bir karakter pahasına bunu artırabilir 9ile 12. (Elde edilen görüntünün boyutunun 2048x80'e kodlanmış olduğunu unutmayın. Çeşitli yazı tiplerindeki farklılıkları karşılamak için, sağ kenar boşluğuna ve satır başlığına adil bir miktar fazlalık eklendi, böylece bir boyut-12 yazı tipi hala rahatça sığacak kadar Ancak, onu daha da artırmak istiyorsanız, boyutların da muhtemelen değişmesi gerekecektir.)

Programı oluşturma komutu:

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

Program q.ttf, çalıştırıldığında geçerli dizinde adı verilen bir font dosyası olduğunu varsayar . Bunu daha önce aşağıdaki komutu çalıştırarak (çoğu modern Linux'ta çalışması gerekir) yürüttüm:

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

(Bunun yerine kendi favori TrueType yazı tipinizi almaktan çekinmeyin.)

Programı çalıştırdıktan sonra, görüntü çıktısı geçerli dizinde, adlandırılmış bir dosyada oluşturulur q.bmp. Ne yazık ki Windows bitmap dosyaları bu programın sağladığı tek çıktı biçimidir. Daha fazla çıktı biçimi eklemek, daha fazla kütüphanede bağlantı kurmayı gerektirir.

Bu programın basit olmayan değişmez değerleri tanıtmak için C99'un sözdiziminden faydalandığını ve böylece tanımlanması gereken değişken sayısını önemli ölçüde azalttığını unutmayın. Bu daha C golfçülerinin yararlanabileceği bir şey.


2

C # - 498 -% 15 = 423.3

Bu muhtemelen daha çok golf oynayabilir. Daha önce hiç C # 'ta kuyruğu ya da böyle bir grafik yapmamıştım:

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

Çıktı: görüntü tanımını buraya girin

Farklı bir format desteği eklemek kolay olurdu. Buna değip değmeyeceğinden emin değilim.



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

Kullanımı:

python imgquine.py quine.jpg

Bu, çıktıyı komut satırında belirtilen dosyaya çeken gerçek bir sorundur. Dosya formatı sadece dosya adı uzantısını değiştirerek ayarlanır (örneğin quine.jpgbir JPEG ve quine.pngPNG için).

Örnek çıktı (2000x20 görüntü):

Quine çıkışı


Bunun 2e3yerine bazı karakterleri kaydedebilirsiniz 2000.
Kaya

@Kaya: Hayır, yapamam, maalesef: 2e3a floatve Image.newtalep ediyor int.
nneonneo

Ah, canım, zorlanacağını varsaydım.
Kaya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.