Napisz program, aby wydrukować sumę kodów ascii programu


14

Twoim zadaniem jest napisanie programu, który wydrukuje sumę kodów ASCII znaków samego programu. Nie wolno otwierać żadnego pliku (Wszelkie dane wejściowe, takie jak argumenty wiersza poleceń, standardowe dane wejściowe lub pliki są zabronione).

Program, który drukuje najniższą liczbę (tzn. Ma najniższą sumę kodów ASCII) wygrywa.

Oto przykład (nie najkrótszy) takiego programu napisanego w C:

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

(brak nowej linii po })


4
Ciekawie byłoby zobaczyć rozwiązanie quine: takie, które produkuje i sumuje własne bajty.
Joey Adams,

1
Niezbyt trudne imho. Może być trywialnie wymuszony, szczególnie w przypadku języków, które po prostu zrzucają tokeny, takich jak PowerShell, Golfscript itp.
Joey

2
Przegłosowałem i komentarz podaje powód, dlaczego. Jak zauważyłem wcześniej, nie uważam liczby odpowiedzi za wskaźnik jakości . To, że można go łatwo rozwiązać, nie czyni z tego interesującego, a nawet trudnego wyzwania. Przynajmniej moja opinia.
Joey,

5
Czekać. Co? Z jednej strony narzekasz, że pytanie jest łatwe i nie interesujące, a potem głosujesz za mną (-2 dla mnie). Z drugiej strony publikujesz 25% odpowiedzi na to pytanie (+70 za ciebie).
Alexandru

4
Widzisz to jako bitwę o reputację? Dobrze, mogę łatwo zmienić swoje odpowiedzi na CW. W pewnym sensie duża liczba odpowiedzi była trochę protestem i pokazaniem, że wyrzucenie wielu odpowiedzi jest banalne. Porównaj to na przykład z zadaniem, które chciało alfabetu cztery razy. Również moje samo odpowiadanie (zgodnie ze specyfikacją zadania) i moje komentowanie (mając nadzieję na poprawę ogólnej jakości witryny) są często dość osobne. W każdym razie szczęśliwszy, że je usunąłem? Jednak wciąż były poprawnymi odpowiedziami.
Joey,

Odpowiedzi:


10

wc, drukuje 0

Ktoś powiedział „języki podobne do kotów”, więc ...

Pusty plik:



Wykonaj za pomocą wc -c file.wc. Przy 0 bajtach myślę, że jest to zwycięzca w kategorii „nie do końca język programowania”.

Również

kot, drukuje 80 (baza 13)

80

Bez kończącej nowej linii, liczba 80 13 jest równa 104 w systemie dziesiętnym. Możesz skrócić z 60 17 (102 dec), ale pomyślałem, że „baza 13” byłaby warta więcej punktów maniaków.

EDYCJA: Nowy wcprzykład, ten można uruchomić jako program.

#!/usr/bin/wc
ÿÿzw17

(Zgodnie z kodowaniem w Latin-1 - ÿ jest bajtem o wartości 255)

Suma bajtów to 2223, dane wyjściowe to:

  2  2 23 ./w

Ale wc powinien odczytać plik zawierający 0 bajtów, aby wygenerować liczbę 0, a nie pustą. Pusty nie ma wartości NULL.
użytkownik nieznany

użytkownik: Można argumentować, że suma wartości w pustym zestawie wciąż wynosi 0. Niemniej jednak wc -cw pytaniu jest to zabronione.
Joey

1
Jedyną klauzulą, która wydaje się to robić, jest „Wszelkie dane wejściowe, takie jak argumenty wiersza poleceń ... są zabronione”, więc należy pominąć -c, a następnie drukuje 0 0 0(jeśli plik przekazywany jako plik tego zabrania, to wszystkie języki skryptowe są również zabronione)
Random832

2
+1 za wc, -1 za podstawowe oszukiwanie, +1 za żarty w bazie 13.

Powiedziałbym, że wcto aplikacja, a nie język.
Thomas Eding,

14

PHP, m4 i inne języki podobne do kota: 150

150

Znaleźć to rozwiązanie za pomocą prostego programu Haskell, aby użyć siły:

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

Myślę, że jest to absolutnie najkrótsza.
Alexandru

2
@Alexandru: Niekoniecznie. Może istnieć program o długości jednego lub dwóch znaków, który poprawnie drukuje sumę przy użyciu niektórych wbudowanych funkcji, powiedzmy jak 5!w J.
mellamokb

@mellamokb Suma znaków ASCII 5!wynosi 86, a nie 125.
Peter Olson

3
@Peter: Rzeczywiście, ja pokazano przykład rodzaju roztworu, który może być mniejszy niż 150, ale nie jest to praktyczne rozwiązanie. Jeszcze go nie znalazłem (a przy okazji 5 to 120, a nie 125) :-)
mellamokb

12

Brainf * ck, 255

-.¤

Nie wypisze to liczby 255, ale 255. znak ASCII.

Można to uznać za oszustwo, ponieważ kompilator BF przeskakuje the.


1
Tim: Wygrywa najniższa liczba, a nie najkrótszy program. W każdym razie nie sądzę, że ¤to oszustwo, ponieważ jest to zwykły komentarz.
Joey

Otrzymujesz niższy wynik, odejmując trochę więcej: ----. ␦
Helena

8

JavaScript, drukuje 9432 6902

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

Jest to pierwsze jak dotąd rozwiązanie quine, chyba że nie rozumiem poprawnie rozwiązania Haskell .


Ten kod Haskell szuka właśnie najmniejszej liczby, która będzie równa sumie kodów ASCII jego cyfry. Wydaje mi się, że większość odpowiedzi tutaj padła z użyciem brutalnej siły.
Joey,

Można jeszcze bardziej zmniejszyć z 89 do 86 bajtów za pomocą:(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

Istnieją dwie zakładki między sayi 500. :)

(Uruchom jako jednowierszowy z perl -E, o ile mogę stwierdzić, że jest to zgodne z zasadami)


1
Podobają mi się 2 zakładki
Steve P.

5

Rubin, drukuje 380

p (380)

Brak końcowego znaku nowej linii po nawiasie zamykającym.




5

J, 150

?!6

Z zastrzeżeniem, że będzie to poprawne tylko 1/ 720 czasu.


3
Losowo na silniku 6? Hmmm, nie sądzę, Tim.
MPelletier


3

Element, 220

To jest język mojego własnego stworzenia i jest udokumentowany w mojej odpowiedzi na inne pytanie tutaj .

220`!

Oto instrukcja jego działania: 220wypycha tę liczbę na stos. Następnie outputs the top element of the stack. Theznak `` ! '' Wykonuje logiczne działanie na stosie kontrolnym (osobny stos), ustawiając go na 1.


2

PHP, drukuje 4440

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

2

PowerShell, drukuje 3902

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

Sprawdza aktualnie uruchomioną linię i sumuje wartości punktów kodowych.


2

INTERCAL, 1572

Nie mogę uwierzyć, że nikt jeszcze nie zrobił INTERCAL!

DOREADOUT#1572


DOGIVEUP

(Obejmuje zakończenie nowej linii.) Ten program drukuje MDLXXII.


1

Perl, drukuje 690

die 690 . $/

Lub, jeśli możemy opublikować jedno-linijki ( perl -E)

say(570)

Drukuje 570.

(Brak końcowych znaków nowej linii)


1

JavaScript, 1750 900 860 790

alert(790)

(Zwrot karetki (CR \rlub \x0D) po lub przed programem)

Programy te można znaleźć poprzez brutalne wymuszanie.

Większe wartości:

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

1

Java -128

Wiem, że czytanie standardowego wejścia jest niedozwolone, ale chciałem podać przykład, jak obliczyłem swój wynik.

Mój kod sumuje liczbę ASCII przekazanych przez stdin i wypisuje -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);}}

Brak końcowej nowej linii


Myślę, że twoja suma się przepełnia.
Alpha

1

Rubin, drukuje 300

p   300

Jest przestrzeń i zakładka pomiędzy pi 300. Brak końca nowej linii.


1

Pliki wsadowe, 500

ECHO  500

Zwróć też uwagę na dwie spacje między „ECHO” (celowo wielkie litery) i „500”.


1

C, 1700

Dziwne - nikt jeszcze nie opublikował rozwiązania w języku C (z wyjątkiem przykładu w pytaniu).

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

Brak nowej linii na końcu.


1

K ( 923 796 795 746 513)

Nie jestem pewien, czy to nie pasuje do zasad, czy nie. Nie używa standardowego wejścia, otwiera się jako wektor bajtów i sum.

+/1:.z.f

Stosowanie:

q scriptname.k

edycja 2012.05.08 - nie trzeba hsymować uchwytu pliku 2012.05.09 - zapisano 1 punkt, konwertując na bajty zamiast int

2012.06 - Można zapisać ładunek punktów, czytając plik jako bajt zamiast tekstu:


1

J 198

33*6

i

6*33

Znaleziono go brutalną siłą. W J nie ma 1 lub 2 znaków char, a jedynym rozwiązaniem jest 3-char 150. Poza wszelkimi błędami w moich poszukiwaniach, nie ma też innych rozwiązań 4-char.


Z kanału IRC #jsoftware, mieliśmy również <.%:10!20429, a samo-zliczający quine +/a.i.2#(,{:)'+/a.i.2#(,{:)'''w 1706 roku.


0

1160 r

Przywołany za pomocą echa i spacji, cały String, w tym 7 echo 1160 | bcspacji , ma bajt 1160.

echo 1160    |  bc

150 działa również dla bc:

echo "150" > 150
bc -q 150
150

0

D, 9752

ten faktycznie oblicza to podobnie jak mój 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

Biała spacja, 369

Ten 20-znakowy program wypisuje liczbę 369, która jest sumą wartości ascii jego znaków (które są znakami Tab, Space, Linefeed, tutaj symbolizowanymi odpowiednio przez T, S, L):

SSSTSTTTSSSTLTLSTLLL

(369 = 7 * 9 + 8 * 32 + 5 * 10, istnieje 7 tabulatorów, 8 spacji i 5 linii).


0

Haskell, 7518

Mała modyfikacja mojego quine :

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

0

Brainf * ck, 253 (lub 252)

Niewielka poprawa rozwiązania Petera Olsona:

---.H

Pod warunkiem, że nie można drukować, można go jeszcze ulepszyć, dodając a -i zastępując Hgo kodem ASCII 26.



0

Python, 5440

Najwyższy wynik wygrywa, prawda?

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

Pomyślałem, że i tak to opublikuję, b / c to rozwiązanie w połowie drogi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.