Schreiben Sie in einer Programmiersprache Ihrer Wahl 95 Programme, von denen jedes ein anderes der 95 druckbaren ASCII-Zeichen ausgibt, ohne dass dieses Zeichen irgendwo im Programm vorkommt .
Wenn Ihre Sprache beispielsweise Python war , P
könnte es sein , dass Ihr Programm das Zeichen ausgibt
print(chr(80))
weil P
hat ASCII-Code 80. Dieses Programm ist gültig, weil P
nie im Quellcode erscheint. Allerdings für das Programm, das Kleinbuchstaben ausgibt p
, so etwas wie
print(chr(112))
wäre ungültig , weil, während es gedruckt wird p
, p
in dem Code. Ein gültiges Programm könnte sein
exec(chr(112)+'rint(chr(112))')
was druckt p
aber nicht enthält p
.
Ihr Ziel ist es, jedes Ihrer 95 Programme so kurz wie möglich zu halten. Ihre Punktzahl ist die Summe der Zeichenlängen aller Ihrer Programme.
Wenn Sie aus irgendeinem Grund keine gültigen Programme für bestimmte Zeichen schreiben können, können Sie diese Zeichen als "Nicht programmiert" oder " DNP " markieren und Programme für diese Zeichen vollständig weglassen. Auf diese Weise können syntaktisch strenge Sprachen miteinander konkurrieren.
Der Gewinn Antwort ist die Antwort , die die niedrigste Punktzahl hat von der Menge der Antworten , die die wenigsten DNP sind haben.
Regeln
Der Quellcode aller Ihrer Programme enthält möglicherweise nur druckbare ASCII-Zeichen sowie Tabulatoren und Zeilenumbrüche, die alle als ein Zeichen gezählt werden. (Weil es in einer anderen Kodierung leicht sein würde, nicht existierende Zeichen wegzulassen!)
- Hinweis: Diese Regel scheint notwendig zu sein, aber es gibt viele Sprachen mit unterschiedlichen Codierungen, und ich bin sicher, es wäre cool, die Antworten für sie zu sehen. Daher können Sie diese Regel brechen , Sie können beliebige Zeichen verwenden, aber dann wird Ihre Antwort nicht wettbewerbsfähig , es kann nicht gewinnen.
Die Programme müssen aktuelle, vollständige Programme sein , die den Standardkonventionen Ihrer Sprache entsprechen. Funktionen und REPL- Snippets sind nicht erlaubt.
Die Ausgabe jedes Programms sollte auf stdout oder die von Ihrer Sprache akzeptierte Alternative gehen.
Programme sollten nicht zur Eingabe auffordern oder Eingaben erfordern. (Wenn die Aufforderung zur Eingabe Ihrer Sprache inhärent ist, ist dies in Ordnung.)
Programme sollten deterministisch, endlich in der Laufzeit und unabhängig sein. zB sollte es egal sein, ob man in einem Ordner läuft, der von den anderen Programmen getrennt ist.
Die Ausgabe eines Programms sollte das genaue druckbare ASCII-Zeichen sein, dem es entspricht, optional gefolgt von einer einzelnen nachgestellten Zeile, nicht mehr und nicht weniger.
Stellen Sie sicher, dass Sie in Ihrer Antwort Informationen zu allen 95 (im Idealfall) Programmen sowie Ihre Punktzahl und alle DNPs angeben. Sie müssen nicht Liste alle Programme , die ein einfaches Muster wie „folgen print(chr(80))
, print(chr(81))
, print(chr(82))
...“ , aber stellen Sie sicher , dass Sie sicher sind , dass sie alle würde funktionieren und dass Ihre Gäste richtig hinzugefügt wird .
Als Referenz sind hier die 95 druckbaren ASCII-Zeichen aufgeführt, die Ihre Programme ausgeben müssen:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
quelle
0
Antworten:
Python 2,
10751065104310401039 BytesJedes Programm hat die Form
print'\<octal char code>'
, außer:'
→print"\47"
0
durch8
→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"'
Nachfolgend finden Sie die vollständige Liste der Programme, die nach Zeilenumbrüchen getrennt sind.
Zu testen:
-1 Bytes dank @ Sp3000!
quelle
print~-<N+1>
funktioniert nicht für1
. Du hast gesagt , es funktioniert für0
zu8
.<angle brackets>
ist kein wörtlicher Code. Ersetzen Sie<N+1>
durch den wörtlichen Wert vonN+1
; in diesem fall1
wäre das programm dafürprint~-2
. Siehe die vollständige Liste der Programme.CJam, 269 Bytes
Jedes der Programme ist in der Form mit
'<char - 1>)
Ausnahme von:S
, 1 Byte'
=>39c
3 Bytes)
=>'*(
3 Bytes0
=>T
1 Byte1
=>X
1 Byte2
=>Y
1 Byte3
=>Z
1 Byte4
-9
=><num-1>)
2 BytesPunktzahl ist:
3 * 82 + 1 + 3 + 3 + 4 * 1 + 6 * 2 = 269
quelle
39c
für'
? Sie vergessen auch, dass einzelne Ziffern nur diese Zahl sein können1)
für2
etc, um dort ein Byte zu speichern1)
meinte ich jaTXYZ
ASCII-eingeschränkter x86-Maschinencode für DOS,
310431012913 BytesNun ... Es ist kürzer als Java, denke ich ...
3230 Byte für fast alle Zeichen, Ausnahmen siehe unten.Meistens folgt es einfach dem Muster:
xor
, um einen Zeiger auf das Ende zu bekommen.sub
aus den letzten 2 Wörtern, da der Opcode fürint
nicht in ASCII ist.AH
und der Charakter inDL
. Beide werdenxor
ausgegeben, weil das Zeichen selbst nicht im Programm angezeigt werden kann und 2 kein druckbares ASCII-Zeichen ist.int 21h
int 20h
Wenn ein Zeichen nicht erlaubt ist, kann es die meiste Zeit ersetzt werden, indem entweder ein wenig an den Daten herumgedreht wird oder in ein anderes Register gewechselt wird.
Interessanter wird es, wenn Sie plötzlich nicht mehr in der Lage sind, das einzige für Berechnungen verwendbare Register zu subtrahieren oder zu pushen oder zu platzen ...
quelle
Brainfuck,
1770171017031686 Bytes60 Bytes von Dennis
gespeichert 17 Bytes von Sp3000 gespeichert
DNP: 46 (
.
)Alle außer 43, 45, 60, 62, 91 und 93 werden schamlos von Esolangs.org gestohlen
quelle
--[>-<---]>[<->--]<[->-<]>.
funktioniert für die Ausgabe+
.-----[[----<]>>-]<.
+[+[+>]<<++++]>.
MATL,
305, 302, 300,297 BytesJedes einzelne Programm sieht so aus:
Ausser für
Ziffern. Hier sind die Programme für 0-9:
'c'. Dieses Programm ist
Platz. Das ist
Seit heute habe ich gelernt, dass MATL das Zeichen 0 als Leerzeichen behandelt. Vielen Dank an LuisMendo!
Sie können matl.tio verwenden , um eine dieser Angaben zu überprüfen.
Als Referenz hier ist alles von ihnen:
quelle
Java 8,
679865826577 BytesSeufzer
Dies ist im Grunde eine Portierung meiner Python 2-Antwort , aber mit all dem Boilerplate, das mit dem Schreiben eines vollständigen Programms in Java geliefert wird.
Jetzt ganz ohne DNPs! Danke, Kevin Cruijssen!
Die meisten Programme haben die Form
interface A{static void main(String[]a){System.out.print("\<octal char code>");}}
, außer:interface\tA{static\tvoid\tmain(String[]a){System.out.print("\40");}}
(aber mit dem\t
s durch rohe Tabulatoren ersetzt)"
→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
Puh
Der Java-Compiler verarbeitet Unicode-Escapezeichen wie
\u007B
vor jeder anderen Verarbeitung, wodurch Code geschrieben werden kann, der Unicode-Escapezeichen in Bezeichnern und sogar in Schlüsselwörtern verwendet. Um ein Programm zu schreiben, das kein Zeichen auf dem Kesselschild verwendet, ersetzen wir es einfach durch Unicode-Escape.Als Referenz und zur Vereinfachung des Testens finden Sie hier die vollständige Liste der Programme, die durch Zeilenumbrüche getrennt sind und deren unformatierte Tabulatoren durch vier Leerzeichen ersetzt sind:
Beachten Sie, dass das Programm for
u
verwendetSystem.console()
, das null zurückgibt (und somit den Code zum Auslösen von a veranlasstNullPointerException
), wenn Sie es von einem anderen als dem systemeigenen Terminal Ihres Betriebssystems aus aufrufen (cmd
unter Windows und, wie ich annehme,bash
unter Linux / OSX). .Erstellen Sie zum Testen ein neues Verzeichnis und fügen Sie den obigen Code in eine Datei ein, die
printables
in diesem Verzeichnis benannt ist. Führen Sie dann das folgende Bash-Skript aus:Das obige Skript legt jede Zeile von
printables
in ein eigenes Verzeichnis, benennt sie alleA.java
(mit Ausnahme der Datei, die gedruckt wirdA
und in die umbenannt wirdB.java
), kompiliert jede Datei, führt sie aus und löscht dann die Beweise. Es sollte ungefähr zehn Sekunden dauern, bis die druckbaren ASCII-Zeichen in Ihrer Shell angezeigt werden.Wenn Sie unter Windows arbeiten, führen Sie stattdessen die folgende Batch-Datei aus:
Diese Batch-Datei verfolgt einen etwas anderen Ansatz. Anstatt die Zeilen vorab aufzuteilen, wird die Datei zeilenweise verarbeitet und jedes Programm nacheinander kompiliert und ausgeführt. Wieder löscht es die Beweise, nachdem es beendet ist.
Sparte unzählige Bytes + 1 DNP dank Kevin Cruijssen!
quelle
class B
zum DruckenA
interface
anstelle von class, damit Sie das entfernen könnenpublic
) und wenn in Ihrem Betriebssystem eine Konsole integriert ist, müssen Sie nicht verwendenSystem.out.print
:interface A{static void main(String[]a){System.console().printf("%1",(char)117);}}
Eclipse, IntelliJ und Online-Compiler haben diese Konsole jedoch nicht, was zu einerNullPointerException
.print
> <> ,
443437 BytesTIO Interpreter Link . Hier gibt es viele Muster:
[num][num]*o;
: Multiplikation zweier Zahlen, dann Ausgabe des Ergebnisses als Zeichen mito
und Anhalten mit;
. > <> Ziffern gehen bis zu 15, dh0123456789abcdef
.[num][num]-n;
nimmt das die Differenz zweier Zahlen und gibtn
stattdessen eine Zahl mit aus .'-o[invalid char]
: > <> ist toroidal. Wenn der Befehlszeiger das Ende einer Zeile erreicht, springt er zum Anfang zurück. In diesem Fall wird der Code zweimal ausgeführt, d'-o[char]'-o[char]
. H. Der erste'-o[char]'
Teil schiebt drei Zeichen auf den Stapel,-
berechnet'o' - [char]
undo
gibt das Ergebnis als Zeichen aus. > <> Fehler[char]
treten dann auf, wenn sie erreicht werden , entweder aufgrund eines nicht erkannten Befehls oder weil ein leerer Stapel abgelegt wurde.'-n[invalid char]
was als Zahl ausgibt.'[num][op]o[invalid char]
gilt[op]
für[num]
on[char]
, erroring out on char. Zum Beispiel'2+oJ
AusgabenL
, die zwei mehr als sindJ
.'
's Code lautet stattdessen"-oH
using"
.-
's Code lautet stattdessen'%oB
using%
.ln;
: Länge des Stapels drücken, als num ausgeben, dann anhalten und geben0
. Ähnlichlln;
für1
und'ln;
für3
.4|n+
: 4|
drücken , abprallen und weitere 4 drücken, addieren, dann8
als num ausgeben . Bounce das|
nochmal ab und versuche fehlerfrein
nochmal auf einem leeren Stack auszuführen .3|n*
für9
.[num]|o*
für@Qdy
.'1-:00p
: Das interessanteste für deno
Fall. Um zu vermeiden , verwendeno
in unserem Code, müssen wir verwendenp
eine platziereno
in der codebox, dann starten Sie es. Die Initiale'1-:00p'
setzt den Stapel so, dass erp
oben liegt, und1-
dekrementiert ihn in eineno
.:
dupliziert dieso
und00p
setzt einso
auf (0, 0), wodurch die Codebox zu wirdo1-:00p
. Der Befehlszeiger wird erneut umgebrochen und der andere ausgegebeno
. Das (0, 0) -Zeichen wird dann noch einige Male ersetzt, bevor das Programm endgültig fehlerfrei wird.quelle
Dyalog APL ,
527522 Bytes(Nicht konkurrierend, da APL nicht wirklich nur mit ASCII geschrieben werden kann)
Die meisten sind im Format
nn⊃⎕AV
odernnn⊃⎕AV
mit folgenden Ausnahmen:Hier ist die gesamte Liste:
quelle
⍨
ist mein neuer Lieblings-SmileyRuby, 869 Bytes
Für die 63 Zeichen
@
bis~
haben wir eine 10-Byte-Lösung:Für die meisten (21) Zeichen von
space
bis?
haben wir eine 9-Byte-Lösung:Es gibt noch elf Sonderfälle:
Insgesamt ergibt sich eine Punktzahl von 10 × 63 + 9 × 21 + 10 + 3 + 8 × 4 + 5 = 869.
quelle
?\xxx
anstelle von jeweils"\xxx"
1 Byte verwenden.p 1+8
nichtp-~8
?-
oder so. :(putc 65
=>A
WolframAlpha , 368 Bytes
Allgemeines Format:
Ausnahmen:
Hier ist die vollständige Liste:
quelle
PHP (
891680674 Bytes,20 DNP)Edit: 203 Bytes dank jimmy23013 gespeichert und 2 DNP dank Mego implementiert
Diese Antwort missbraucht stark die Großzügigkeit von PHP. Die meisten Fälle haben eine der folgenden Formen (jeweils 7 Byte):
PHP konvertiert die Buchstaben auf beiden Seiten des Operators in Zeichenfolgen, führt dann die entsprechende bitweise Operation durch, indem jede Zeichenfolge in ihren ASCII-Zeichenwert konvertiert wird, und konvertiert schließlich das Ergebnis zurück in ein Zeichen.
Im ersten Beispiel oben
Y^x
wird89^78
. Das Ergebnis ist33
, das dann als Zeichen an STDOUT gesendet wird!
.Ein Skript wurde geschrieben, um alle möglichen Kombinationen zu erzwingen. Die Ergebnisse finden Sie hier .
Ausnahmen:
;
ist<?=Z^a?>
(8 Bytes)|
ist<?='9'^E;
(9 Bytes)<
und?
wäre normalerweise DNP aufgrund des erforderlichen Start-Tags, aber durch Verwendung des-r
Flags kann Code ohne diese ausgeführt werden:<
istecho Z^f;
(9 Bytes)?
istecho Z^e;
(9 Bytes)=
istecho Z^g;
(9 Bytes)Ergebnis:
(7 * 90) + 8 + 9 + 9 + 9 + 9 = 674 Bytes
quelle
&
|
^
zwischen zwei Buchstaben verwenden, um alle druckbaren ASCII-Zeichen außer zu generieren<?=|;
.~
anstelle von XOR, AND oder OR gespeichert wird. PHP kann mehr druckbare Zeichen als Konstanten als nur Buchstaben verwenden.Brachylog ,
546.477BytesCredits to Fatalize für den Code für
@
.In der folgenden Liste ist das erste Zeichen das zu druckende Zeichen (zur einfachen Bezugnahme).
Sie sind alle Prädikate und
Z
müssen daher das Argument sein, um die Ausgabe zu erhalten: Probieren Sie es online aus!Erläuterung
@P
ist diese Zeichenfolge:welches jedes druckbare ASCII enthält.
quelle
"@"
diese Weise> <> 531 Bytes
Die Programme haben zwei Hauptformen:
Der erste ist für Zeichen mit Zeichencodes mit zwei Faktoren, die beide kleiner als 16 sind, der andere für die anderen Fälle. Die meisten Zahlen, für die ich die zweite Form verwende, haben viele gleichlange Lösungen, aber ich habe diese aus Gründen der Lesbarkeit gewählt.
Ausnahmen:
Volle Liste:
quelle
;
Verwendungen;
. Ich bin mir auch ziemlich sicher, dass die meisten davon fehlerfrei gespielt werden können undo
definitiv möglich sind.o
undO
ich sehe nicht, wieo
das möglich ist. Und wie würde ein Fehler kürzer ausfallen?o
kann durch die Verwendung von erfolgenp
. Ich könnte jedoch separat posten, um Fehler zu vermeiden, da wahrscheinlich viele verschiedene Muster beteiligt sind.;
Programm allerdings behoben . Vielen Dank für den Hinweis!Hexagony ,
376373 Bytes, 1 DNPVielen Dank an FryAmTheEggman für die Einsparung von 3 Bytes.
Fast alle Programme haben die gleiche Form:
Es gibt jedoch einige Ausnahmen:
;
Ohne Verwendung von;
1 DNP kann nicht gedruckt werden .@
können wir@
das Programm nicht beenden. Stattdessen verwenden wir entwederS2;:
oderS3;%
. Dies endet mit einem Division-durch-Null-Fehler, der jedoch in STDOUT nicht sichtbar ist. Das sind also noch vier Bytes.U
den es erforderlich wäreU3;@
. Es gibt mehrere Möglichkeiten , dies zu beheben, einschließlich der Umstellung auf Klein, das heißtn9;@
, oder mit Zunahme oder Abnahme, dhT);@
oderV(;@
. In jedem Fall sind es noch vier Bytes.0
, und!
druckt einen Integer - Wert, so können wir erhalten0
und1
mit!@
und)!@
jeweils Speichern 3 Bytes.Wie die
<letter><digit>;@
Programme funktionieren: Das sechseckige Layout eines Programms der Form1234
ist immerDa keines der Programme Befehle enthält, die den Steuerungsfluss umleiten, handelt es sich lediglich um lineare Programme, die der Reihe nach ausgeführt werden.
In jedem Fall setzt der Buchstabe am Anfang des Codes die aktuelle Speicherkante auf ihren Zeichencode. Zum Beispiel im Programm
P1;@
, dasP
die Wertesätze80
. Dann multipliziert die Ziffer diesen Wert mit 10 und addiert sich selbst (dh die Ziffer wird an den aktuellen Wert angehängt). Das gibt801
im obigen Beispiel. Zum Schluss wird;
dieser Wert gedruckt, indem Sie modulo 256 als Byte-Wert verwenden. In diesem Fall wird801 % 256 = 33
und!
gedruckt.quelle
Leerzeichen , 1643 Bytes, 1 DNP
17 Byte für die Zeichen [33-63] und 18 Byte für die Zeichen [64-126]
In Whitespace ist dies unkompliziert, da druckbare Zeichen (außer Leerzeichen) sowieso keine Bedeutung haben:
Das obige Programm druckt ein '!' (100001b). Wechseln Sie
[TAB][SPACE][SPACE][SPACE][SPACE][TAB]
in der ersten Zeile zu einem beliebigen Zeichen. Es ist nicht möglich, ein Leerzeichen zu drucken, ohne ein Leerzeichen zu verwenden, da beim Drucken immer alles mit beginnt[TAB][LF][SPACE]
quelle
Retina , 712 Bytes, 2 DNPs
Dies war eine Zusammenarbeit mit FryAmTheEggman.
Es gibt verschiedene Klassen von Lösungen. Für die meisten Zeichen von Leerzeichen bis verwenden
^
wir ein Programm der folgenden Form:Das Zeichen in der zweiten Zeile durchläuft die Bereiche,
_0-9A-Za-z
während der Rest unverändert bleibt. Dadurch wird die leere Eingabe in dieses Zeichen umgewandelt undp
an der entsprechenden Position durch das druckbare ASCII-Zeichen (dargestellt durch ) ersetzt. Jedes dieser Programme ist 8 Byte lang.Innerhalb dieses Bereichs gibt es nur wenige Ausnahmen. Am wichtigsten ist, dass die Ziffern gekürzt werden können:
x
(zählt die Anzahl vonx
s in der leeren Eingabe)(weehoo, leeres Programm; zählt die Anzahl der leeren Treffer in der leeren Eingabe)
2: Jetzt wandeln wir die Eingabe in ein einzelnes Zeichen um, bevor wir leere Zeichenfolgen zählen:
3: das gleiche, aber wir machen die Eingabe in zwei Zeichen:
4: Sie bekommen die Idee ...
5 - 9: Handlungswechsel ... wir verwenden die Zeichenwiederholung, um zu vermeiden, dass die zweite Zeile länger wird:
...
Die andere Ausnahme ist
T
ein DNP: Wir glauben nicht, dass es möglich ist, ein nicht-stelliges Zeichen zu generieren, ohne dass es im Quellcode erscheint, wenn Transliterationsstufen nicht verwendet werden können.Weiter zu den restlichen Zeichen. Zum Drucken verwenden
_
wir ein ähnliches Programm wie die oben beschriebene allgemeine Lösung:Die Tatsache nutzen,
w
die mit beginnt_
.Als nächstes
`
folgt der zweite DNP, da diese ebenfalls für Transliterationsstufen erforderlich sind.Dann werden die meisten Kleinbuchstaben mit so etwas gedruckt (was gedruckt wird
a
):Wieder wird das Zeichen in der zweiten Zeile durchlaufen
_0-9A-O
. Hier brauchen wir nur zu achtenl
undw
, was wir mit den folgenden Programmen drucken können, jeweils:Schließlich sind nur
{|}~
noch 9 Bytes erforderlich. Hier verwenden wir die Transliterationsstufe, um das Zeichen vor ihnen zu erhöhen. ZB~
kann gedruckt werden mit:quelle
Pyke,
364362355 BytesAlles in der Form
w<chr(charcode+32)>.C
(4 Bytes) mit Ausnahme von:->
d
1 Byte0
->Z
1 Byte1
->~W
2 Bytesa
->Gh
2 Bytesz
->Ge
2 Bytesa
) in FormG<number>@
(3 Bytes)k
->GT@
3 Bytes>
->~Bh
3 Bytes]
->~Be
3 BytesZ
->~le
3 Bytes9
->~ue
3 Bytesw
->G22@
4 Bytes.
->~B4@
4 BytesC
->~K38@
5 BytesOnline Pyke Dolmetscher
quelle
JavaScript (ES6),
1083 -1068 ByteGenerelle Form:
Ausnahmen:
Bearbeiten: 15 Bytes dank @ GOTO0 gespeichert.
quelle
alert(atob`XA`)
für "\", um einige Bytes zu speichern.x
.\u
Fluchten im Quellcode? Cool05AB1E , 417 Bytes
Erläuterung
Die meisten sind 5 Bytes lang
convert nr to base nr+1
.>
benötigt ein zusätzliches Byte, da wir dafür kein Inkrement verwenden können.a,b,x,y,z,Y,Z
extrahiert werden, ausA
denen das Alphabet in Kleinbuchstaben enthält.A,B,C,D,E,F
sind in hex konvertierte Zahlen.0-9
sind einfache Inkremente / Dekremente sowie vordefinierte Variablen.quelle
Marbelous, 220 Bytes
Bei einem Zeichen, das keine Ziffer ist, handelt es sich nur um die beiden hexadezimalen Großbuchstaben des Zeichencodes. Beispiel: Das folgende Programm gibt Folgendes aus
A
:3
Ersetzen Sie für eine Ziffer, die nicht vorhanden ist,2F
den folgenden Code durch die hexadezimalen Großbuchstaben des Zeichencodes - 1:Für
3
:Gesamtpunktzahl: 2 * 85 + 5 * 10 = 220.
Dolmetscher.
Mein erster Versuch war Bubblegum und es funktionierte vorher nicht für Charaktere
?
...quelle
Perl 6: 921 Bytes
Übersetzung der Python-Lösung.
Jedes Programm hat die Form
say "\x<hex escape code>"
, außer: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
zu9
→say <n minus one>+1
Nachfolgend finden Sie die vollständige Liste der Programme, die nach Zeilenumbrüchen getrennt sind.
Hier ist der Code, mit dem ich die obige Auflistung getestet und die Punktzahl gezählt habe:
quelle
say
benötigt wird und oktale Escape-Sequenzen wie folgt geschrieben werden\o77
. Fühlen Sie sich frei, eine separate Perl 5-Lösung zu veröffentlichen ... :)Haskell,
1874, 1864, 1856, 1855, 1795, 1791,1589 Bytes, 7 DNPsDie meisten Programme sind
main=putChar '\xx'
odermain=putChar '\xxx'
woxx
/xxx
ist der ASCII-Code des zu druckenden Zeichens. Dies funktioniert für alle bis auf 14 Zeichen:Für die Ziffern können jedoch
1 bis4 Bytes gespeichert werden (Danke an Christian Sievers!):Die 52 Programme bis
c
(Code 99) benötigen 18 Byte, die restlichen 19 jeweils 19 Byte.Teilergebnis:
10*14 + 52*18 + 19*19 = 1437
Für 7 der verbleibenden Zeichen funktionieren die folgenden Programme:
Teilergebnis:
18 + 22 + 18 + 21 + 19 + 27 + 27 = 152
Dies hinterlässt 7 DNPs:
=aimnrt
Jedes Haskell-Programm muss ein main (
main=
) definieren, das sind also 5 DNPs. Zum Drucken auf stdout,putChar
,putStr
oderinteract
kann verwendet werden, wodurch mant
undr
als weiterer DNPs. (Es gibtprint
aber auchprint 'a'
Drucke'a'
und nichta
- und enthält aucht
undr
sowieso.) Haskell hat auch einechr
Funktion, die das entsprechende Zeichen unter Angabe einer Nummer zurückgibt, um es jedoch nutzen zu können,import Data.Char
wird es benötigt.Gesamtpunktzahl:
1437 + 152 = 1589
7 DNPsquelle
main=print$1-1
usw.succ
)BBC Basic,
422413 BytesLaden Sie den Dolmetscher kostenlos unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter
Dank Leaky Nun 9 Bytes gespart.
Generelle Form
32..99 ohne 12 Sonderfälle: 56x4 = 224 Bytes
100..126 : 27x5 = 135 Bytes
12 Sonderfälle: 54 Bytes
Die meisten Zahlen folgen der allgemeinen Form, aber ich habe sie alle hier aufgenommen, um zu zeigen, wo das Problem liegt.
Das erste Zeichen ist das zu druckende Zeichen.
quelle
V.48
für verwenden0
?V.
und schonP.
immer da?.
werden zu einem Schlüsselwort erweitert. Bei dieser Herausforderung geht es strikt darum, nicht druckbares ASCII zu verwenden. Bei anderen Herausforderungen kann man jedoch sagen, dass die mit Token versehenen Schlüsselwörter (ASCII 127-255) ein Byte lang sind. Das heißt, ich habe dieses Argument nie ausprobiert und gebe normalerweise beide Punkte.Minkolang 0,15 , 604 Bytes
Für die meisten Zeichen
"<char-1>"1+O.
wäre ein gültiges Programm, vielleicht eines der kürzesten. Aufgrund der Tatsache, dass Zeichen als Codepunkte auf dem Stapel gespeichert sind, können jedoch viele von ihnen durch Multiplikation und Addition in fünf Bytes oder weniger erzeugt werden. Beachten Sie auch, dassl, $1, $2, $3, $4, $5, $6, $l
sind10, 11, 12, 13, 14, 15, 16, 100
jeweils.Format:
<character>: <program>
Besondere Erwähnungen:
(Probieren Sie es aus.) Minkolang hat die Möglichkeit, die Zeichen in der Codebox zu ändern. Dieses Programm ersetzt also die Zeichen
-
am Ende durch die Zeichen.
, die zum Stoppen des Programms erforderlich sind."N"1+d90pN.
fürO
funktioniert genauso.(Probieren Sie es aus.)
lZ
Drückt die Groß- und Kleinbuchstaben auf den Stapel undI
drückt die Länge des Stapels, also 52, genau auf den Codepunkt "4". Das Beste daran ist, dass ich anfangs über die Lösung nachgedacht habe4$3*O.
, die 4 und 13 multipliziert, um 52 zu erhalten, aber nicht, weil sie eine 4 enthält, und so fand ich trotzdem eine golferischere Lösung!(Probieren Sie es aus.)
d
Dupliziert den oberen Teil des Stapels. Dieser Code bewirkt also, dass er verschoben11
, dupliziert und dann multipliziert wird. Eine alternative Möglichkeit, dies zu schreiben, wäre gewesen$12;O.
, die die gleiche Byteanzahl hat.(Probieren Sie es aus.)
;
Ist Potenzierung, dies ergibt also 5 ^ 3, um 125 zu erhalten.quelle
Groovy, 1019 Bytes
Ich hatte eine andere Groovy-Lösung geschrieben (siehe unten), aber nachdem ich sie eingereicht hatte, grub ich mich ein bisschen mehr in die Zeichenflucht, in der Hoffnung, eine Möglichkeit zu finden, das Programm weiter zu verkürzen, und entdeckte, dass Groovy eine oktale Zeichenflucht hat, die ich habe wusste nicht von. Dies vereinfacht den Code erheblich und beseitigt leider die Notwendigkeit für fast alle eigenartigen Problemumgehungen, die ich mir ausgedacht habe.
Es sieht auch fast identisch mit Copper's Python 2-Lösung aus , bis zu dem Punkt, an dem es im Grunde so aussieht, als hätte ich ihre Arbeit plagiiert. Pfui.
Jedes Programm hat die Form
print'\<octal value>'
, außer:p
,r
,i
,n
,t
→'print''\<octal value>'
(aber mit dem passenden Buchstaben von „print“ auch mit dem Oktalwert ersetzt)0
-9
→print~-<next int>
Hier ist die vollständige Liste der Programme nach Charakter.
Groovy, 1130 Bytes
Mein vorheriges Programm, bevor ich entdeckte, dass es oktale Fluchten gibt. Viel interessanter, IMO.
Jedes Programm hat die Form
print(--'<next char>')
, außer:-
,[
,~
→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>
Hier ist die vollständige Liste der Programme für jeden Charakter:
quelle
Eigentlich ,
383382381 Bytes1 Byte dank Mego.
Zur einfachen Bezugnahme ist die erste Spalte der Zeichencode, die zweite Spalte das Zeichen und die dritte Spalte der Code.
Der Code für
0
ist ein einzelnes Leerzeichen.Probieren Sie es online!
Golfvorschläge sind willkommen.
quelle
:
in 5:9P2*c
Fourier, 306 Bytes, 1 DNP
Fast alle Programme folgen dem Muster,
na
wobei n der Zeichencode jedes Zeichens ist. Zum Beispiel:Probieren Sie es online!
Also werde ich nur die Ausnahmen auflisten:
0 (Null)
Da der Akku auf Null voreingestellt ist, können wir dies mit einem einzelnen Zeichen anzeigen:
Probieren Sie es online!
1
Ähnlich wie bei Null erhöht dies den Akkumulator, um 1 zu erhalten.
Probieren Sie es online!
5
Der ASCII-Code für 5 ist 53, daher musste ich Folgendes umgehen:
Probieren Sie es online!
ein
Da es sich
a
um die Zeichenausgabefunktion handelt, gibt es keine andere Möglichkeit, das Zeichen a zu erzeugen. Dies ist also mein einziges NICHT-PROGRAMM .Sehen Sie alle Programme hier
quelle
Matlab,
12381224 Bytes, 2 DNPDas Hauptmuster ist:
Bei Ziffern ist es etwas kürzer:
Für Charaktere ist
[]'
es:Zeichen
ds
vondisp
werden angezeigt mitfprintf
( danke @Stewie Griffin );ip
gehören aber auch dazu, also verschiebe ich den string und benutzeeval
:Beide Zeichen
()
werden jedoch fürdisp
oder benötigteval
, sie sind also DNP.Als referenz die ganze liste:
quelle
[100 105 115 112]
(char-codes) fürdisp
?disp([100 105 115 112])
Produziert auch keine Saiteeval([100 105 115 112])
.fprintf
für d ans s:fprintf([115,''])
. Speichert 2x7 Bytes =) Wird es nicht zu einer erfolgreichen Einsendung machen, aber hey: 14 Bytes sind 14 Bytes ,,,disp([0 ''])
enthält ein Leerzeichen.disp([0,''])
nicht.fprintf
.Gelee (nicht konkurrierend), 406 Bytes
Dies gibt alle Zeichen von 32 - 126 aus. Die Byteanzahl wird mit https://mothereff.in/byte-counter berechnet .
Probieren Sie es online!
quelle
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 Bytes
Die einfachste Möglichkeit, ein Zeichen auszugeben, ohne es tatsächlich zu verwenden, besteht darin, den ASCII-Wert zu berechnen und ihn mit dem
,
Befehl (Zeichenausgabe) zu rendern. Gibt beispielsweise49*,@
das Dollarzeichen aus (ASCII 36, 4 * 9). Dies ist jedoch selten das Optimalste, da für die Berechnung der meisten Werte mehr als 3 Byte erforderlich sind.Eine andere Möglichkeit, eine Zahl in 3 Bytes zu generieren, besteht darin, die Tatsache auszunutzen, dass der
g
Befehl (get) in der ersten Zelle des Spielfelds den ASCII-Wert von g generiert (ein leerer Stapel wird also mit Nullen gefüllt) Ablesen des Spielfeldwertes bei 0,0). Sog1+,@
bekommst du h undg1-,@
bekommst du f . Dies funktioniert offensichtlich für eine Reihe von Offsets,+
und es-
sind auch andere Operationen als und möglich. So bekommen Sie zum Beispielg3/,@
ein doppeltes Anführungszeichen.Eine Variation davon besteht darin, dem einen
g
anderen Befehl vorauszugehen, der alle Nullen auf dem Stapel belässt. Sie lesen also immer noch einen Wert aus dem Spielfeld bei 0,0, aber das gelesene Zeichen ist jetzt anders. Dies kostet ein Byte mehr, aber Sie erhalten Zugriff auf viele weitere Werte. Beispiel:0g1-,@
Sie erhalten einen Schrägstrich und:g1+,@
ein Semikolon. Andere zuverlässige Präfixe sind*
,+
,-
,>
,\
und_
. Beachten Sie auch hier, dass andere Operationen möglich sind:>g2*,@
Sie erhalten eine vertikale Leiste.Eine weitere Abwandlung ist das Voranstellen
g
von a1
, so dass Sie jetzt nicht mehr von 0,0 lesen, sondern von der leeren Zelle bei 0,1. In Befunge werden leere Zellen standardmäßig mit Leerzeichen initialisiert, sodass1g,@
Sie ein Leerzeichen und1g1+,@
ein Ausrufezeichen erhalten.Für die Ziffern gibt es einen zweifelhafteren Trick, den wir verwenden können. Anstatt zu versuchen, sie als Zeichen auszugeben, geben wir sie als Zahlen aus (eine kleine Zahl ist einfacher zu generieren als ihre ASCII-Entsprechung). Geben Sie zum Beispiel 2 an und beachten
11+.@
Sie insbesondere die Sonderfälle: für 0 und für 1 . Der zweifelhafte Teil davon ist, dass eine numerische Ausgabe in Befunge ein Leerzeichen nach der Zahl enthält, sodass es sich nicht um eine reine Zeichenausgabe handelt..@
!.@
Ein weiterer zweifelhafter Trick, den wir
g
anwenden können, ist eine Variation der obigen Technik. Anstatt uns auf Befunge-Befehle für das Präfix zu beschränken, können wir auch technisch jedes Zeichen verwenden, das kein Befunge-Befehl ist. Bei den meisten Interpreten wird ein nicht erkannter Befehl ignoriert, sodass amg
Ende der ASCII-Wert des vorhergehenden Zeichens gelesen wird. Dies ermöglicht es uns, die meisten anderen ASCII-Werte zu generieren, die sonst nicht in 3 Bytes berechnet werden könnten. Als ein Beispiel:Qg1+,@
bekommt man R .Schließlich gibt es drei Sonderfälle. Ein g kann nicht in weniger als 5 Bytes generiert werden, daher müssen wir darauf zurückgreifen
"f"1+,@
. Ein Komma ist der komplizierteste, erfordern dynamische Modifikation des Spielfeldes:0g4-:80p @
. Wir könnten eine ähnliche Technik verwenden, um das at-Zeichen zu vermeiden, aber ein effizienterer Hack besteht darin, den%
(modulo) -Befehl als Abschlusszeichen zu verwenden, d88*,%
. H. Wenn das%
erreicht ist, befindet sich nichts auf dem Stapel, so dass die Modulo-Berechnung eine Division durch Null erzeugt und auf dem Referenzinterpreter das Programm beendet.Unten finden Sie die vollständige Liste der Programme, eines pro Zeile.
quelle