เขียนโปรแกรมเพื่อพิมพ์ผลรวมของรหัส ASCII ของโปรแกรม


14

งานของคุณคือการเขียนโปรแกรมเพื่อพิมพ์ผลรวมของรหัส ASCII ของตัวละครของโปรแกรมเอง คุณไม่ได้รับอนุญาตให้เปิดไฟล์ใด ๆ (ห้ามป้อนข้อมูลใด ๆ เช่นอาร์กิวเมนต์บรรทัดคำสั่งอินพุตมาตรฐานหรือไฟล์)

โปรแกรมที่พิมพ์หมายเลขต่ำสุด (เช่นมีผลรวมต่ำสุดของรหัส ASCII) ชนะ

นี่คือตัวอย่าง (ไม่ใช่ที่สั้นที่สุด) ของโปรแกรมที่เขียนด้วย C:

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

(ไม่มีบรรทัดใหม่หลังจาก})


4
มันน่าสนใจที่จะเห็นวิธีแก้ปัญหา quine: อันที่ผลิตและผลรวมจำนวนไบต์ของตัวเอง
Joey Adams

1
ไม่ท้าทายมากนัก โดยเฉพาะอย่างยิ่งสำหรับภาษาที่ทิ้งโทเค็นเช่น PowerShell, Golfscript และอื่น ๆ อีกมากมาย
Joey

2
ฉันลดระดับลงและความคิดเห็นให้เหตุผลว่าทำไม ขณะที่ผมได้ตั้งข้อสังเกตมาก่อนฉันไม่พิจารณาจำนวนของคำตอบที่บ่งบอกถึงคุณภาพ เพียงเพราะมันสามารถแก้ไขได้อย่างง่ายดายไม่ได้ทำให้ความท้าทายที่น่าสนใจหรือท้าทาย ความคิดเห็นของฉันอย่างน้อย
Joey

5
รอ. อะไร? ในอีกด้านหนึ่งคุณบ่นว่าคำถามนั้นง่ายและไม่น่าสนใจจากนั้นคุณก็ลงคะแนนฉัน (-2 สำหรับฉัน) ในขณะที่คุณโพสต์ 25% ของคำตอบสำหรับคำถามนี้ (+70 สำหรับคุณ)
Alexandru

4
คุณเห็นว่านี่เป็นการต่อสู้เพื่อชื่อเสียงหรือไม่? ไม่เป็นไรฉันสามารถเปลี่ยนคำตอบเป็น CW ได้อย่างง่ายดาย ในทางที่คำตอบจำนวนมากเป็นการประท้วงเล็กน้อยและเพื่อแสดงให้เห็นว่ามันเป็นเรื่องไม่สำคัญที่จะปั่นคำตอบมากมาย เปรียบเทียบสิ่งนี้กับงานที่ต้องการตัวอักษรสี่ครั้ง ด้วยตนเองตอบรับของฉัน (ผูกพันกับข้อกำหนดงาน) และตนเองแสดงความคิดเห็นของฉัน (หวังว่าจะปรับปรุงคุณภาพไซต์ทั่วไป) มักจะแยกจากกัน อย่างไรก็ตามตอนนี้ฉันมีความสุขมากกว่าที่ฉันลบพวกเขา? พวกเขายังคงเป็นคำตอบที่ถูกต้องแม้ว่า
Joey

คำตอบ:


10

ห้องสุขาพิมพ์ 0

มีคนพูดว่า "ภาษาที่เหมือนแมว" ดังนั้น ...

ไฟล์เปล่า:



wc -c file.wcดำเนินการกับ ที่ 0 ไบต์ฉันคิดว่านี่เป็นผู้ชนะในหมวดหมู่ 'ไม่ใช่ภาษาโปรแกรม'

ด้วย

แมวพิมพ์ 80 (ฐาน 13)

80

ไม่มีการยกเลิกการขึ้นบรรทัดใหม่หมายเลข 80 13เท่ากับ 104 ในรูปทศนิยม คุณสามารถไปให้สั้นลงด้วย 60 17 (102 Dec) แต่ฉันคิดว่า "ฐาน 13" จะคุ้มค่ามากขึ้นคะแนนเกินบรรยาย

แก้ไข: wcตัวอย่างใหม่อันนี้สามารถเรียกใช้เป็นโปรแกรม

#!/usr/bin/wc
ÿÿzw17

(ดังที่เข้ารหัสใน Latin-1 - ÿเป็นไบต์ที่มีค่า 255)

ผลรวมของไบต์คือ 2223 ผลลัพธ์คือ:

  2  2 23 ./w

แต่ควรอ่านไฟล์ที่มี 0-byte เพื่อสร้าง Number 0 ไม่ใช่ไฟล์เปล่า ไม่มีข้อมูลว่างเปล่า
ผู้ใช้ที่ไม่รู้จัก

ผู้ใช้: หนึ่งอาจยืนยันว่าผลรวมของค่าในชุดที่ว่างเปล่ายังคงเป็น 0 อย่างไรก็ตามwc -cเป็นสิ่งต้องห้ามในคำถามต่อไป
Joey

1
ส่วนคำสั่งเดียวที่ดูเหมือนจะทำคือ "ห้ามป้อนข้อมูลใด ๆ เช่นอาร์กิวเมนต์บรรทัดคำสั่ง ... " ดังนั้นจึงควรปิด -c จากนั้นจะพิมพ์ออกมา0 0 0(หากไฟล์ถูกส่งผ่านเป็นไฟล์ห้ามมันดังนั้นภาษาสคริปต์ทั้งหมด ห้ามด้วย)
Random832

2
+1 สำหรับwc, -1 สำหรับการโกงฐาน, +1 สำหรับสร้างมุกตลกในฐาน 13

ฉันจะบอกว่าwcเป็นแอปพลิเคชั่นไม่ใช่ภาษา
Thomas Eding

14

PHP, m4 และภาษาที่เหมือนแมวอื่น ๆ : 150

150

พบวิธีแก้ปัญหานี้โดยใช้โปรแกรม Haskell แบบง่าย ๆ

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

ฉันเดาว่านี่สั้นที่สุดแน่นอน
Alexandru

2
@ Alexandru: ไม่จำเป็น อาจมีโปรแกรมที่มีความยาวหนึ่งหรือสองตัวอักษรที่พิมพ์ผลรวมได้อย่างถูกต้องโดยใช้ฟังก์ชั่นบางตัวเช่น5!ใน J
mellamokb

@mellamokb ผลรวมของอักขระ ASCII ใน5!คือ 86 ไม่ใช่ 125
Peter Olson

3
@ ปีเตอร์: อันที่จริงฉันแสดงตัวอย่างของประเภทโซลูชันที่อาจเล็กกว่า 150 แต่ไม่ใช่โซลูชันจริง ฉันยังไม่พบหนึ่ง (และ btw, 5! คือ 120, ไม่ใช่ 125) :-)
mellamokb

12

Brainf * ck, 255

-.¤

สิ่งนี้จะไม่พิมพ์หมายเลข 255 แต่เป็นอักขระ ASCII ที่ 255

สิ่งนี้อาจถูกพิจารณาว่าเป็นการโกงเนื่องจากคอมไพเลอร์ BF ข้ามไปที่¤


1
ทิม: หมายเลขที่น้อยที่สุดชนะไม่ใช่โปรแกรมที่สั้นที่สุด ไม่ว่าในกรณีใดฉันไม่คิดว่า¤เป็นการโกงเพราะเป็นเพียงความคิดเห็นปกติ
Joey

คุณจะได้คะแนนต่ำกว่าโดยการเพิ่มเติมเล็กน้อย: ----. ␦
Helena

8

Javascript, พิมพ์9432 6902

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

นี่เป็นวิธีแก้ปัญหาควินแรกจนถึงถ้าฉันไม่เข้าใจHaskell อย่างถูกต้อง


รหัส Haskell นั้นค้นหาเพียงจำนวนที่น้อยที่สุดซึ่งจะเท่ากับผลรวมของรหัส ASCII ของหลัก ฉันเดาคำตอบส่วนใหญ่ที่นี่ทำโดยกำลังดุร้าย
Joey

สามารถลดได้มากขึ้นจาก 89 เป็น 86 ไบต์ด้วย:(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

มีสองแท็บระหว่างมีและsay 500:)

(ทำงานเป็นสายการบินperl -Eเดียวกับเท่าที่ฉันสามารถบอกได้ว่านี้อยู่ภายในกฎ)


1
ฉันชอบ 2 แท็บ
Steve P




5

J, 150

?!6

ด้วยข้อแม้ว่ามันจะถูกต้องเพียง 1 / 720th ของเวลา


3
สุ่มที่แฟคทอเรียล 6? อืมฉันไม่คิดอย่างนั้นทิม
MPelletier


3

องค์ประกอบ, 220

นี่คือภาษาของการสร้างของตัวเองและเป็นเอกสารเกี่ยวกับคำตอบของฉันคำถามอื่นที่นี่

220`!

นี่คือคำแนะนำวิธีการทำงาน: การ220กดหมายเลขนั้นลงบนสแต็ก จากนั้น `` outputs the top element of the stack. The! 'จากนั้นจะดำเนินการกับตรรกะไม่ได้อยู่ในสแต็กควบคุม (สแต็กแยก) ตั้งเป็น 1



2

PowerShell พิมพ์ 3902

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

ค้นหาบรรทัดที่รันอยู่ในปัจจุบันและสรุปค่าจุดรหัส


2

INTERCAL, 1572

ฉันไม่อยากจะเชื่อว่ายังไม่มีใครทำ INTERCAL เลย!

DOREADOUT#1572


DOGIVEUP

(รวมถึงการยกเลิกบรรทัดใหม่) โปรแกรมนี้พิมพ์ MDLXXII


1

Perl พิมพ์ 690

die 690 . $/

หรือถ้าเราสามารถโพสต์หนึ่งสมุทร ( perl -E)

say(570)

พิมพ์ 570

(ไม่มีการขึ้นบรรทัดใหม่)


1

JavaScript, 1750 900 860 790

alert(790)

(Carriage return (CR \rหรือ\x0D) หลังหรือก่อนโปรแกรม)

โปรแกรมเหล่านี้ถูกค้นพบโดย brute-force

ค่าที่ใหญ่กว่า:

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

1

Java -128

ฉันรู้ว่าไม่อนุญาตให้อ่าน stdin แต่ฉันต้องการยกตัวอย่างวิธีคำนวณคะแนนของฉัน

รหัสของฉันสรุปจำนวน ASCII ของตัวเองที่ส่งผ่านไปยัง stdin และพิมพ์ออกมา -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);}}

ไม่มีการขึ้นบรรทัดใหม่


ฉันคิดว่าผลรวมของคุณล้น
อัลฟ่า

1

Ruby พิมพ์ 300

p   300

มีพื้นที่และแท็บระหว่างเป็นและp 300ไม่มีการขึ้นบรรทัดใหม่


1

แบตช์ไฟล์ 500

ECHO  500

เช่นกันให้สังเกตช่องว่างสองช่องระหว่าง "ECHO" (ตัวพิมพ์ใหญ่โดยเจตนา) และ "500"


1

C, 1700

Strange - ยังไม่มีใครโพสต์โซลูชัน C (ยกเว้นตัวอย่างในคำถาม)

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

ไม่มีการขึ้นบรรทัดใหม่ในตอนท้าย


1

K ( 923 796 795 746 513)

ฉันไม่แน่ใจว่าสิ่งนี้จะขัดกับกฎหรือไม่ มันไม่ได้ใช้ stdin มันเปิดตัวเองเป็นเวกเตอร์ของไบต์และผลรวม

+/1:.z.f

การใช้งาน:

q scriptname.k

แก้ไข 2012.05.08 - ไม่จำเป็นต้อง hsym จัดการไฟล์ 2012.05.09 - บันทึก 1 จุดโดยการแปลงเป็นไบต์แทน int

2012.05.17 - สามารถบันทึกคะแนนโดยการอ่านไฟล์เป็น bytestream แทนข้อความ:


1

J, 198

33*6

และ

6*33

พบว่ากำลังดุร้าย ใน J ไม่มี 1 หรือ 2 การแก้ปัญหาถ่านและทางออกเดียว 3 150ถ่าน ยกเว้นข้อบกพร่องใด ๆ ในการค้นหาของฉันไม่มีวิธีการแก้ปัญหาอื่น ๆ อีก 4 ตัวเช่นกัน


จาก #jsoftware IRC channel เรายังมี<.%:10!20ที่ 429 และquine self-count +/a.i.2#(,{:)'+/a.i.2#(,{:)'''ที่ 1706


0

bc 1160

เรียกใช้ด้วย echo และ blanks สตริงทั้งหมดซึ่งรวมถึง 7 ช่องว่างecho 1160 | bcมีไบต์ 1160

echo 1160    |  bc

150 ทำงานกับ bc ด้วย:

echo "150" > 150
bc -q 150
150


0

ช่องว่าง, 369

โปรแกรม 20 ตัวอักษรนี้พิมพ์หมายเลข 369 ซึ่งเป็นผลรวมของค่า ascii ของตัวละคร (เช่น Tab, Space, อักขระ Linefeed ที่นี่มีสัญลักษณ์โดย T, S, L ตามลำดับ):

SSSTSTTTSSSTLTLSTLLL

(369 = 7 * 9 + 8 * 32 + 5 * 10 มี 7 แท็บ 8 ช่องว่างและ 5 ฟีด)



0

Brainf * ck, 253 (หรือ 252)

การปรับปรุงเล็กน้อยในโซลูชันของ Peter Olson:

---.H

อนุญาตให้ไม่สามารถพิมพ์ได้ก็สามารถปรับปรุงเพิ่มเติมได้โดยการเพิ่ม-และแทนที่Hด้วยรหัส ASCII 26



0

Python 5440

ชนะคะแนนสูงสุดใช่มั้ย

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

ฉันแค่คิดว่าฉันจะโพสต์มันต่อไป b / c มันเป็นวิธีการแก้ปัญหาควายครึ่งทาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.