Viết chương trình in tổng số mã ascii của chương trình


14

Nhiệm vụ của bạn là viết một chương trình để in tổng mã ASCII của các ký tự của chính chương trình. Bạn không được phép mở bất kỳ tệp nào (Bất kỳ đầu vào nào như đối số dòng lệnh, đầu vào tiêu chuẩn hoặc tệp đều bị cấm).

Chương trình in số thấp nhất (nghĩa là có tổng số mã ASCII thấp nhất) sẽ thắng.

Dưới đây là một ví dụ (không phải ngắn nhất) của một chương trình như vậy được viết bằng C:

#include <stdio.h>
int main(){
printf("4950");/*i*/
return 0;
}

(không có dòng mới sau })


4
Thật thú vị khi thấy một giải pháp quine: một giải pháp tạo ra và tính tổng các byte của chính nó.
Joey Adams

1
Imho không thử thách lắm. Nó có thể bị ép buộc một cách tầm thường, đặc biệt đối với các ngôn ngữ chỉ đơn giản là đổ token, như PowerShell, Golfscript, v.v.
Joey

2
Tôi đánh giá thấp và bình luận đưa ra lý do, tại sao. Như tôi đã lưu ý trước đây, tôi không coi số lượng câu trả lời là một chỉ dẫn về chất lượng . Chỉ vì nó có thể được giải quyết dễ dàng không làm cho điều này trở thành một thách thức thú vị hoặc thậm chí là thử thách. Ý kiến ​​của tôi, ít nhất.
Joey

5
Chờ đợi. Gì? Một mặt bạn phàn nàn rằng câu hỏi rất dễ và không thú vị và sau đó bạn đánh giá thấp tôi (-2 cho tôi). Mặt khác, bạn đăng 25% câu trả lời cho câu hỏi này (+70 cho bạn).
Alexandru

4
Vì vậy, bạn thấy đây là một cuộc chiến danh tiếng? Tốt thôi, tôi có thể dễ dàng thay đổi câu trả lời của mình thành CW. Theo một cách nào đó, số lượng lớn câu trả lời là một chút phản đối và để cho thấy rằng thật tầm thường khi đưa ra rất nhiều câu trả lời. So sánh điều này với ví dụ với nhiệm vụ muốn bảng chữ cái bốn lần. Ngoài ra, bản thân câu trả lời của tôi (ràng buộc với các đặc tả nhiệm vụ) và tự nhận xét của tôi (hy vọng cải thiện chất lượng trang web chung) thường khá riêng biệt. Dù sao, hạnh phúc hơn bây giờ khi tôi xóa chúng? Họ vẫn là câu trả lời hợp lệ, mặc dù.
Joey

Câu trả lời:


10

wc, in 0

Có người nói "ngôn ngữ giống mèo", nên ...

Một tập tin trống:



Thực hiện với wc -c file.wc. Với 0 byte, tôi nghĩ đây là người chiến thắng trong hạng mục 'không thực sự là ngôn ngữ lập trình'.

Cũng thế

mèo, in 80 (cơ sở 13)

80

Không chấm dứt dòng mới, số 80 13 tương đương với 104 ở dạng thập phân. Bạn có thể đi ngắn hơn với 60 17 (102 tháng 12), nhưng tôi cho rằng "cơ sở 13" sẽ có giá trị nhiều điểm hơn.

EDIT: wcVí dụ mới , cái này có thể được chạy như một chương trình.

#!/usr/bin/wc
ÿÿzw17

(Như được mã hóa bằng tiếng Latin-1 - the là một byte có giá trị 255)

Tổng số byte là 2223, đầu ra là:

  2  2 23 ./w

Nhưng wc nên đọc một tệp, chứa 0 byte để tạo Số 0, không phải là số trống. Trống không phải là Null.
người dùng không xác định

người dùng: Người ta có thể lập luận rằng tổng các giá trị trong một tập hợp trống vẫn là 0. Tuy nhiên, wc -cdù sao thì cũng bị cấm trong câu hỏi.
Joey

1
Mệnh đề duy nhất có vẻ như vậy là "Bất kỳ đầu vào nào như đối số dòng lệnh ... đều bị cấm", vì vậy hãy bỏ đi -c, sau đó nó sẽ in 0 0 0(nếu tệp được truyền dưới dạng tệp cấm, thì tất cả các ngôn ngữ kịch bản lệnh đều được cũng bị cấm)
Random832

2
+1 cho wc, -1 cho gian lận cơ sở, +1 để tạo trò đùa trong cơ sở 13.

Tôi muốn nói wclà một ứng dụng, không phải là một ngôn ngữ.
Thomas Eding

14

PHP, m4 và các ngôn ngữ giống mèo khác: 150

150

Tìm thấy giải pháp này bằng cách sử dụng chương trình Haskell đơn giản để bắt buộc:

f :: String -> Bool
f s = (read s :: Int) == (sum . map fromEnum) s

main = mapM_ print [filter f $ sequence $ replicate n ['0'..'9'] | n <- [1..10]]

Tôi đoán đây là ngắn nhất tuyệt đối.
Alexandru

2
@Alexandru: Không nhất thiết. Có thể có chương trình dài một hoặc hai ký tự in chính xác tổng bằng cách sử dụng một số hàm dựng sẵn, nói như 5!trong J.
mellamokb

@mellamokb Tổng của các ký tự ASCII 5!là 86, không phải 125.
Peter Olson

3
@Peter: Thật vậy, tôi đã đưa ra một ví dụ về loại giải pháp có thể nhỏ hơn 150, nhưng không phải là một giải pháp thực tế. Tôi chưa tìm thấy một cái nào (và btw, 5! Là 120, không phải 125) :-)
mellamokb

12

Brainf * ck, 255

-.¤

Điều này sẽ không in số 255, mà là ký tự ASCII thứ 255.

Điều này có thể được coi là gian lận vì trình biên dịch BF bỏ qua.


1
Tim: Số thấp nhất sẽ thắng, không phải là chương trình ngắn nhất. Trong mọi trường hợp, tôi không nghĩ đó ¤là gian lận, vì đó chỉ là một nhận xét bình thường.
Joey

Bạn nhận được điểm thấp hơn bằng cách trừ thêm một chút: ----.
Helena

8

Javascript, in 9432 6902

(function a(){b="("+a+")()";c=0;for(i=0;i<b.length;i++){c+=b.charCodeAt(i-0)}alert(c)})()

Đây là giải pháp quine đầu tiên cho đến nay, trừ khi tôi không hiểu chính xác về Haskell .


Mã Haskell đó chỉ đang tìm kiếm số nhỏ nhất sẽ bằng tổng số mã ASCII của chữ số. Tôi đoán hầu hết các câu trả lời ở đây được thực hiện bởi vũ phu.
Joey

Có thể giảm thêm từ 89 xuống 86 byte với:(function a(){b="("+a+")()";for(i=c=0;i<b.length;i++)c+=b.charCodeAt(i-0);alert(c)})()
WallyWest


6

Perl, 500

say     500

Có hai tab giữa say500. :)

(Chạy như một lớp lót với perl -E, theo như tôi có thể nói điều này nằm trong quy tắc)


1
Tôi thích 2 tab
Steve P

5

Ruby, in 380

p (380)

Không có dòng mới sau dấu ngoặc đơn đóng.




5

J, 150

?!6

Với lời cảnh báo rằng nó sẽ chỉ đúng 1/20 lần.


3
Ngẫu nhiên trên giai thừa 6? Hmmm, tôi không nghĩ vậy, Tim.
MPelletier


3

Yếu tố, 220

Đây là một ngôn ngữ của sáng tạo của riêng tôi, và nó được ghi lại trong câu trả lời của tôi cho một câu hỏi khác ở đây .

220`!

Đây là hướng dẫn về cách thức hoạt động của nó: Việc 220đẩy số đó lên ngăn xếp. Sau đó, `` outputs the top element of the stack. The! `Sau đó thực hiện một logic không có trong ngăn xếp điều khiển (một ngăn xếp riêng), đặt nó thành 1.


2

PHP, in 4440

<?php
for($x=0;$x<15000;$x++)if($x==4440){printf($x);exit;}

2

PowerShell, in 3902

&{[char[]]$myinvocation.Line|%{$s+=+$_};$s}

Nhìn vào dòng hiện đang chạy và tính tổng các giá trị điểm mã.


2

INTERCAL, 1572

Tôi không thể tin rằng chưa có ai thực hiện INTERCAL!

DOREADOUT#1572


DOGIVEUP

(Bao gồm chấm dứt dòng mới.) Chương trình này in ra MDLXXII.


1

Perl, in 690

die 690 . $/

Hoặc, nếu chúng ta có thể đăng một-liners ( perl -E)

say(570)

In 570.

(Không có dòng mới)


1

JavaScript, 1750 900 860 790

alert(790)

(Trả lại vận chuyển (CR, \rhoặc \x0D) sau hoặc trước chương trình)

Các chương trình này được tìm thấy bởi brute-buộc.

Giá trị lớn hơn:

alert(860)%0
alert(900)&&6
document.write(1750)

1

Java -128

Tôi biết đọc stdin không được phép nhưng tôi muốn cung cấp một ví dụ về cách tôi tính điểm của mình.

Mã của tôi tính tổng số ASCII của chính nó được truyền vào stdin và in ra -128

class P{public static void main(String[]z)throws Exception{byte v=0;int b=0;while((b=System.in.read())!=-1){v+=(byte)b;}System.out.println(v);}}

Không có dòng mới


Tôi nghĩ rằng số tiền của bạn đang tràn.
Alpha

1

Ruby, in 300

p   300

Có một khoảng trắng và một tab giữa p300. Không có dòng mới.


1

Tập tin hàng loạt, 500

ECHO  500

Đồng thời, chú ý hai khoảng trắng giữa "ECHO" (chữ hoa trên mục đích) và "500".


1

C, 1700

Lạ - chưa có ai đăng giải pháp C (trừ ví dụ trong câu hỏi).

main(R){puts("1700");}

Không có dòng mới ở cuối.


1

K ( 923 796 795 746 513)

Tôi không chắc chắn nếu điều này rơi vào quy tắc hay không. Nó không sử dụng stdin, nó tự mở như một vectơ byte và tổng.

+/1:.z.f

Sử dụng:

q scriptname.k

chỉnh sửa 2012.05.08 - không cần hsym xử lý tệp 2012.05.09 - đã lưu 1 điểm bằng cách chuyển đổi sang byte thay vì int

2012.05.17 - Có thể lưu tải điểm bằng cách đọc tệp dưới dạng bytestream thay vì văn bản:


1

J, 198

33*6

6*33

Tìm thấy nó bằng vũ lực. Trong J không có giải pháp 1 hoặc 2 char và giải pháp 3 char duy nhất là 150. Không có bất kỳ lỗi nào trong tìm kiếm của tôi, cũng không có giải pháp 4 char nào khác.


Từ kênh IRC #jsoftware, chúng tôi cũng đã có <.%:10!20429 và một quine tự đếm +/a.i.2#(,{:)'+/a.i.2#(,{:)'''ở 1706.


0

bc 1160

được gọi với echo và khoảng trống, toàn bộ Chuỗi, bao gồm 7 khoảng trống, echo 1160 | bccó byte là 1160.

echo 1160    |  bc

150 công trình cho bc quá:

echo "150" > 150
bc -q 150
150

0

D, 9752

cái này thực sự tính toán nó tương tự như tôi Quine

enum c=q{import std.stdio;void main(){int s;foreach(d;"enum c=q{"~c~"};mixin(c);")s+=d;write(s);}};mixin(c);

0

Khoảng trắng, 369

Chương trình 20 ký tự này in số 369, là tổng của các giá trị ascii của các ký tự của nó (lần lượt là các ký tự Tab, Space, Linefeed, ở đây được ký hiệu là T, S, L):

SSSTSTTTSSSTLTLSTLLL

(369 = 7 * 9 + 8 * 32 + 5 * 10, có 7 Tab, 8 Spaces và 5 Linefeed.)


0

Haskell, 7518

Một sửa đổi nhỏ của quine của tôi :

main=print.sum.map fromEnum$q++show q;q="main=print.sum.map fromEnum$q++show q;q="

0

Brainf * ck, 253 (hoặc 252)

Cải thiện nhẹ về giải pháp của Peter Olson:

---.H

Được cung cấp không in được cho phép, nó có thể được cải thiện hơn nữa bằng cách thêm -và thay thế Hbằng mã ASCII 26.



0

Con trăn, 5440

Điểm số cao nhất chiến thắng, phải không?

import sys
print sum(ord(i)for i in open(sys.argv[0]).read())

Tôi chỉ nghĩ rằng tôi sẽ đăng nó dù sao đi nữa, đó là một giải pháp nửa chừng.

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.