W wybranym języku programowania napisz 95 programów, z których każdy wyprowadza inny z 95 drukowanych znaków ASCII, przy czym znak ten nie występuje nigdzie w programie .
Na przykład, jeśli Twoim językiem był Python , twoim programem, który wypisuje znak, P
może być
print(chr(80))
ponieważ P
ma kod ASCII 80. Ten program jest prawidłowy, ponieważ P
nigdy nie pojawia się w kodzie źródłowym. Jednak w przypadku programu, który wyświetla małe litery p
, coś podobnego
print(chr(112))
byłby nieważny, ponieważ gdy to robi odcisk p
, p
jest obecny w kodzie. Poprawnym programem może być
exec(chr(112)+'rint(chr(112))')
który drukuje, p
ale nie zawiera p
.
Twoim celem jest, aby każdy z 95 programów był jak najkrótszy. Twój wynik to suma długości znaków wszystkich twoich programów.
Jeśli z jakiegoś powodu nie możesz napisać poprawnych programów dla niektórych znaków, możesz oznaczyć te znaki jako „Nie programowałem” lub DNP i całkowicie dla nich pominąć programy. W ten sposób języki ścisłe pod względem składni będą mogły konkurować.
Zwycięską odpowiedzią jest odpowiedź, która ma najniższy wynik z zestawu odpowiedzi, które mają najmniej DNP.
Zasady
Kod źródłowy wszystkich twoich programów może zawierać tylko drukowalne ASCII oraz tabulatory i znaki nowej linii, z których wszystkie są liczone jako jeden znak. (Ponieważ w innym kodowaniu łatwo byłoby pominąć znaki, które nie istnieją!)
- Uwaga: ta reguła wydaje się konieczna, ale istnieje wiele języków z różnymi kodowaniami i jestem pewien, że fajnie byłoby znaleźć na nie odpowiedzi. Dlatego możesz złamać tę zasadę , możesz użyć dowolnych postaci, ale wtedy twoja odpowiedź staje się niekonkurencyjna , nie może wygrać.
Programy muszą być rzeczywistymi, pełnymi programami , zgodnie ze standardowymi konwencjami Twojego języka. Funkcje i fragmenty REPL są niedozwolone.
Wyjście każdego programu powinno przejść do standardowego wyjścia lub do akceptowanej przez Twój język alternatywy.
Programy nie powinny monitować ani wymagać wprowadzania danych. (Jeśli monitowanie o wpisanie jest nieodłączne dla twojego języka, to jest ok.)
Programy powinny być deterministyczne, skończone w czasie wykonywania i niezależne. np. nie powinno mieć znaczenia, czy jeden jest uruchomiony w folderze innym niż inne programy.
Wyjście programu powinno być dokładnym drukowalnym znakiem ASCII, któremu odpowiada, opcjonalnie po nim pojedynczy znak nowej linii, nic więcej, nic więcej.
Pamiętaj, aby w odpowiedzi podać informacje o wszystkich 95 (idealnie) programach, a także wynik i wszelkie DNP. Nie trzeba do listy wszystkich programów, które następują prosty wzór w stylu „ , ...”, ale upewnij się, że jesteś pewien, że wszystko będzie działać i że wynik jest dodawany poprawnie.print(chr(80))
print(chr(81))
print(chr(82))
Dla porównania, oto 95 ASCII do wydrukowania, które twoje programy muszą wydrukować:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
źródło
0
Odpowiedzi:
Python 2,
10751065104310401039 bajtówKażdy program ma formę
print'\<octal char code>'
, z wyjątkiem:'
→print"\47"
0
przez8
→print~-<N+1>
9
→print-~8
\
→print'%c'%92
i
→exec'pr\151nt"\151"'
n
→exec'pri\156t"\156"'
p
→exec'\160rint"\160"'
r
→exec'p\162int"\162"'
t
→exec'prin\164"\164"'
Dla odniesienia i łatwości testowania, oto pełna lista programów oddzielonych znakiem nowej linii.
Testować:
-1 bajtów dzięki @ Sp3000!
źródło
print~-<N+1>
nie działa dla1
. Mówiłeś, że to działa dla0
celu8
.<angle brackets>
nie jest dosłowny. Zastąp<N+1>
literalną wartościąN+1
; w tym przypadku programem1
byłbyprint~-2
. Zobacz pełną listę programów.CJam, 269 bajtów
Każdy z programów ma formę,
'<char - 1>)
z wyjątkiem:S
, 1 bajt'
=>39c
, 3 bajty)
=>'*(
, 3 bajty0
=>T
, 1 bajt1
=>X
, 1 bajt2
=>Y
, 1 bajt3
=>Z
, 1 bajt4
-9
=><num-1>)
, 2 bajtyWynik to:
3 * 82 + 1 + 3 + 3 + 4 * 1 + 6 * 2 = 269
źródło
39c
dla'
?1)
do2
etc, aby zapisać tam jeden bajt1)
miałem na myśli takTXYZ
Ograniczony ASCII kod maszynowy x86 dla DOS,
310431012913 bajtówCóż ... Myślę, że jest krótszy niż Java
3230 bajtów na prawie wszystkie znaki, wyjątki patrz poniżej.W większości przypadków jest to zgodne z następującym wzorem:
xor
aby uzyskać wskaźnik do końca.sub
z ostatnich 2 słów, ponieważ kod operacji dlaint
nie znajduje się w ASCII.AH
a postać doDL
. Oba sąxor
edytowane, ponieważ sam znak nie może pojawić się w programie, a 2 nie jest drukowalnym znakiem ASCII.int 21h
int 20h
W większości przypadków, jeśli znak jest niedozwolony, można go zastąpić albo trochę kręcąc danymi, albo przechodząc do innego rejestru.
Staje się to trochę bardziej interesujące, gdy nagle okazuje się, że nie jesteś w stanie odjąć lub nie możesz pchnąć lub pop jedynego rejestru używanego do obliczeń ...
źródło
Brainfuck,
1770171017031686 bajtów60 bajtów zapisanych przez Dennisa
17 bajtów zapisanych przez Sp3000
DNP: 46 (
.
)Wszystkie oprócz 43, 45, 60, 62, 91 i 93 są bezwstydnie skradzione z Esolangs.org
źródło
--[>-<---]>[<->--]<[->-<]>.
działa na wyjściu+
.-----[[----<]>>-]<.
+[+[+>]<<++++]>.
MATL,
305, 302, 300297 bajtówKażdy program wygląda następująco:
Z wyjątkiem
Cyfry Oto programy dla 0-9:
'do'. Ten program jest
przestrzeń. To jest
Od dzisiaj dowiedziałem się, że MATL traktuje postać 0 jako spację. Dzięki @LuisMendo!
Możesz użyć matl.tio do weryfikacji dowolnego z nich.
Dla porównania, oto wszystkie z nich:
źródło
Java 8,
679865826577 bajtówwestchnienie
Jest to w zasadzie port mojej odpowiedzi w Pythonie 2 , ale ze wszystkimi podstawowymi elementami, które pochodzą z pisania pełnego programu w Javie.
Teraz w ogóle bez DNP! Dzięki, Kevin Cruijssen!
Większość programów ma postać
interface A{static void main(String[]a){System.out.print("\<octal char code>");}}
, z wyjątkiem:interface\tA{static\tvoid\tmain(String[]a){System.out.print("\40");}}
(ale z\t
s zastąpionymi surowymi tabulatorami)"
→interface A{static void main(String[]a){System.out.print('\42');}}
(
→interface A{static void main\u0028String[]a){System.out.print\u0028"\50");}}
)
→interface A{static void main(String[]a\u0029{System.out.print("\51"\u0029;}}
.
→interface A{static void main(String[]a){System\u002Eout\u002Eprint("\56");}}
0
→interface A{static void main(String[]a){System.out.print(1-1);}}
1
→interface A{static void main(String[]a){System.out.print(3-2);}}
2
→interface A{static void main(String[]a){System.out.print(3-1);}}
3
→interface A{static void main(String[]a){System.out.print(4-1);}}
4
→interface A{static void main(String[]a){System.out.print(5-1);}}
5
→interface A{static void main(String[]a){System.out.print(6-1);}}
6
→interface A{static void main(String[]a){System.out.print(7-1);}}
7
→interface A{static void main(String[]a){System.out.print(8-1);}}
8
→interface A{static void main(String[]a){System.out.print(9-1);}}
9
→interface A{static void main(String[]a){System.out.print(8+1);}}
;
→interface A{static void main(String[]a){System.out.print("\73")\u003B}}
A
→interface B{static void main(String[]a){System.out.print("\101");}}
S
→interface A{static void main(\u0053tring[]a){\u0053ystem.out.print("\123");}}
[
→interface A{static void main(String...a){System.out.print("\133");}}
\
→interface A{static void main(String[]a){System.out.print((char)92);}}
]
→interface A{static void main(String...a){System.out.print("\135");}}
a
→interf\u0061ce A{st\u0061tic void m\u0061in(String[]b){System.out.print("\141");}}
c
→interfa\u0063e A{stati\u0063 void main(String[]a){System.out.print("\143");}}
d
→interface A{static voi\u0064 main(String[]a){System.out.print("\144");}}
e
→class A{public static void main(String[]a){Syst\u0065m.out.print("\145");}}
f
→class A{public static void main(String[]a){System.out.print("\146");}}
g
→interface A{static void main(Strin\u0067[]a){System.out.print("\147");}}// \u0067
i
→\u0069nterface A{stat\u0069c vo\u0069d ma\u0069n(Str\u0069ng[]a){System.out.pr\u0069nt("\151");}}
m
→interface A{static void \u006Dain(String[]a){Syste\u006D.out.print("\155");}}
n
→class A{public static void mai\u006E(Stri\u006Eg[]a){System.out.pri\u006Et("\156");}}
o
→interface A{static v\u006Fid main(String[]a){System.\u006Fut.print("\157");}}
p
→interface A{static void main(String[]a){System.out.\u0070rint("\160");}}
r
→class A{public static void main(St\u0072ing[]a){System.out.p\u0072int("\162");}}
s
→interface A{\u0073tatic void main(String[]a){Sy\u0073tem.out.print("\163");}}
t
→class A{public s\u0074a\u0074ic void main(S\u0074ring[]a){Sys\u0074em.ou\u0074.prin\u0074("\164");}}
u
→interface A{static void main(String[]a){System.console().printf("%c",117);}}
v
→interface A{static \u0076oid main(String[]a){System.out.print("\166");}}
y
→interface A{static void main(String[]a){S\u0079stem.out.print("\171");}}
{
→interface A\u007Bstatic void main(String[]a)\u007BSystem.out.print("\173");}}
}
→interface A{static void main(String[]a){System.out.print("\175");\u007D\u007D
Uff
Kompilator Java przetwarza znaki ucieczki Unicode, podobnie jak
\u007B
przed jakimkolwiek innym przetwarzaniem, co umożliwia pisanie kodu, który używa znaków ucieczki Unicode w identyfikatorach, a nawet słowach kluczowych. Tak więc, aby napisać program, który nie używa znaku znajdującego się na tablicy, po prostu podstawiamy go znakiem ucieczki Unicode.Dla odniesienia i łatwości testowania, oto pełna lista programów, oddzielonych znakiem nowej linii, z surowymi tabulatorami zastąpionymi czterema spacjami:
Zauważ,
u
że korzysta z tego programSystem.console()
, który zwróci null (a tym samym spowoduje wyrzucenie kodu aNullPointerException
), jeśli wywołasz go z innego niż natywny terminal twojego systemu operacyjnego (cmd
w Windows i, jak zakładam,bash
w Linux / OSX) .Aby przetestować, utwórz nowy katalog i umieść powyższy kod w pliku o nazwie
printables
w tym katalogu. Następnie uruchom następujący skrypt Bash:Powyższy skrypt umieści każdą linię
printables
we własnym katalogu, nazwie je wszystkieA.java
(z wyjątkiem pliku, który drukujeA
, którego nazwa została zmienionaB.java
), skompiluje każdy plik, uruchomi go, a następnie usunie dowód. Zacznie się pojawiać w powłoce drukowanych znaków ASCII około dziesięciu sekund.Jeśli korzystasz z systemu Windows, uruchom następujący plik wsadowy:
Ten plik wsadowy ma nieco inne podejście; zamiast wstępnie dzielić linie, przetwarza plik linia po linii, kompiluje i uruchamia kolejno każdy program. Ponownie usuwa dowody po zakończeniu.
Oszczędność niezliczonych bajtów + 1 DNP dzięki Kevin Cruijssen!
źródło
class B
do drukowaniaA
interface
zamiast klasy, abyś mógł usunąćpublic
) i jeśli twój system operacyjny ma wbudowaną konsolę, więc nie musisz używaćSystem.out.print
:interface A{static void main(String[]a){System.console().printf("%1",(char)117);}}
Eclipse, IntelliJ a kompilatory online nie mają tej konsoli, co powoduje, żeNullPointerException
.print
> <> ,
443437 bajtówLink do tłumacza TIO . Tutaj jest wiele wzorów:
[num][num]*o;
: Mnożenie dwóch liczb, a następnie wyprowadzanie wyniku jako znaku za pomocąo
i zatrzymywanie za pomocą;
. > <> cyfry zwiększają się do 15, tj0123456789abcdef
.[num][num]-n;
, która przyjmuje różnicę między dwiema liczbami i wyjściami jako liczbą zn
zamiast.'-o[invalid char]
: > <> jest toroidalne, więc kiedy wskaźnik instrukcji osiągnie koniec linii, przesuwa się z powrotem na początek. W takim przypadku powoduje to wykonanie kodu dwukrotnie, tj'-o[char]'-o[char]
. Pierwsza'-o[char]'
część wypycha trzy znaki na stos,-
oblicza,'o' - [char]
a następnieo
podaje wynik jako znak. > <> następnie pojawia się błąd po osiągnięciu[char]
, albo z powodu nierozpoznanego polecenia, albo z powodu wyskakiwania pustego stosu.'-n[invalid char]
, który wyprowadza jako liczbę.'[num][op]o[invalid char]
, co ma zastosowanie[op]
przy[num]
włączeniu[char]
, błąd na char. Na przykład dane'2+oJ
wyjścioweL
, czyli o dwa więcej niżJ
.'
Kod to"-oH
, używając"
zamiast tego.-
Kod to'%oB
, używając%
zamiast tego.ln;
: Naciśnij długość stosu, wyprowadzaj jako num, a następnie zatrzymaj, dając0
. Podobnielln;
dla1
i'ln;
dla3
.4|n+
: Naciśnij 4, odbij się|
i naciśnij kolejne 4, dodaj, a następnie8
wyślij jako num. Odbij się|
ponownie i popełnisz błąd, próbując wykonaćn
ponownie na pustym stosie.3|n*
dla9
.[num]|o*
dla@Qdy
.'1-:00p
: Najciekawszy dlao
przypadku. Aby uniknąć używaniao
w naszym kodzie, musimy użyć,p
aby umieścićo
w codcode, a następnie uruchomić go. Inicjał'1-:00p'
ustawia stos tak, aby byłp
na wierzchu, i1-
zmniejsza go do postacio
.:
powiela too
i00p
ustawia jedeno
na (0, 0), zamieniając codbox wo1-:00p
. Wskaźnik instrukcji ponownie się zawija, wyprowadzając drugio
. Znak (0, 0) jest następnie zamieniany jeszcze kilka razy, zanim program w końcu wyskoczy.źródło
Dyalog APL ,
527522 bajtów(niekonkuruje, ponieważ APL nie można tak naprawdę napisać tylko przy użyciu ASCII)
Większość ma format
nn⊃⎕AV
lubnnn⊃⎕AV
wyjątki to:Oto cała lista:
źródło
⍨
to moja nowa ulubiona buźkaRubinowy, 869 bajtów
Do 63 znaków
@
poprzez~
mamy rozwiązanie 10-bajtowy:Dla większości (21) postaci z
space
pośrednictwem?
, mamy rozwiązanie 9-bajtowy:Pozostało jedenaście przypadków specjalnych:
Łącznie wynik wynosi 10 × 63 + 9 × 21 + 10 + 3 + 8 × 4 + 5 = 869.
źródło
?\xxx
zamiast"\xxx"
1 bajtu.p 1+8
niep-~8
?-
lub coś w tym rodzaju. :(putc 65
=>A
WolframAlpha , 368 bajtów
Ogólny format:
Wyjątki:
Oto pełna lista:
źródło
PHP (
891680674 bajtów,20 DNP)Edycja: zapisano 203 bajty dzięki jimmy23013 i zaimplementowałem 2 DNP dzięki Mego
Ta odpowiedź mocno narusza hojną naturę PHP. Większość przypadków przyjmuje jedną z następujących form (po 7 bajtów):
PHP konwertuje litery po obu stronach operatora na łańcuchy, a następnie wykonuje odpowiednią operację bitową, konwertując każdy łańcuch na wartość znaku ASCII, a na koniec konwertuje wynik z powrotem na znak.
W pierwszym przykładzie powyżej
Y^x
staje się89^78
. Wynikiem tego jest33
, który jest następnie wysyłany do STDOUT jako znak!
.Skrypt został napisany, aby bruteforce wszystkich możliwych kombinacji: wyniki można znaleźć tutaj .
Wyjątki:
;
is<?=Z^a?>
(8 bytes)|
is<?='9'^E;
(9 bytes)<
i?
normalnie byłby DNP z powodu wymaganego znacznika początkowego, ale przy użyciu-r
flagi można wykonać kod bez nich:<
isecho Z^f;
(9 bytes)?
isecho Z^e;
(9 bytes)=
isecho Z^g;
(9 bytes)Wynik:
(7 * 90) + 8 + 9 + 9 + 9 + 9 = 674 bajtów
źródło
&
|
^
między dwiema literami, aby wygenerować wszystkie drukowane znaki ascii oprócz<?=|;
.~
zamiast XOR, AND lub OR. PHP może używać większej liczby znaków do wydrukowania jako stałych, niż tylko liter.Brachylog ,
546477 bajtówKredyty do Fatalize dla kodu dla
@
.Na poniższej liście pierwszym znakiem jest znak, który ma zostać wydrukowany (dla ułatwienia).
Wszystkie są predykatami, więc
Z
musi być argumentem do otrzymania wyniku: Wypróbuj online!Wyjaśnienie
@P
to ten ciąg:który zawiera każdy drukowany kod ASCII.
źródło
"@"
ten sposób> <> , 531 bajtów
Programy przyjmują dwie główne formy:
Pierwszy dotyczy znaków o kodach znaków z dwoma czynnikami, których oba są mniejsze niż 16, drugi dotyczy pozostałych przypadków. Większość liczb, dla których używam drugiego formularza, ma wiele rozwiązań o równej długości, ale wybrałem ten dla czytelności.
Wyjątki:
Pełna lista:
źródło
;
zastosowania;
. Poza tym jestem całkiem pewien, że większość z nich można pograć w błąd, popełniając błąd io
jest to zdecydowanie możliwe.o
iO
nie widzęo
możliwości. A w jaki sposób zakończenie błędu byłoby krótsze?o
można to zrobić, korzystając zp
. Mogę publikować osobno za błędy, ponieważ prawdopodobnie będzie w to wiele różnych wzorów.;
program. Dzięki za zwrócenie na to uwagi!Sześciokąt ,
376373 bajtów, 1 DNPDzięki FryAmTheEggman za oszczędność 3 bajtów.
Prawie wszystkie programy mają tę samą formę:
Jest jednak kilka wyjątków:
;
bez użycia;
, stąd 1 DNP.@
, nie możemy użyć@
do zakończenia programu. Zamiast tego używamy alboS2;:
alboS3;%
. Kończy się to błędem dzielenia przez zero, ale błąd ten nie jest widoczny w STDOUT. To wciąż cztery bajty.U
które wymagałobyU3;@
. Istnieje kilka sposobów rozwiązania tego problemu, w tym przejście na małe litery, tj.n9;@
Użycie przyrostu lub zmniejszenia, tj .T);@
LubV(;@
. W każdym razie to wciąż cztery bajty.0
, i!
drukuje wartość całkowitą, więc możemy dostać0
i1
z!@
i)!@
, odpowiednio, oszczędzając 3 bajty.Jeśli chodzi o działanie
<letter><digit>;@
programów: sześciokątny układ programu formularza1234
jest zawszePonieważ żaden z programów nie zawiera poleceń przekierowujących przepływ sterowania, są to po prostu programy liniowe, które są wykonywane po kolei.
W każdym przypadku litera na początku kodu ustawia bieżącą krawędź pamięci na kod znakowy. Np w programie
P1;@
, żeP
ustawia wartość80
. Następnie cyfra mnoży tę wartość przez 10 i dodaje siebie (tj. Cyfra jest dołączana do bieżącej wartości). To daje801
w powyższym przykładzie. Na koniec;
wypisuje tę wartość, biorąc ją modulo 256 i wykorzystując jako wartość bajtową. W tym przypadku drukowane jest801 % 256 = 33
a!
.źródło
Biała spacja , 1643 bajty, 1 DNP
17 bajtów na znaki [33-63] i 18 bajtów na znaki [64-126]
W Whitespace jest to proste, ponieważ znaki do wydruku (oprócz spacji) i tak nie mają żadnego znaczenia:
Powyższy program wypisuje „!” (100001b). Zmień
[TAB][SPACE][SPACE][SPACE][SPACE][TAB]
w pierwszym wierszu na dowolny znak, który ci się podoba. Nie można wydrukować spacji bez użycia spacji, ponieważ drukowanie czegokolwiek zawsze zaczyna się od[TAB][LF][SPACE]
źródło
Siatkówka , 712 bajtów, 2 DNP
To był wspólny wysiłek z FryAmTheEggman.
Istnieje kilka klas rozwiązań. W przypadku większości znaków od spacji do
^
używamy programu o następującej formie:Znak w drugim wierszu przechodzi przez zakresy,
_0-9A-Za-z
podczas gdy reszta pozostaje niezmieniona. To przekształca puste dane wejściowe w ten znak, a następnie zastępuje go drukowalnym znakiem ASCII (reprezentowanym przezp
) w odpowiedniej pozycji. Każdy z tych programów ma 8 bajtów.W tym zakresie jest tylko kilka wyjątków. Co najważniejsze, cyfry można skrócić:
x
(liczy liczbęx
sw pustym wejściu)(weehoo, pusty program; zlicza liczbę pustych dopasowań w pustym wejściu)
2: teraz przekształcamy dane wejściowe w pojedynczy znak, przed zliczeniem pustych ciągów:
3: to samo, ale przekształcamy dane wejściowe na dwa znaki:
4: masz pomysł ...
5 - 9: zwrot akcji ... używamy powtarzania postaci, aby uniknąć wydłużenia drugiej linii:
...
Innym wyjątkiem jest
T
DNP: nie sądzimy, że możliwe jest wygenerowanie znaku innego niż cyfrowy bez jego pojawienia się w kodzie źródłowym, jeśli etapy transliteracji nie mogą być użyte.Do pozostałych postaci. Do drukowania
_
używamy podobnego programu jak powyższe ogólne rozwiązanie:Wykorzystując fakt, który
w
zaczyna się od_
.Następnie
`
jest drugi DNP, ponieważ etapy transliteracji również je wymagają.Następnie większość małych liter jest drukowana za pomocą czegoś takiego (który drukuje
a
):Znów znak w drugim wierszu zwiększa się o
_0-9A-O
. Tutaj musimy tylko uważaćl
iw
, które możemy wydrukować odpowiednio za pomocą następujących programów:Na koniec pozostały tylko
{|}~
te, które wymagają 9 bajtów. W tym przypadku wykorzystujemy etap transliteracji, aby zwiększyć znak, który je poprzedza. Np.~
Można wydrukować za pomocą:źródło
Pyke,
364362355 bajtówWszystko w formie
w<chr(charcode+32)>.C
(4 bajty), z wyjątkiem:->
d
1 bajt0
->Z
1 bajt1
->~W
2 bajtya
->Gh
2 bajtyz
->Ge
2 bajtya
) w formieG<number>@
(3 bajty)k
->GT@
3 bajty>
->~Bh
3 bajty]
->~Be
3 bajtyZ
->~le
3 bajty9
->~ue
3 bajtyw
->G22@
4 bajty.
->~B4@
4 bajtyC
->~K38@
5 bajtówTłumacz online Pyke
źródło
JavaScript (ES6),
10831068 bajtówOgólna forma:
Wyjątki:
Edycja: Zapisano 15 bajtów dzięki @ GOTO0.
źródło
alert(atob`XA`)
dla „\”, aby zapisać kilka bajtów.x
.\u
ucieczki w kodzie źródłowym? Cool05AB1E , 417 bajtów
Wyjaśnienie
Większość z nich jest 5 bajtów w postaci:
convert nr to base nr+1
.>
potrzebuje dodatkowego bajtu, ponieważ nie możemy do tego użyć przyrostu.a,b,x,y,z,Y,Z
są wyodrębniane, zA
których zawiera małe litery alfabetu.A,B,C,D,E,F
to liczby przeliczone na szesnastkowe.0-9
są prostymi przyrostami / zmniejszeniami, a także predefiniowanymi zmiennymi.źródło
Cudowny, 220 bajtów
W przypadku znaku, który nie jest cyfrą, są to tylko dwie wielkie cyfry szesnastkowe kodu znaku. Na przykład następujące wyniki programu
A
:W przypadku cyfry, która nie jest
3
, zastąp2F
następujący kod dużymi cyframi szesnastkowymi kodu znaku - 1:Dla
3
:Łączny wynik: 2 * 85 + 5 * 10 = 220.
Interpretator.
Moja pierwsza próba była Bubblegum i nie działała wcześniej dla postaci
?
...źródło
Perl 6: 921 bajtów
Tłumaczenie rozwiązania Python.
Każdy program ma formę
say "\x<hex escape code>"
, z wyjątkiem:s
→put "\x73"
a
→put "\x61"
y
→put "\x79"
→
"\x20".say
"
→say chr 34
\
→say chr 92
x
→say chr 120
0
→say 1-1
1
→say 3-2
2
do9
→say <n minus one>+1
Dla odniesienia i łatwości testowania, oto pełna lista programów oddzielonych znakiem nowej linii.
Oto kod, którego użyłem do przetestowania powyższej listy i policzenia wyniku:
źródło
say
wymagana jest spacja po, a ósemkowe sekwencje specjalne są zapisywane jako\o77
. NieHaskell,
1874 1864 1856 1855 1795 17911589 bajtów, 7 DNPWiększość programów to
main=putChar '\xx'
lubmain=putChar '\xxx'
gdziexx
/xxx
jest kodem ASCII znaku, który ma zostać wydrukowany. Działa to dla wszystkich znaków oprócz 14:Jednak dla cyfr można zapisać
1 74 bajtów (dzięki Christian Sievers!):52 programy do
c
(kod 99) zajmują 18 bajtów, a pozostałe 19 zajmuje 19 bajtów.Częściowy wynik:
10*14 + 52*18 + 19*19 = 1437
W przypadku 7 pozostałych znaków działają następujące programy:
Częściowy wynik:
18 + 22 + 18 + 21 + 19 + 27 + 27 = 152
Pozostawia to 7 DNP:
=aimnrt
Każdy program Haskell musi zdefiniować main (
main=
), więc jest to 5 DNP. Aby drukować na standardowe,putChar
,putStr
lubinteract
mogą być stosowane, otrzymująct
ar
jako dalsze DNPS. (Jest teżprint
, aleprint 'a'
drukuje,'a'
a niea
- i zawierat
ir
tak.) Haskell ma równieżchr
funkcję, która zwraca odpowiedni znak podany w liczbie, jednak aby go użyć,import Data.Char
jest potrzebny.Łączny wynik
1437 + 152 = 1589
:, 7 DNPźródło
main=print$1-1
itd.succ
)BBC Basic,
422413 bajtówPobierz tłumacza bezpłatnie ze strony http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
9 bajtów zapisanych dzięki Dziurawej Zakonnicy.
Ogólna forma
32..99 z wyłączeniem 12 specjalnych przypadków: 56x4 = 224 bajty
100..126 : 27x5 = 135 bajtów
12 przypadków specjalnych: 54 bajty
Większość liczb jest zgodna z ogólną formą, ale umieściłem je tutaj, aby pokazać, gdzie jest problem.
Pierwszy znak to znak, który ma zostać wydrukowany.
źródło
V.48
z0
?V.
czyP.
polecenia i zawsze tam były?.
, zmienia się w słowo kluczowe. To wyzwanie jest ściśle związane z użyciem niedrukowalnego ASCII, ale prawdopodobnie przy innych wyzwaniach można powiedzieć, że tokenizowane słowa kluczowe (ascii 127-255) były jednym bajtem. To powiedziawszy, nigdy nie próbowałem tego argumentu i zwykle podaję oba wyniki.Minkolang 0,15 , 604 bajtów
Dla większości znaków
"<char-1>"1+O.
byłby to prawidłowy program, być może jeden z najkrótszych. Jednak ze względu na fakt, że znaki są przechowywane jako punkty kodowe na stosie, oznacza to, że wiele z nich można wytworzyć przez pomnożenie i dodanie, w pięciu lub mniej bajtach. Należy również pamiętać, żel, $1, $2, $3, $4, $5, $6, $l
są10, 11, 12, 13, 14, 15, 16, 100
odpowiednio.Format:
<character>: <program>
Specjalne wzmianki:
(Spróbuj.) Minkolang ma możliwość modyfikowania znaków w polu kodu, więc program ten zastępuje go
-
na końcu.
, co jest konieczne do zatrzymania programu."N"1+d90pN.
dlaO
działa w ten sam sposób.(Spróbuj.)
lZ
Wypycha na stos wielkie i małe litery orazI
wypycha długość stosu, która wynosi 52, dokładnie punkt kodowy „4”. Najlepsze jest to, że początkowo zastanawiałem się nad rozwiązaniem4$3*O.
, które zwielokrotnia 4 i 13, aby uzyskać 52, ale nie mogłem, ponieważ zawierało 4, więc ostatecznie znalazłem rozwiązanie dla golfistów!(Spróbuj.)
d
Powiela górę stosu, więc ten fragment kodu robi to, że wypycha11
, powiela go, a następnie mnoży. Alternatywnym sposobem na napisanie tego byłoby użycie$12;O.
tej samej liczby bajtów.(Spróbuj.)
;
To potęgowanie, więc robi to 5 ^ 3, aby uzyskać 125.źródło
Groovy, 1019 bajtów
Miałem już napisane inne rozwiązanie Groovy (patrz poniżej), ale po jego przesłaniu zacząłem nieco bardziej zagłębiać się w ucieczki postaci, mając nadzieję, że znajdę sposób na skrócenie programu i odkryłem, że Groovy ma ósemkową ucieczkę postaci, którą ja nie wiedziałem. To znacznie upraszcza kod, do tego stopnia, że niestety eliminuje potrzebę prawie wszystkich dziwacznych obejść, które wymyśliłem.
Wygląda również prawie identycznie jak rozwiązanie Copper's Python 2 , do tego stopnia, że wygląda na to, że plagiatowałem ich pracę. Ugh.
Każdy program ma formę
print'\<octal value>'
, z wyjątkiem:p
,r
,i
,n
,t
→'print''\<octal value>'
(ale z literą dopasowującej „print” również zastąpić wartości ósemkowej)0
-9
→print~-<next int>
Oto pełna lista programów według postaci.
Groovy, 1130 bajtów
Mój poprzedni program, zanim odkryłem, że istnieją ósemkowe ucieczki. O wiele bardziej interesujące, IMO.
Każdy program ma formę
print(--'<next char>')
, z wyjątkiem:-
,[
,~
→print(++'<previous char>')
&
→print(--"'")
p
,r
,i
,n
→System.out<<--'<next char>'
t
→'prin\u0074'(--'u')
(
→print'\u0028'
)
→print'\u0029'
0
-9
→print~-<next int>
Oto pełna lista programów dla każdej postaci:
źródło
Właściwie ,
383382381 bajtów1 bajt dzięki Mego.
Dla ułatwienia pierwsza kolumna to kod znaku, druga kolumna to znak, a trzecia kolumna to kod.
Kod
0
to pojedyncza spacja.Wypróbuj online!
Sugestie dotyczące gry w golfa są mile widziane.
źródło
:
w 5:9P2*c
Fouriera, 306 bajtów, 1 DNP
Prawie wszystkie programy są zgodne ze wzorem, w
na
którym n jest kodem znaków dla każdego ze znaków. Na przykład:Wypróbuj online!
Wymienię więc wyjątki:
0 (zero)
Ponieważ akumulator jest ustawiony na zero, możemy to wyświetlić za pomocą jednego znaku:
Wypróbuj online!
1
Podobnie do zera, zwiększa to akumulator, aby uzyskać 1.
Wypróbuj online!
5
Kod ASCII dla 5 to 53, więc musiałem obejść to:
Wypróbuj online!
za
Ponieważ
a
jest to funkcja wyjściowa znaków, nie ma innego sposobu na utworzenie znaku a, więc to mój jedyny NIE ZOSTAŁ PROGRAM .Zobacz wszystkie programy tutaj
źródło
Matlab,
12381224 bajtów, 2 DNPGłówny wzór to:
W przypadku cyfr jest nieco krótszy:
Dla postaci
[]'
to:Znaki
ds
zdisp
są wyświetlane przy użyciufprintf
( dzięki @Stewie Griffin );ip
jednak należą również tam, więc zmieniam ciąg i używameval
:Oba znaki
()
są jednak niezbędne dladisp
lubeval
, więc są DNP.Dla porównania cała lista:
źródło
[100 105 115 112]
(kody znaków)disp
?disp([100 105 115 112])
nie wytworzy również łańcuchaeval([100 105 115 112])
.fprintf
do ans d s:fprintf([115,''])
. Zapisuje 2x7 bajtów =) Nie sprawi, że będzie to zwycięskie zgłoszenie, ale hej: 14 bajtów to 14 bajtów ,,,disp([0 ''])
zawiera spację.disp([0,''])
nie.fprintf
.Galaretka (niekonkurencyjna), 406 bajtów
Spowoduje to wydrukowanie wszystkich znaków od 32 do 126. Liczba bajtów jest obliczana za pomocą https://mothereff.in/byte-counter .
Wypróbuj online!
źródło
In a programming language of your choice, write 95 programs, each of which outputs a different one of the 95 printable ASCII characters without that character occurring anywhere in the program.
Befunge-93, 530 bajtów
Najprostszym sposobem na wyprowadzenie znaku, bez jego użycia, jest obliczenie wartości ASCII i użycie polecenia
,
(wyjście postaci) do jej renderowania. Na przykład,49*,@
wyświetla znak dolara (ASCII 36, 4 * 9). Jest to jednak rzadko najbardziej optymalne, ponieważ większość wartości wymaga więcej niż 3 bajtów do obliczenia.Innym sposobem wygenerowania liczby w 3 bajtach jest skorzystanie z faktu, że polecenie
g
(get) w pierwszej komórce pola gry wygeneruje wartość ASCII g (przyjmuje się, że pusty stos jest wypełniony zerami, więc jest to odczyt wartości pola gry przy 0,0). W ten sposóbg1+,@
dostajesz h ig1-,@
dostajesz f . To oczywiście działa dla wielu przesunięć i operacji innych niż+
i-
są również możliwe. Na przykładg3/,@
dostajesz podwójną wycenę.Odmianą tego jest poprzedzenie
g
innego polecenia, które pozostawia wszystkie zera na stosie. Więc nadal odczytujesz wartość z pola gry na 0,0, ale czytana postać jest teraz inna. To kosztuje jeszcze jeden bajt, ale zapewnia dostęp do wielu innych wartości. Na przykład,0g1-,@
dostaje ukośnik i:g1+,@
średnik. Inne realne prefiksy obejmują*
,+
,-
,>
,\
i_
. I jeszcze raz zauważ, że możliwe są inne operacje:>g2*,@
zdobędziesz pionowy pasek.Kolejną odmianą jest poprzedzenie literą
g
a1
, więc już nie czytasz już od 0,0, ale z pustej komórki przy 0,1. W Befunge puste komórki są domyślnie inicjowane spacjami, więc1g,@
dostajesz spację i1g1+,@
wykrzyknik.W przypadku postaci cyfrowych możemy zastosować bardziej wątpliwą sztuczkę. Zamiast wyprowadzać je jako znaki, wyprowadzamy je jako liczby (łatwiej jest wygenerować małą liczbę niż jej odpowiednik ASCII). Na przykład
11+.@
daje 2 , aw szczególności zwróć uwagę na przypadki szczególne:.@
dla 0 i!.@
dla 1 . Wątpliwą częścią tego jest to, że wynik liczbowy w Befunge zawiera spację po liczbie, więc nie jest to wynik czystych znaków.Inną wątpliwą sztuczką, której możemy użyć, jest odmiana
g
powyższej techniki. Zamiast ograniczać się do poleceń Befunge dla prefiksu, możemy technicznie użyć dowolnej postaci, która nie jest poleceniem Befunge. W większości interpreterów nierozpoznane polecenie zostanie zignorowane, więcg
zakończy się odczytaniem wartości ASCII poprzedniego znaku. To pozwala nam generować większość innych wartości ASCII, których inaczej nie można obliczyć w 3 bajtach. Jako jeden przykład:Qg1+,@
dostajesz R. .Wreszcie są trzy przypadki szczególne. G nie mogą być generowane w mniej niż 5 bajtów, więc musimy uciekać się do
"f"1+,@
. Przecinek jest najbardziej skomplikowane, wymagające dynamiczna modyfikacja planszy:0g4-:80p @
. Możemy użyć podobnej techniki, aby uniknąć znaku at, ale bardziej efektywnym hackiem jest użycie polecenia%
(modulo) jako terminatora, tj88*,%
. Kiedy%
zostanie osiągnięty, na stosie nie ma nic, więc obliczenie modulo generuje podział przez zero, a na interpretera referencyjnym spowoduje to zakończenie programu.Poniżej znajduje się pełna lista programów, po jednym w wierszu.
źródło