Ihre Aufgabe ist es, ein Programm zu erstellen (das nur druckbare ASCII-Zeichen und / oder Tabulatoren und Zeilenumbrüche verwendet), das genau die Zeichen im druckbaren ASCII-Bereich ( 0x20
bis 0x7e
) ausgibt , die nicht im Quellcode Ihres Programms enthalten sind (in beliebiger Reihenfolge) oft du willst).
Der kürzeste Code, um dies in einer Sprache zu tun, gewinnt.
code-golf
self-referential
Joe Z.
quelle
quelle
0x20
zu0x7e
, die als das „druckbaren ASCII - Zeichen“ definiert sind. Tabulatoren und Zeilenumbrüche sind eigentlich Steuerzeichen.Antworten:
GolfScript,
1512 ZeichenBasierend auf Jan Dvoraks Antwort mit ein paar Drehungen und auch im Stil von Peter Taylors .
quelle
Polyglot, 95
tclsh
,bash
,sh
,ksh
usw.)main()
benötigt wird. Dank UrogenTut nichts.
quelle
#undef X;whatever junk you want
funktioniert.#
für Kommentare wie Ruby und Perl verwendet wird)PHP 5.2, 4
Als Datei speichern, die
NYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php
irgendwo in aufgerufen wird/home
.short_open_tag
mussOn
in deinem seinphp.ini
.Die Ausgabe ist:
quelle
:
in der Ausgabe erkennen.JavaScript - 88
druckt "bcdfghijkmnpquvxyz"
quelle
"!#$%&*+,-13:<=>?@[\]^_`{|}~AERTOWS";alert('BCDFGHIJKMNPQUVXYZ'.toLowerCase()+95*72)
weil95*72
=6840
und das Verschieben der verschwendeten Zeichen in eine Zeichenfolge es Ihnen ermöglicht, die Anführungszeichen zu verwenden, anstatt sie zu verschwenden. Außerdem fühlt es sich kitschig an, Zeichen in einem Kommentar zu verstecken.Leerzeichen,
6157 ZeichenEs ist nicht die kürzeste, aber es hat wahrscheinlich die einfachste Logik (es ist wirklich nur eine Schleife).
Hier ist es vollständig kommentiert, wobei S Leerzeichen ist, T Tabulator ist, L Zeilenvorschub ist:
Vielen Dank an @res für die Korrektur des oben genannten Problems (zusätzliches Duplikat für die Verzweigungsanweisung erforderlich) und für das Drücken kleinerer Zahlen auf den Stapel.
quelle
SSSTSSSSSL LSSSL SSSTL TSSS SLS SLS TLSS SSSTTTTTTSL TSST LTTSL LLL
.LSSSL
wirdLSSL
undLTTSL
wirdLTTL
) und den Ausgang am Ende entfernen (die dreiLLL
). Probieren Sie es online mit rohen 52 Bytes oder hier mit Hervorhebung und Erklärung .C
837469 ZeichenIch habe wirklich versucht, es unter 80 Zeichen zu bringen, aber ich habe es einfach nicht geschafft. Ich habe mich schließlich entschlossen, das, was ich habe, zu posten, in der Annahme, dass ich (oder jemand anderes) zehn Minuten nach dem Posten eine 79-Zeichen-Lösung herausfinden werde.Okay, es waren keine zehn Minuten, aber im Prinzip hat es funktioniert.Ich wollte wirklich eine Version veröffentlichen, die keinen freien Platz im Quellcode haben musste, sondern die auf einer seltsamen Attraktor-Umlaufbahn zwischen einer Handvoll Lösungen landete. Nachdem ich viele Minuten lang versucht hatte, einen von ihnen zu einer stabilen Lösung zu bewegen, gab ich auf und fügte den Raum hinzu.
quelle
Golfscript,
2624 ZeichenNimmt ein Skript zur Bereichsgenerierung, dupliziert es, führt es aus, subtrahiert es von seinem Ergebnis und subtrahiert dann den Ergebnis-Subtraktionscode und das andere Anführungszeichen.
quelle
''+
, Escape-Programm vor der Subtraktion, setzen Sie ein Noop.;
(keinen besseren Weg, um den Punkt zu verdecken), verwenden Sie Code-Block anstelle von String ->{126,33>`-.;}.~
das ist 16 ZeichenFisch - 80
Bei Fischfehlern wird der Ausdruck "Etwas riecht fischig ..." ausgegeben. Da z eine schlechte Anweisung ist, kommt es sofort zu Fehlern
quelle
Ich weiß, dass es keine Wettbewerbe gewinnt. Ich wollte es nur in einer Sprache versuchen, die normalerweise nicht verwendet wird, nur zum Spaß.
Java -
209195152140 ZeichenMit Zeilenumbrüchen und Tabulatoren
Achtung, wenn Sie ausführen: Programm wird nicht beendet. Haha
Erläuterung
for(char c=0;;c++)
: Da achar
als ein behandelt werden kannint
, nutze ich das hier zu meinem Vorteil, um durch alle möglichen Werte von zu inkrementierenc
. Ich lasse die Abbruchbedingung in der Schleife (die zwischen den beiden Semikolons steht) aus, um Zeichen zu sparen, da nicht angegeben wurde, dass das Programm abgebrochen werden muss. :)"publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:""
: Leider kein sehr eleganter Ansatz, aber er erledigt die Arbeit. Listen Sie jedes im Quellcode vorhandene Zeichen manuell alsString
Literal auf und prüfen Sie dann, ob der Stromchar c
darin mit vorkommtindexOf()
. Wenn derindexOf()
Aufruf zurückkommt-1
, ist er nicht vorhanden und sollte daher gedruckt werden. Der Rest verwendet nur den ternären Operator, um Zeichen und Platz zu sparen.quelle
Perl, 49 Zeichen
Dies ist eine interessante Herausforderung - es ist eine Art Anti-Quine, und ich habe es geschafft, das Programm ein paar Mal zu verkürzen, indem ich die Anzahl der darin enthaltenen Zeichen vergrößerte .
quelle
Ruby,
817868666257Prüft einfach selbst. Doppelte Zeichen manuell entfernt.
Vielen Dank an Josh für das Speichern von 4 Zeichen und an Minitech für das Speichern von 5 Zeichen!
quelle
(?!..?~).map{|x|$><<x if/[()ifmap{}|x?!.~\/\\\[\]$><]/!~x}
(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}
$><<((32..126).map(&:chr)-IO.read(__FILE__).chars).join
55 Bytes mit einem anderen Ansatz.Befunge (48)
Ausgaben: {zyxwvutsrqponmlkjihgfedcba` _ ^] [ZYXWVUTSRQPONMLKJIHGFEDCBA240
quelle
Nicht sehr ernst, aber ich musste es versuchen:
JSFuck (138152)
(kompilierte Quelle hier)
Originalquelle:
Druckt alle Zeichen außer () + []!
quelle
(x)
<=> Erhöht[x][+[]]
die Codegröße, verkleinert jedoch das benötigte Alphabet.Meine Güte, du hast es APL schwer gemacht (Ist das delibarate?)
Also entscheide ich mich, alle Regeln zu ignorieren !!!
APL (Dyalog),
310Gibt den atomaren Vektor aus (der alle druckbaren ASCII-Zeichen enthält)
Es stellte sich heraus, dass ich den Teil "ohne" völlig vergessen habe ...
Aber das ist eine einfache Lösung
~'AV'''
bedeutet exclude (~
) die Zeichen A, V und einfache Anführungszeichen (escaped als doppelte einfache Anführungszeichen)Was das Drucken von Nicht-ASCII betrifft, ignoriere ich alle Regeln.
quelle
0x20
bis0x7e
) aus, die nicht im Quellcode deines Programms enthalten sind" Ich glaube, die Ausgabe enthält möglicherweise keine Zeichen außerhalb des druckbaren ASCII-Bereichs ("genau" ist das Schlüsselwort) und Ihr Programm enthält 'A' und 'V', daher sollten sie nicht gedruckt werden.~
den Satz ausgeschlossener Zeichen erweitern.a.-.'a.-'''
GolfScript (
1816 Zeichen)Online-Demo mit einer zusätzlichen Zeile, die eine Korrektheitsprüfung durchführt und die Anzahl der fehlerhaften Zeichen ausgibt.
(Ich habe verschiedene äquivalente Alternativen.
@`^
Kann ersetzt werden durch\\`
;#
Kann ersetzt werden durch`
oder]
. Die richtige Kombination kann mit Howards Trick verwendet werden, um seine Punktzahl von 15 zu erreichen, da Backslashes nicht wie in String-Literalen in Blöcken maskiert werden müssen:{),\`^32>].~}.~
Aber Howard verdient die Anerkennung für diesen Trick.quelle
}~
- noch besser für Codeblöcke, siehe meine neue Antwort ;-)Brainfuck, 173
Ziemlich lange, ich könnte es später noch einmal versuchen.
quelle
J (
52-40)Edit: Duh, vergessen
e.
Alte Version:
Andere Variante (gleiche Länge, aber weniger Leistung):
quelle
Python 3 -
6861... danke an @WolframH für die Verbesserungen.
exec(x)
in einer neuen Zeile und das Speichern;
inx
. Außerdem können Sie in Python 3x=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"\nexec(x)
61 Zeichen verwenden (druckt mehrere Leerzeichen, was zulässig ist).PowerShell: 96
Muss gespeichert und als Skript ausgeführt werden.
diff
ist ein eingebauter Alias fürCompare-Object
.gc
ist ein eingebauter Alias fürGet-Content
.$MyInvocation.InvocationName
Ruft den vollständigen Pfad zum ausgeführten Skript ab.32..126
ist das dezimale Äquivalent für0x20..0x7e
und erstellt so ein Array der dezimalen ASCII-Codes, nach denen wir suchen.[char[]]
Nimmt den Inhalt des nächsten Objekts, fügt ihn in ein Array ein, zerlegt ihn und konvertiert ihn in ASCII-Zeichen. Wir haben also jetzt zwei ASCII-Zeichen-Arrays - eines stammt aus diesem Skript, das andere wird durch die Herausforderungskriterien definiert.-Pa
setztCompare-Object
„Passthru“ -Format auf, so dass nur die Elemente , die zwischen den Eingängen Ausgang an der Konsole unterschiedlich sind zu finden sind - Indikatoren , von denen Teile waren , die eingegeben werden , nach wie vor gespeichert in den Objektdaten, aber nicht angezeigt werden.|?{$_.SideIndicator-eq'=>'}
PipeCompare-Object
-Ausgabe anWhere-Object
, die nur die Elemente filtert, die für die zweite Eingabe exklusiv sind.quelle
PHP - 92
Ausgabe:
nichts
Das OP fragt, ob alle nicht verwendeten Zeichen gedruckt werden sollen. Ich benutze sie einfach alle
quelle
<?='A"$%&\'()*+[,.]/0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#'
?!;>Xn
Javascript, 92
quelle
quelle
Java - 126 Zeichen
minimiert:
nicht minimiert:
Dies ist ein interessantes Problem, da einzelne Token möglicherweise von ihrer längeren Form profitieren, da sie Zeichen wiederverwenden. Normalerweise
String[]
wäre dies beispielsweise kürzer,String...
die eckigen Klammern in der bedingten Zeichenfolge sind jedoch nicht mehr erforderlich.Ich fand den Trick darin, Zeichen am Anfang und am Ende des Bereichs zu verwenden, damit Sie sie von der Ausgabe ausschließen können, indem Sie einfach den Anfang und das Ende Ihrer Schleife ändern.
Für Java ist ein Schlüsselzeichen, das ausgeschlossen werden muss
"
, da das in der Zeichenfolge einen Escape-Befehl erfordert, der\
zu Ihrem Programm beiträgt, und in die Zeichenfolge aufgenommen werden muss, die beiträgt\\
. Durch Entfernen"
aus der bedingten Zeichenfolge entfernen Sie 4 Zeichen. Dies kann erreicht werden, indem Sie sicherstellen, dass Sieund verwenden
!
und Ihre Schleife von starten#
.Alle Kleinbuchstaben erscheinen am Ende des Bereichs, mit nur
{
,|
,}
und~
nach ihnen kommen. Aufgrund der Ausführlichkeit von Java werden die meisten Kleinbuchstaben nur für das Boilerplate verwendet. Ebenso{
und}
für ein Java-Programm trivial, weil das Boilerplate sie benötigt.|
kann verwendet werden, wenn Sie eine oder-Bedingung haben, aber ich konnte keinen Weg finden, eine zu nutzen, die zu einem kürzeren Programm führt, als es nur|
als bitweiser Operator zu verwenden. Das|0
macht mich ein bisschen dreckig, weil es der einzige Teil ist, der ein Nopp ist, um den Charakter reinzuholen.~0
Erträge-1
, was praktisch ist, weil wir das überprüfen müssenindexOf
. Wenn Sie dies mit "using!=
for the loop conditional" kombinieren, wird das<
Zeichen insgesamt eliminiert , was bedeutet, dass es nicht in die bedingte Zeichenfolge eingefügt werden muss.quelle
sh (47)
Verwendet den selbstreferenziellen Ansatz. Es wird davon ausgegangen,
/dev/urandom
dass letztendlich jedes Oktett mindestens einmal ausgegeben wird. Beendet nicht.Wenn wir davon ausgehen, dass dies
man
installiert ist, könnten wir stattdessen dieascii(7)
Manpage (und damit ein Abschlussprogramm) verwenden ( 44 Zeichen, danke @fennec).quelle
man
undzsh
installiert sind,man zshall
scheint den Kriterien zu entsprechen. Ich könnte das als Variation hinzufügen.man ascii
könnte dir einen weiteren Brief retten, denke ich.tr
Sie? GNUtr
behandelt das-
"cat $0
" in als einen Bereichsoperator, der die Ausgabe unterbricht.ascii
Programm installiert ist, können Sie es anstelle von verwendenman ascii
.BitShift , 1038 Bytes
BitShift ist eine Sprache, die nur
0
und1
als Syntax unterstützt. Ich dachte, es wäre einfach, alle anderen Zeichen zu drucken, aber da es das Schleifen nicht wirklich unterstützt, endeten immer noch massive 1038 Bytes.Ich glaube jedoch, dass es nicht wirklich möglich ist, kleiner zu werden.
Druckt
Probieren Sie es hier aus
quelle
Auf jeden Fall die längste Lösung, aber das Codieren in Lino macht immer Spaß:
L.in.oleum -
655523 ZeichenKeine Kommentare, liest nur die Quelle in binäre kompiliert. Speichern unter
a.txt
oder es wird nicht kompiliert!quelle
Brainfuck,
133123114110 BytesEin bisschen mehr an einer früheren Lösung herumgebastelt (bevor ich merkte, dass die unten stehende kleiner war - obwohl dies war, bevor ich einige schwere Optimierungen vorgenommen habe). Dies funktioniert, indem 4 Sätze von ASCII-Zahlen gespeichert und mit einer kniffligen Schleife ausgedruckt werden und anschließend die fehlenden Zeichen (dh solche, die zwischen ungültigen ASCII-Zahlen liegen) eingegeben werden.
Ursprüngliche Vorlage
Es macht Folgendes:
quelle
Haskell (70)
Die langweilige Lösung für doppelte Zeichen in einem Programm in einer Zeichenfolge, die von der universellen Menge subtrahiert wird. Weit entfernt von einem Codegolfgewinner, obwohl es für seine Länge überraschend gut lesbar ist.
(Jetzt mit Listensubtraktion anstelle von
filter
/notWith
.)quelle
import Data.List
zuimport List
runhaskell
"Modul 'Liste' nicht gefunden" versuche . Mir ist aufgefallen, dass ich die Anzahl der Zeichen falsch gezählt habe, also habe ich es korrigiert.J - 21
Schreiben Sie dies in eine Datei, die
5
im aktuellen Verzeichnis aufgerufen wird . Laden Sie dann das Skript mit0!:1<'5'
Oder 25 ohne den Filetrick:
quelle
'
, der nicht aus der Ausgabe entfernt wird.Clojure (
142, 106103)formatiert:
Denke, das macht es, braucht vielleicht ein paar Verbesserungen. Ausgabe:
führt die Zeichenfolge, die auswertbarer Clojure-Code ist, auf sich selbst aus. Die Zeichenfolge enthält am Ende einige Kommentare, um die außerhalb der Zeichenfolge verwendeten Zeichen abzurufen (Hauptmethode usw.).
quelle
Python 2, 69
Ich verwende die längste (die ich finden kann) Folge von fortlaufenden Zeichen, die ich ausdrucken und die anderen als Kommentar nach dem Code hinzufügen kann.
quelle