triplegolf - không chỉ tính chiều dài mã nguồn!


15

Mục tiêu của thử thách này là viết một chương trình trong đó độ dài của ba phần sau giống hệt nhau:

  • độ dài của mã nguồn
  • Độ dài của đầu ra mà nó in ra đầu ra tiêu chuẩn
  • độ dài của trình biên dịch cảnh báo nó tạo ra với trình biên dịch (chưa sửa đổi) mà bạn chọn

Người chiến thắng là mã ngắn nhất để đáp ứng cả ba tiêu chí và phải dài ít nhất 1 ký tự.

Để cải thiện mọi thứ, nếu đầu ra có ít hơn ba ký tự khác nhau, nó sẽ bị phạt 5 điểm thêm vào độ dài cho mỗi một (vì vậy +10 nếu chỉ một loại duy nhất, +5 cho hai).

(Các dòng mới được tính là 1 hoặc 2 ký tự, sự lựa chọn của bạn, nhưng nó phải nhất quán trong cả ba tiêu chí. Khoảng trắng hàng đầu và dấu kiểm được bỏ qua trong tất cả các dòng trong cả ba tiêu chí)

Trong trường hợp số điểm bằng nhau, người in kết quả thú vị nhất (thay vì rác) là người chiến thắng.


1
"Loại nhân vật" là gì?
Peter Taylor

5
Ngoài ra, nếu trình biên dịch tạo ra đầu ra không cảnh báo (ví dụ "Biên dịch chính") thì sao? Ngoài ra, nếu tên của tệp nguồn xuất hiện trong các thông báo cảnh báo (ví dụ: "foo.c: 1: 1: ...") thì sao?
Joey Adams

3
Vũ khí lựa chọn của tôi là VBA, không thực sự có trình biên dịch và không xuất ra tệp nhị phân để chạy (như trường hợp của một số ngôn ngữ khác, tôi tin vậy). Có cân nhắc cho điều này, hoặc tôi chỉ bị loại theo mặc định?
Gaffi

2
Tôi tự hỏi nếu một ba-quine có thể trong một số ngôn ngữ?
Ry-

2
Đối với các ngôn ngữ được thông dịch, chúng tôi nhận được một đầu ra ngay cả khi xảy ra lỗi, trong trường hợp như vậy, những lỗi đó có được chấp nhận hay chỉ là cảnh báo được chấp nhận?
l0n3sh4rk

Câu trả lời:


14

Bash, 23 ký tự

Lỗi:

bash: /: Is a directory

Nguồn:

echo       $0-$01234;/;

Đầu ra:

/bin/bash-/bin/bash1234


Brainf * ck, 32 ký tự

Mã này thực thi trong khoảng 3 giây và dừng lại và hiển thị lỗi và đầu ra sau đây.

Lỗi:

bff: out of memory (-2058691272)

Nguồn:

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

Đầu ra: (Hexdump)

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


C, 35 ký tự

Cảnh báo:

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

Nguồn và đầu ra:

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


PHP, 50 ký tự

Cảnh báo:

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

Nguồn và đầu ra:

<?php echo (0/0).''.file_get_contents(__FILE__);?>

1
Ví dụ bash là một lỗi, không phải là một cảnh báo.
Peter Taylor

Trình biên dịch nào bạn đang sử dụng cho giải pháp C?
hộp bánh mì

@breadbox gcc phiên bản 4.7.0 20120505 (phát hành trước) (GCC)
l0n3sh4rk

8

C - 48 ký tự

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

Lưu ý: bao gồm một dòng mới (kiểu Unix).

Đầu ra từ gcc a.cđọc:

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

Đầu ra từ a.outphần lớn là các ký tự không in, vì vậy đây là giao diện sau khi chuyển qua 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

Hiểu biết của tôi là không thể in (whitepace?) Bị cắt ngắn, vì vậy điều này sẽ không được tính. Nếu điều đó làm việc, tôi có thể cải thiện câu trả lời của riêng tôi.
Gaffi

1
Các ký tự điều khiển thường không được coi là khoảng trắng, tất nhiên ngoại trừ \ t, \ n, \ r, \ f và đôi khi \ v. Không ai trong số này ở vị trí dẫn đầu hoặc dấu vết, vì vậy tôi cho rằng mình an toàn.
hộp bánh mì

1
Tôi nghĩ rằng điều này là hoàn toàn chấp nhận được. Họ không phải là khoảng trắng, và trong cả hai trường hợp này không phải là ACM được rằng đúng yêu cầu. Lý do chính cho "quy tắc khoảng trắng" này là do một số IDE có thể định dạng rất nhiều đầu ra trình biên dịch của họ.
vsz

1
@copy, Hoặc main(i){i='\z';while(i-->74)putchar(i);}- nhưng giảm kích thước chương trình thực sự phản tác dụng.
hộp bánh mì

1
Đây là câu trả lời yêu thích của tôi, tôi biết rằng tôi nên đã cấm truy cập vào nội dung của tệp (giống như các câu hỏi thực sự)
vsz

5

JavaScript, 63 66

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

Đầu ra là:

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

Trong Chrome, lỗi là:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined

3

Visual Basic .NET, 185

Gee, vbckhá dài dòng với các cảnh báo tổng hợp. Dù sao, mã là thế này:

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

(Lưu ý rằng chúng được coi là các tab, không phải dấu cách.)

Đầu ra là thế này:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Và cảnh báo trình biên dịch là đây:

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

(Lần này, thực sự là bốn khoảng trắng, không phải các tab.)


3

Zsh , 20 byte

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

Vấn đề chúng tôi gặp ở đây được đề cập trong một nhận xét ở trên: Zsh in tên chương trình bên cạnh số dòng trước mỗi lỗi. Giải pháp ở đây sử dụng tên tệp một ký tự để lạm dụng điều này. Tôi đã gói nó trong một tập lệnh trợ giúp để hiển thị chính xác những gì nó in và được sử dụng wc -ctrên thiết bị xuất chuẩn, thiết bị xuất chuẩn và tệp nguồn.

Đầu ra: 569Xcatcatcatcatcattheo sau là một
lỗi dòng mới : s:[:2: ']' expectedtheo sau là một dòng mới


EDIT: Giải pháp thay thế 20 byte không hạn chế tệp:

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

Hãy thử trực tuyến!

Zsh , zsh -x, 10 byte

<<<$_$_$_

-xcờ cho phép xtrace. Điều này một lần nữa yêu cầu một tên tệp một ký tự. Hãy thử trực tuyến!

Zsh zsh -JNTwEDY , 12 byte

<<<$->&1 >&2

-flagCâu trả lời ngắn nhất không có yêu cầu tên tệp. Đặt thêm cờ và $-in tất cả. Hãy thử trực tuyến!


2

JavaScript (Firefox 54), 34 byte

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

Đầu ra:

1234function(x)1234function(x)1234

Và nó sẽ gửi cảnh báo này đến bảng điều khiển trình duyệt:

expression closures are deprecated

Dường như này trong bản sao của tôi của Firefox Developer Edition (54.0a2). Nó cũng có thể hoạt động trong các phiên bản khác của Firefox.


2

Ruby, 48 ký tự

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

Đầu ra

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Cảnh báo

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

(tệp là r.rb, tôi đã xóa đường dẫn, nếu bạn chạy nó từ irb, bạn sẽ nhận được (irb): 1: cảnh báo ...)

Có phương thức cảnh báo trong Ruby, nhưng nó chỉ đưa ra các đối số của nó thành $ stderr, làm cho nó trông giống như một cảnh báo.


1

Python, 57 byte

Thông dịch viên khác có thể hiển thị cảnh báo khác nhau. Điều này chỉ được thử nghiệm để làm việc trên TIO.

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

Dùng thử trực tuyến

Đầu ra

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Cảnh báo

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

Lưu ý rằng các không gian hàng đầu không được tính vào số byte. Nếu các không gian hàng đầu không bị bỏ qua, điều này có thể được thực hiện trong 51 byte.


1

Javascript (ES6), 32 30 byte

Screen(console.log(Function));

in

ƒ Function() { [native code] }

trong Chrome và sau đó ném

TypeError: Illegal constructor

Giải pháp 32 byte ban đầu của tôi:

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

đầu tiên, in

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

Và ném lỗi

ReferenceError: z is not defined

0

VBA, 39 byte

Không chắc chắn nếu điều này đủ điều kiện, đưa ra các ràng buộc trình biên dịch, nhưng:

Đầu vào: (trong cửa sổ ngay lập tức)

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

* Đầu ra bao gồm các ký tự không in không phát tốt trong cửa sổ này.


VBA không đưa ra bất kỳ cảnh báo nào về trình biên dịch nên tôi không nghĩ rằng điều này được coi là hợp lệ
Taylor Scott

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.