Напишіть програму, щоб надрукувати суму кодів ascii програми


14

Ваше завдання - написати програму для друку суми ASCII-кодів символів самої програми. Вам не дозволяється відкривати жоден файл (заборонено будь-які введення, наприклад аргументи командного рядка, стандартне введення чи файли).

Виграє програма, яка виводить найменше число (тобто має найменшу суму кодів ASCII).

Ось приклад (не найкоротший) такої програми, написаної на C:

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

(після нового рядка немає })


4
Було б цікаво побачити вирішення quine: те, яке виробляє і підсумовує власні байти.
Joey Adams

1
Не дуже складний imho. Це може бути тривіально жорстоко, особливо для мов, які просто скидають лексеми, такі як PowerShell, Golfscript тощо.
Joey

2
Я поклонився, і коментар дає причину, чому. Як я вже зазначав, кількість відповідей не вважаю показником якості . Тільки тому, що це легко вирішити, це не робить це цікавим або навіть складним завданням. Моя думка, принаймні.
Джої

5
Зачекайте. Що? З одного боку, ти скаржишся, що питання просте і не цікаве, і тоді ти спростовуєш мене (-2 для мене). З іншого боку, ви розміщуєте 25% відповідей на це питання (+70 для вас).
Олександру

4
Ви бачите це як битву за репутацію? Добре, я можу легко змінити свої відповіді на CW. Зрештою, велика кількість відповідей була трохи протестом і показала, що банально викривати багато відповідей. Порівняйте це, наприклад, із завданням, яке хотіло алфавіту чотири рази. Також мої відповіді (пов'язані із специфікаціями завдання) та моє коментування (сподіваючись покращити загальну якість веб-сайту) часто досить окремо. У будь-якому випадку, щасливіше, коли я їх видалив? Вони все ще були достовірними відповідями.
Joey

Відповіді:


10

wc, відбитки 0

Хтось сказав "котячі мови", так що ...

Порожній файл:



Виконати за допомогою wc -c file.wc. В 0 байт, я думаю, що це переможець у категорії "насправді не мова програмування".

Також

кішка, принти 80 (основа 13)

80

Не закінчуючи новий рядок, число 80 13 еквівалентно 104 у десятковій частині. Ви можете піти коротше на 60 17 (102 декабря), але я вважав, що "база 13" буде вартістю більше очок.

EDIT: Новий wcприклад, цей можна запустити як програму.

#!/usr/bin/wc
ÿÿzw17

(Як закодовано латиною-1 - ÿ - байт зі значенням 255)

Сума байтів 2223, вихід:

  2  2 23 ./w

Але wc повинен прочитати файл, що містить 0-байт для отримання числа 0, а не порожній. Порожня - не нульова.
користувач невідомий

користувач: Можна стверджувати, що сума значень у порожньому наборі все ж дорівнює 0. Тим не менш, wc -cце питання все одно заборонено.
Джої

1
Єдине застереження, яке, здається, робить це: "Будь-який вхід, такий як аргументи командного рядка ... заборонений", тому залиште -c, тоді він друкується 0 0 0(якщо файл, переданий як файл, забороняє це, то всі мови сценаріїв є також заборонено)
Випадково832

2
+1 для wc, -1 за обман на базі, +1 для жартів у базі 13.

Я б сказав wc, що це додаток, а не мова.
Томас Едінг

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

Я здогадуюсь, це абсолютно коротше.
Олександру

2
@ Олександру: Не обов’язково. Можливо, існує програма, яка має один або два символи, яка правильно роздруковує суму за допомогою деяких вбудованих функцій, скажімо, як 5!у J.
mellamokb

@mellamokb Сума символів ASCII в 5!86, а не 125.
Пітер Олсон

3
@ Peeter: Дійсно, я показував приклад типу рішення, яке може бути менше 150, але не є фактичним рішенням. Я ще не знайшов жодного (і btw, 5! Це 120, а не 125) :-)
mellamokb

12

Brainf * ck, 255

-.¤

Це не буде друкувати число 255, а швидше 255-й символ ASCII.

Це може вважатися обманом, оскільки компілятор BF пропускає over.


1
Тім: Найнижча кількість виграшів, не найкоротша програма. У будь-якому випадку, я не думаю, що ¤це обман, оскільки це просто звичайний коментар.
Joey

Ви отримуєте нижчу оцінку, віднімаючи трохи більше: ----. ␦
Хелена

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 вкладки
Стів П

5

Рубін, принти 380

p (380)

Немає останньої лінії після закриття дужок.




5

J, 150

?!6

З застереженням, що це буде правильно лише 1/720-й час.


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

ІНТЕРКАЛ, 1572 рік

Я не можу повірити, що ще ніхто не зробив INTERCAL!

DOREADOUT#1572


DOGIVEUP

(Включає завершення нового рядка.) Ця програма роздруковує MDLXXII.


1

Perl, принти 690

die 690 . $/

Або, якщо ми можемо розмістити однолінійки ( perl -E)

say(570)

Друкує 570.

(Немає останніх рядків)


1

JavaScript, 1750 900 860 790

alert(790)

(Повернення перевезення (CR \rабо \x0D) після або перед програмою)

Ці програми виявляються грубим форсуванням.

Більші значення:

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

1

Ява -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

Рубін, принти 300

p   300

Існує пробіл та вкладка між pта 300. Немає зворотного рядка.


1

Пакетні файли, 500

ECHO  500

Крім того, помітьте два проміжки між "ECHO" (великі регістри за призначенням) та "500".


1

С, 1700

Дивно - ще ніхто не опублікував рішення 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-char розчин є 150. Якщо у моєму пошуку не вдається помилок, немає й інших 4-знакових рішень.


З каналу #jsoftware IRC у нас також було <.%:10!20429, а квітка саморахунку - +/a.i.2#(,{:)'+/a.i.2#(,{:)'''1706.


0

до н.е. 1160

З посиланням на ехо та пробіли, ціла струна, включаючи 7 пробілів, echo 1160 | bcмає 1160 байтів.

echo 1160    |  bc

150 робіт також для комп'ютера:

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)

Незначне покращення рішення Пітера Олсона:

---.H

За умови дозволу, що не можна друкувати, це можна вдосконалити шляхом додавання -та заміни Hкодом ASCII 26.



0

Пітон, 5440

Найвищий результат виграє, правда?

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

Я просто думав, що все-таки опублікую його, але це рішення на півдорозі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.