triplegolf - tidak hanya hitungan panjang kode sumber!

15

Tujuan dari tantangan ini adalah untuk menulis sebuah program di mana panjang ketiganya sama persis:

  • panjang kode sumber
  • panjang output yang dicetak ke output standar
  • panjang peringatan kompiler yang dihasilkannya dengan kompiler (tidak diubah) pilihan Anda

Pemenang adalah kode terpendek untuk memenuhi ketiga kriteria, dan harus memiliki setidaknya 1 karakter.

Untuk memperjelas, jika output memiliki kurang dari tiga karakter yang berbeda, ia mendapat penalti 5 poin yang ditambahkan pada panjang masing-masing karakter (jadi +10 jika hanya tipe tunggal, +5 untuk dua).

(Baris baru dihitung sebagai 1 atau 2 karakter, pilihan Anda, tetapi harus konsisten melalui ketiga kriteria. Memimpin dan mengekor spasi putih diabaikan di semua baris dalam ketiga kriteria)

Dalam hal skor yang sama, yang mencetak hasil paling menarik (bukan sampah) adalah pemenangnya.

vsz
sumber
1
Apa itu "tipe karakter"?
Peter Taylor
5
Juga, bagaimana jika kompiler menghasilkan keluaran non-peringatan (mis. "Kompilasi Main")? Juga, bagaimana jika nama file sumber muncul di pesan peringatan (mis. "Foo.c: 1: 1: ...")?
Joey Adams
3
Senjata pilihan saya adalah VBA, yang tidak benar-benar memiliki kompiler dan tidak menghasilkan file biner untuk dijalankan (seperti kasus untuk beberapa bahasa lain, saya percaya). Apakah ada pertimbangan untuk ini, atau apakah saya didiskualifikasi secara default?
Gaffi
2
Saya ingin tahu apakah triple-quine dimungkinkan dalam beberapa bahasa?
Ry-
2
Untuk bahasa yang ditafsirkan, kami mendapatkan hasil bahkan pada saat terjadi kesalahan, dalam kasus seperti itu, apakah kesalahan itu diterima atau hanya peringatan yang diterima?
l0n3sh4rk

Jawaban:

14

Bash, 23 karakter

Kesalahan:

bash: /: Is a directory

Sumber:

echo       $0-$01234;/;

Keluaran:

/bin/bash-/bin/bash1234


Brainf * ck, 32 karakter

Kode ini dijalankan sekitar 3 detik dan berhenti dan menampilkan kesalahan dan keluaran berikut.

Kesalahan:

bff: out of memory (-2058691272)

Sumber:

+++++[......-]..+[>>>>>>>>>>>>-]

Output: (Hexdump)

0505 0505 0505 0404 0404 0404 0303 0303
0303 0202 0202 0202 0101 0101 0101 0000


C, 35 karakter

Peringatan:

b.c:1:30: warning: division by zero

Sumber dan Output:

main(){system("cat "__FILE__)/0;;;}


PHP, 50 karakter

Peringatan:

PHP Warning:  Division by zero in /tmp/3 on line 1

Sumber dan Output:

<?php echo (0/0).''.file_get_contents(__FILE__);?>
l0n3sh4rk
sumber
1
Contoh bash adalah kesalahan, bukan peringatan.
Peter Taylor
Kompiler apa yang Anda gunakan untuk solusi C?
kotak roti
@breadbox gcc versi 4.7.0 20120505 (prerelease) (GCC)
l0n3sh4rk
8

C - 48 karakter

main(i){while(++i<49)putchar(i);putchar('\z');}

Catatan: termasuk baris terakhir (gaya Unix).

Output dari gcc a.cdibaca:

a.c:1:41: warning: unknown escape sequence '\z'

Keluaran dari a.outsebagian besar karakter non-cetak, jadi inilah yang terlihat setelah menyalurkan melalui hexdump:

00000000: 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011  ................
00000010: 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021  .............. !
00000020: 2223 2425 2627 2829 2A2B 2C2D 2E2F 307A  "#$%&'()*+,-./0z
kotak roti
sumber
Pemahaman saya adalah bahwa tidak dapat dicetak (whitepace?) Terpotong, jadi ini tidak akan dihitung. Jika itu berhasil, saya dapat meningkatkan jawaban saya sendiri.
Gaffi
1
Kontrol karakter biasanya tidak dianggap spasi, kecuali tentu saja untuk \ t, \ n, \ r, \ f, dan kadang-kadang \ v. Tak satu pun dari ini berada pada posisi terdepan atau tertinggal, jadi saya pikir saya aman.
kotak roti
1
Saya pikir ini bisa diterima. Mereka bukan whitespace, dan dalam kedua kasus ini bukan ACM yang ketat dengan persyaratan. Alasan utama untuk "aturan spasi" ini adalah bahwa beberapa IDE mungkin memformat output kompiler mereka.
vsz
1
@ copy, Atau main(i){i='\z';while(i-->74)putchar(i);}- tetapi mengurangi ukuran program sebenarnya kontra-produktif.
kotak roti
1
Ini adalah jawaban favorit saya, saya tahu saya seharusnya dilarang mengakses isi file (seperti halnya quines)
vsz
5

JavaScript, 63 66

!function x(){console.log(x+'...');eval(Array(33).join('$'))}()

Outputnya adalah:

function x(){console.log(x+'...');eval(Array(33).join('$'))}...

Di Chrome, kesalahannya adalah:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined
Ry-
sumber
3

Visual Basic .NET, 185

Astaga, vbccukup bertele-tele dengan peringatan kompilasi. Bagaimanapun, kodenya adalah ini:

Public Module Main
    Public Sub Main()
        Console.WriteLine(New String("a"c,185))
    End Sub

    Public Function A()
        'This is actually just padding.
        'Hi
    End Function
End Module

(Perhatikan bahwa itu seharusnya tab, bukan spasi.)

Outputnya adalah ini:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Dan peringatan kompiler adalah ini:

warning BC42105: Function 'A' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

    End Function
    ~~~~~~~~~~~~

(Kali ini, sebenarnya empat spasi, bukan tab.)

Ry-
sumber
3

Zsh , 20 byte

<<<   $-$_$_$_$_$_
[

Masalah yang kita hadapi di sini disinggung dalam komentar di atas: Zsh mencetak nama program di samping nomor baris sebelum setiap kesalahan. Solusi di sini menggunakan nama file satu karakter untuk menyalahgunakan ini. Saya telah membungkusnya dalam skrip pembantu untuk menunjukkan dengan tepat apa yang dicetaknya, dan digunakan wc -cpada stderr, stdout, dan file sumber.

Output: 569Xcatcatcatcatcatdiikuti oleh
kesalahan baris baru : s:[:2: ']' expecteddiikuti oleh baris baru


EDIT: Alternatif solusi 20 byte tanpa batasan file:

<<<$-$-$-$-$_>&1 >&2

Cobalah online!

Zsh , zsh -x, 10 bytes

<<<$_$_$_

-xflag memungkinkan xtrace. Ini lagi membutuhkan nama file karakter tunggal. Cobalah online!

Zsh zsh -JNTwEDY , 12 byte

<<<$->&1 >&2

-flagJawaban terpendek tanpa persyaratan nama file. Atur lebih banyak bendera, dan $-cetak semuanya. Cobalah online!

Fungsi Gamma
sumber
2

JavaScript (Firefox 54), 34 byte

alert((f=function(x)1234)(56)+f+f)

Output:

1234function(x)1234function(x)1234

Dan itu mengirimkan peringatan ini ke konsol browser:

expression closures are deprecated

Sepertinya ini di salinan Firefox Developer Edition (54.0a2) saya. Ini dapat bekerja di versi lain dari Firefox juga.

Produksi ETH
sumber
2

Ruby, 48 karakter

IO=1;puts ?a*48;# let's make it 48 bytes long :)

Keluaran

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Peringatkan

r.rb:1: warning: already initialized constant IO

(file tersebut r.rb, saya menghapus path, jika Anda menjalankannya dari irb, Anda akan mendapatkan (irb): 1: peringatan ...)

Ada metode peringatkan di Ruby, tetapi ia hanya menampilkan argumennya ke $ stderr, membuatnya tidak terlalu mirip peringatan.

Redouane Red
sumber
1

Python, 57 byte

Penerjemah lain mungkin menampilkan peringatan secara berbeda. Ini hanya diuji untuk bekerja pada TIO.

from warnings import*
print("prt"*19)
warn("Warning...!")

Cobalah online

Keluaran

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Peringatan

.code.tio:3: UserWarning: Warning...!
  warn("Warning...!")

Perhatikan bahwa spasi utama tidak dihitung terhadap jumlah byte. Jika spasi terkemuka tidak diabaikan, ini bisa dilakukan dalam 51 byte.

mbomb007
sumber
1

Javascript (ES6), 32 30 byte

Screen(console.log(Function));

cetakan

ƒ Function() { [native code] }

di Chrome, lalu melempar

TypeError: Illegal constructor

Solusi 32 byte asli saya:

(x=y=>console.log(x+!0+10)||z)()

pertama, cetak

y=>console.log(x+!0+10)||ztrue10

Dan melempar kesalahan

ReferenceError: z is not defined
vrugtehagel
sumber
0

VBA, 39 Bytes

Tidak yakin apakah ini memenuhi syarat, mengingat kendala penyusun, tetapi:

Input: (di jendela langsung)

For i=1 To 39:a=a & Chr(i):Next:Print a

* Keluaran termasuk karakter non-cetak yang tidak bermain dengan baik di jendela ini.

Gaffi
sumber
VBA tidak memberikan peringatan kompiler jadi saya tidak berpikir ini dianggap valid
Taylor Scott
0

Perl 6 , 10 byte

dd say 1e9

Cobalah online!

Mencetak 1000000000ke STDOUT, dan Bool::Trueke STDERR. Keduanya menghasilkan baris baru, tetapi spasi putih diabaikan dalam tantangan ini. ddadalah fungsi debugging khusus Rakudo

Jo King
sumber