Schreiben Sie ein Programm, das alle druckbaren nicht-alphanumerischen ASCII-Symbole verwendet

17

Verwenden Sie jedes dieser Symbole mindestens einmal in Ihrem Quellcode:

! " # $ % & ' () * + , - .  / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

Symbole in Kommentaren, String-Literalen, Regexps (oder anderen Arten von Literalen usw.) zählen nicht (aber ihre Begrenzer wie /**/oder ""zählen).

Das Programm sollte keine Aktion ausführen. Es muss nur kompiliert werden und beim Ausführen nichts tun.

Wenn aus irgendeinem Grund einige der Symbole nicht in der Sprache Ihrer Wahl verwendet werden können, erklären Sie dies genau (was und warum muss ausgeschlossen werden).

Update: Einige Antworten verwendeten Symbole mit regulären Ausdrücken. Ich halte das für etwas problematisch, es ist dasselbe wie das Einfügen in Zeichenkettenliterale oder Kommentare (deshalb setze ich usw. in diese Anforderung ein). Bitte versuchen Sie es ohne diese. Ich habe auch die obigen Anforderungen aktualisiert.

Update: Kürzester Code gewinnt (markiert als Code-Golf ). Wie vorgeschlagen, werden wir höchstwahrscheinlich ein paar Kriterien brauchen, nach denen der Gleichstand gewährleistet ist. Ich schlage vor, dass bei einem Gleichstand die ASCII-Symbole so geordnet wie möglich angezeigt werden. Formal: Filtern Sie das erste Vorkommen aller aufgelisteten Symbole aus einem Programm heraus. Dies führt zu einer Permutation der aufgelisteten Symbole. Das Programm mit der geringeren Inversionszahl seiner Permutation gewinnt.

Update: Ich würde mich freuen, einige / mehr Lösungen in regulären / Standard-Sprachen zu sehen, wie C (++), Java, Scala, Haskell usw.

Petr Pudlák
quelle
1
Können wir eine literale Ausnahme für Zeichen haben, die in keinem Schlüsselwort, keiner Syntax oder keinem Operator in einer bestimmten Sprache vorkommen? Das heißt, weder @%das Backtick kann in c erscheinen, außer als Teil eines Literales (in ausreichend neuen Versionen %kann c in Digraphen erscheinen). (und #erscheint nur in Präprozessor-Direktiven, aber damit müssen wir einfach leben)? Das heißt, ich fordere, dass Matts Ansatz ausdrücklich legalisiert wird.
dmckee
2
kürzester Code gewinnt? Ich vermute, dass es auch ein entscheidendes Kriterium geben muss
zwar
1
In Javascript sind die Zeichen #, @und `außerhalb jeglicher Art von Literal nicht legal
Peter Olson
6
Dies ist im Grunde genommen ein Wettbewerb um "eine Sprache zu finden, die alle diese Zeichen als Syntax verwenden kann". Ziemlich beschissen Code Gold meiner Meinung nach
Earlz
1
Ja, ich bin mit @Earlz einverstanden, ich denke, es wäre besser, wenn es etwas Nützliches tun müsste, in der Menge des Codes, in der die Leute nicht einfach fluffen konnten, um alle Zeichen hineinzuholen, aber es wäre nicht die Lösung von ardnew . Denn so wie es aussieht, kann man nicht kürzer werden, und jede Sprache, in der einige der Zeichen außerhalb der Literatur nicht gültig sind, wird sofort disqualifiziert. Das heißt, es gibt nur wenige nicht nur akzeptable Antworten, sondern auch den richtigen Antwortzeitraum.
Ryan

Antworten:

18

Brainf * ck, 32 Zeichen

!"#$%&'()*+.-/:;>=<?@[\]^_`{|}~,

Druckt ein Smiley-Gesicht (wenn Ihre Konsole das ASCII-Symbol 1 ausgeben kann)

Ja, eine Branf * ck-Lösung, die Golfscript schlägt! : P

Wenn Sie auf keine Ausgabe bestehen, tauschen Sie einfach das +und aus .:

!"#$%&'()*.+-/:;>=<?@[\]^_`{|}~,
vsz
quelle
6
Hm ... Ich würde eher sagen , es tut verstecken Zeichen in den Kommentaren, aber na ja.
Hat aufgehört, gegen den Uhrzeigersinn
5
@leftaroundabout: Dies sind keine technischen Kommentare, da Sie sie nicht zum Auskommentieren gültiger Anweisungen verwenden können. Sie werden als Leerzeichen behandelt. Übrigens stimme ich Ihnen zu, dass dies eine unverschämte Ausdehnung der Regeln ist.
vsz
3
@vsz Es ist nichts Falsches daran, die Regeln zu biegen.
Gareth
1
Die Inversionsnummer dieser Lösung ist 24, daher ist sie gemäß den Regeln der Gewinner. Ich habe einige Zweifel, da das Ignorieren von Zeichen sehr nahe an Kommentaren liegt, aber ich würde sagen, es ist schlecht, ich habe beim Schreiben der Frage nicht an diese Möglichkeit gedacht.
Petr Pudlák
1
@BodoThiesen Das ist in der Tat ziemlich alt, ich denke, das könnte sich auch für eine gewinnbringende Lösung qualifizieren, obwohl diese besser ist, obwohl sie die Regeln ein wenig übertrifft.
Petr Pudlák
47

Perl, 32 Zeichen

Keine versteckten Symbole in Kommentaren, String-Literalen oder regulären Ausdrücken. Verwendet alle Symbole genau einmal.

$`<@"^[(\{_},)]/+-~%'?&|:!*.=>;#

Beschreibung

Ich habe versucht, die Priorität eines Operators durch Einrückung anzuzeigen: Die Ausdrücke ganz rechts werden vor den Ausdrücken ganz links ausgewertet

        $`            # scalar variable $ named `
      <               # numeric less-than inequality <
        @"            # array variable @ named "
                      #   (array evaluated in scalar context)
    ^                 # bitwise XOR ^
        [(\{_},)]     # array reference [] 
                      #   containing array () 
                      #     containing reference \
                      #       to anonymous hash reference {}
                      #         with one key "_" 
                      #           and no value (nothing following comma ,)
                      #             (reference evaluated in scalar context)
      /               # numeric division /
        +-~%'         # unary addition +
                      #   and unary negation -
                      #     and bitwise complement ~
                      #       on hash variable % named '
                      #         (hash evaluated in scalar context)
  ?                   # ternary conditional operator ?:
    &|                # code reference variable & named |
  :                   # ternary conditional operator ?:
    ! *.              # logical negation !
                      #   on typeglob variable * named .
                      #     (typeglob evaluated in scalar context)
  =>                  # fat comma => for compound expression
                      #   (evaluates LHS as string, RHS is empty)
;                     # end of expression ;
#                     # start of comment #
seltsam
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber haben Sie gerade einen Skalar mit dem Namen erstellt `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Mr. Llama
2
@GigaWatt nein, dies ist eine Folge verschiedener Ausdrücke. Ich werde eine Beschreibung hinzufügen, wie es ausgewertet wird
Ardnew
@GigaWatt: Nein; In Perl sind die symbolischen Bezeichner alle Einzelzeichen. Von dieser Art der Sache, ich glaube , dieses Programm nur Anwendungen $`, @", %', und *.(ein Skalar, Array, Hash und Typeglob, respectively), obwohl es sicher zu sein , furchtbar schwer. . .
Ruakh
23
Entweder sind Sie ein Genie oder eine beliebige Byte-Sequenz ist ein gültiges Perl-Programm. Oder beides.
Ugoren
4
Obwohl ich nach meinen eigenen Regeln die Brainfuck-Lösung vergeben musste, ist diese meine Lieblingslösung (gleiche Größe, aber Inversionsnummer 279).
Petr Pudlák
9

Leerzeichen, 32

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Alle Zeichen, die keine Leerzeichen sind, werden ignoriert. Dies ist also ein leeres Programm

SeanC
quelle
3
Man könnte daher argumentieren, dass alle Nicht-Leerzeichen Kommentare sind und dies ungültig ist :)
NRGdallas
8

Python 65

a=lambda x:0.
@a#
def _():{[`'"$?'`,]};a<a!=a+a%a&a^a-a*a|~a>a/a\

Ich habe die Zeichen ?und $in einem String-Literal verwendet. Diese Zeichen sind außerhalb von Zeichenfolgenliteralen oder Kommentaren nicht zulässig .

Matt
quelle
Dies enthält ungültige Syntax. Insbesondere {[`'"$?'`,]}ist nicht gültig, da ein Wörterbuch mit einem Schlüssel ohne zugeordneten Wert erstellt wird. Sie können es mit zwei weiteren Zeichen wie {[`'"$?'`,]:0}
folgt
1
@ Strigoides Nein, es macht einen Satz nicht zu einem Diktat. Aber selbst wenn dies der Fall war (dict-Schlüssel ohne Wert), wird ausgeführt, was die Voraussetzung war, keine gültige Syntax. (Sie benötigen Python> = 2.7, damit es funktioniert)
Matt
Ich habe Python 2.6 verwendet, als ich es getestet habe.
Strigoides
8

PHP, 32 Zeichen

Wahrscheinlich ein kleiner Troll, ist dieses PHP-Programm auch eine QUINE und verwendet alle Symbole in der exakten Reihenfolge, in der sie aufgelistet sind.

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Die Ausgabe wird über die Befehlszeile ausgeführt und entspricht einfach dem Inhalt der Datei, da <?phpder Interpretor nicht aufgerufen werden kann.

$ cat > a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

$ php a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Leigh
quelle
4
IMHO verletzt dies Symbole in Kommentaren, String-Literalen, Regexps (oder andere Arten von Literalen usw.) zählen nicht , da das gesamte Programm ein einzelnes Literal ist.
Petr Pudlák
Das von der Task benötigte Programm sollte auch nichts ausgeben, und es gibt nur ein Quine, das nichts ausgibt.
Paŭlo Ebermann
Es wird nicht einmal von PHP analysiert, so dass dies ziemlich ungültig ist
Rob
@RobQuist natürlich wird es analysiert, es ist damit beschäftigt, dieses schwer fassbare T_OPEN_TAG-Token bis zum bitteren Ende zu jagen
Leigh,
7

Perl 6 (43 Zeichen)

Definieren wir einen Infix-Operator mit einem eher ungewöhnlichen Namen:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>{}

Es ist weder ein Literal noch ein Literal in einer RE oder irgendetwas, das in einem Kommentar verborgen ist. Du glaubst mir nicht? Das Ausführen des folgenden Programms gibt "2" aus:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>($a, $b){ $a + $b }
say 1 !"#$%&'()*+,-./:;=?@[]^_´\|~ 1;

Aber ich bin mir ziemlich sicher, dass Ihr Nitpicker die Regeln weiter ausdehnen werdet, um eine Neudefinition der Sprache selbst auszuschließen und uns Perlgummis unglücklich zu machen. :(

gfldex
quelle
Ich würde sagen, das ist in Ordnung, die Verwendung von Symbolen in einem Bezeichner erscheint sinnvoll.
Petr Pudlák
7

Haskell, 53

a@""#%&*+/?^b|a'<-a!!0=(\_->a`b`[]);main=do{print$1}

Wir können das etwas kürzer machen

45

a'@""#%&*+/?!<|^b=(\_->1`b`[]);main=do{main}

aber dieses Programm nicht beenden, und Verwendungen mehr Zeichen ( '!', '<', '|') in der neu definierten Infix.

hörte auf, sich gegen den Uhrzeigersinn zu drehen
quelle
5

k (33 Zeichen)

Sehr einfach in k. "Muss leider gepaart werden.

(@:'!""#$%&*+-\./;<=>?^_{}[`]|,~)
Skeevey
quelle
5

GolfScript (33 Zeichen)

{!""$%&()*+,-./<=>?@[\]^_`|~};:'#

"muss gepaart werden. Es dauerte ein wenig Versuch und Irrtum, bis es nichts ausgab - die meisten anderen Positionen des :'Ergebnisses in irgendeiner Ausgabe.

Peter Taylor
quelle
5

J, 33 Zeichen

''&][?!"$>{}:<;,|^~*/\%+`-@.#(=_)

' muss verdoppelt werden, um Syntaxfehler zu vermeiden.

Bei meiner ersten Antwort fehlten einige Symbole.

Gareth
quelle
5

C 48 Zeichen

Art zu betrügen.

#define _ ~''*+,-./:<=>?[]`|\
@%^$&!
main(){"";}
ugoren
quelle
2
Definitiv die Grenzen des "Betrügens" überschreiten, da die meisten von ihnen in einem nicht aufgerufenen Makro erscheinen. Wie wäre es mit #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Nichts in einer Zeichenkette, es wird nur in eins umgewandelt ... Es wäre natürlich länger.
dmckee
@dmckee, ich glaube nicht, dass dein Vorschlag ehrlicher ist als meiner. In beiden Fällen landen die problematischen Zeichen nicht im Code. Ich könnte die meisten von ihnen auf Code umstellen (wie ich es tat "";), aber $@Backtick scheint hoffnungslos.
Ugoren
Kein Zweifel, meins ist auch faul, hinterhältig und hinterhältig. Aber es macht auch Spaß.
dmckee
@dmckee, es geht um Spaß. Übrigens, du brauchst #define Q(_) #_. Der Präprozessor würde dies "##_##"als String-Literal behandeln.
Ugoren
5

Postscript - 32 Zeichen

{!"#$&'()*+,-./:;=<>?@[\]^_`|~}%

Führt zu einem Objekt auf dem Stapel, hat aber sonst keine Auswirkungen. Postscript erlaubt fast jedes Zeichen in einem Bezeichner, mit Ausnahme <>()[]{}/der speziellen Syntaxformen und %der Einführung eines Kommentars. Das Programm ist als tokenized

{                  % start a procedure object
!"#$&'             % an identifier
()                 % an empty string
*+,-.              % an identifier
/:;=               % a symbol
<>                 % an empty hex string
?@                 % an identifier
[\]                % an array
^_`~|              % an identifier
}                  % close the procedure object
%                  % a comment
Geoff Reedy
quelle
3

C # (91 Zeichen)

#define a 
class a{static int @Main(){return(char)1.1*""[0]/1%1-1+1!=1?1:~1^1>>1<<1&1+'\0';}}

Soweit ich weiß, ist das $ -Zeichen kein gültiges Zeichen außerhalb von String-Literalen, daher habe ich es in meiner Antwort nicht verwendet.

EDIT : Dank Peter Taylor habe ich den Code verkürzt.

Gemeinschaft
quelle
1
#if A... #endifist kürzer als #region... #endregion. Und "x"[0]+ist kürzer als [System.STAThread].
Peter Taylor
3

PowerShell (52 Zeichen)

$_+=(@(1.1,1)[0]-1)*1/1%'1'::ToInt|&{!"">~\1}<#^#>`;

Ich musste das ^ -Zeichen als String-Literal eingeben, da das ^ -Zeichen meines Wissens kein zulässiges PowerShell-Zeichen außerhalb von String-Literalen ist. Korrigiere mich, wenn ich falsch liege.

Die einzige Möglichkeit, in das : -Zeichen zu passen, besteht darin, den :: -Operator zu verwenden, um eine statische Methode aufzurufen.


quelle
3

Schema, 41 Zeichen

(define !$%&*+,-./:<=>?@[\]^_`{|}~ "#'");

Dies nutzt die unglaubliche Toleranz von Schema für Zeichen in Variablennamen. In diesem Programm erstelle ich eine Variable mit dem Namen! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~, Die das Schema gerne annimmt.

Strigoides
quelle
3

Tcl 37 Zeichen

set {!#$%&'()*+,-./:<=>?@[]^\_`|~} ""

Definiert eine Variable !#$%&'()*+,-./:<=>?@[]^\_`|~mit einer leeren Zeichenfolge

Johannes Kuhn
quelle
3

C: 83 56 Zeichen

#undef a
_;main($){$/=-+~!0|0^0%1,1<.0>0?'`':*&"@"[0];}\

At-Zeichen und Backticks sind nicht Teil der erlaubten C-Syntax, daher habe ich sie in Anführungszeichen gesetzt.

Fors
quelle
1
Warum in Klammern (b)? Es ist seltsame Syntax und eine Verschwendung von Zeichen.
Ugoren
1
Wenn Sie die Struktur für den Punkt verwenden, 0.0ist sie viel kürzer.
Ugoren
Wie könnte ich mir das nicht vorstellen (0.0)? Die Klammer ist ein Überbleibsel aus der Zeit, als sie tatsächlich ein Zeichen gespeichert haben, aber jetzt sind sie in der Tat unnötig. Danke @ugoren!
Fors
Ich denke, main(_,$)wird einen Charakter retten.
Ugoren
Und mit gcc können Sie schreiben x?:y, aber es ist nicht Standard C.
Ugoren
2

Common Lisp, 33 Zeichen

#+()'|!"$%&*,-./:;<=>?@[\]^_`{}~|

Der Hauptteil des Obenstehenden bewertet (oder würde es eher bewerten, wenn nicht für das #+()davor) das Symbol mit dem Namen:

!#$%&()*+,-./:;<=>?@[\]^_`{}~

Die #+()Ausgabe soll vermieden werden. Ich bin nicht sicher, ob die |foo|Syntax für Symbole als Literal gilt, aber Symbole werden in Common Lisp als Variablen- / Funktionsnamen verwendet, und es gibt einige Antworten, in denen bereits die erforderlichen Zeichen verwendet werden.

Strigoides
quelle
2

Smalltalk (Squeak 4.x Dialekt) 38 Zeichen

Implementieren Sie diese Methode in Object. Die Syntax ist gültig, wenn Voreinstellungen Unterstreichungszuweisung zulassen (dies ist die Standardeinstellung).

%&*+/<=>?@\!~y""^Z_([:z|{#'',$`;-y}]).

deklarieren Sie Z als globale Variable im Popup-Menü, falls interaktiv

Erklärungen:

  • % & * + / <=>? @! ~ ist ein binärer Selektor (ein Operator)
  • y ist der Parameter (der Operand)
  • "" ist ein leerer Kommentar
  • ^ bedeutet Rückkehr
  • Z ist eine globale Variable
  • _ ist eine Aufgabe
  • () begrenzt einen Unterausdruck
  • [: z |] begrenzt einen Codeblock mit einem Parameter z
  • {} begrenzt ein Array
  • # '' ist ein Symbol-Literal aus einem leeren String (erstes Element des Arrays)
  • , ist eine binäre Nachricht, die an das obige Symbol gesendet wird
  • $ `ist ein Zeichenliteral, das als Argument der obigen Nachricht verwendet wird
  • ; dient zum Verketten einer zweiten Nachricht, die an denselben Symbolempfänger gesendet wird # ''
  • Die zweite Nachricht ist -
  • y wird als zweites Nachrichtenargument verwendet
  • . dient zum Trennen der nächsten Anweisung (hier ist es eine letzte Periode)

Verdammt, wer hat gesagt, dass Smalltalk lesbar ist?

Beachten Sie, dass ich nicht geschummelt habe, das einzige ungültige Zeichen wird in ein wörtliches Zeichen geschrieben. EDIT siehe unten, das war eine falsche Aussage (zumindest in Squeak)


Mit diesem Trick können wir es aber auf 34 Zeichen bringen

%&*+,-/<=>?@\!~|y""^[{#(:_;`$')}].

Diesmal:

  • # () begrenzt ein literales Array
  • welches 4 wörtliche Symbole enthält: _; `und 1 literales Zeichen $ '

Streng genommen können wir das als Betrug ansehen ... Es ist keine wörtliche Zeichenfolge, aber es ist immer noch eine nicht leere wörtliche Zeichenfolge ...

Ich muss das Anführungszeichen "" immer noch verdoppeln (es sei denn, ich mache ein wörtliches Zeichen mit $ ", aber dann muss ich das Anführungszeichen '' verdoppeln).
Ich muss immer noch einen Buchstaben für den Parameter verwenden (_ wird nicht akzeptiert, auch wenn Wir setzen Preferences allow underscore in selector auf true.

Was schön ist, ist, dass wir sogar die Methode ausführen können, zum Beispiel die Nachricht mit Argument 2 an 1 senden:

1%&*+,-/<=>?@\!~|2

EDIT Endlich in 35 Zeichen ohne zu schummeln

!%&*+,-/<=>?@`y""^[:x_|#()~$';\{}].

Anmerkungen:

  • Voreinstellungen erlauben einen Unterstrich in der Selektorfreigabe unter Verwendung eines Blockparameters mit dem Namen x_
  • `ist ein gültiges Zeichen für den Binärselektor im Gegensatz zu dem, was ich gesagt habe
  • Ich verwende auch $ ', um ein doppeltes Anführungszeichen zu vermeiden
aka.nice
quelle
1

R: 108 Zeichen

a=new(setClass("a",representation(b="list")));a@b=list(c_d=1:2);if(1!='\t'&.1%*%1^1>a@b$c[1]/1|F){`~`<-`?`}#

Die längste Einreichung, aber um Symbole @und $in R verwenden zu können, müssen wir ein Objekt erstellen, das Slots (indiziert mit @) und benannte Elemente (indiziert mit $) hat.
Die kürzeste Lösung, die ich mir vorstellen konnte, bestand darin, eine neue Objektklasse ( a=new(setClass("a",representation(b="list")))) zu erstellen , die ihren Tribut fordert. Ansonsten trennen Sie sich von den Klassikern, die keine Erklärungen benötigen (wie !=, #oder 1:2).

`~`<-`?` 

Erstellt einen neuen Operator, der das Gleiche tut wie der Operator ?(dh er ruft die Hilfeseite des Elements auf, dem er vorangeht).

%*%berechnet das innere Produkt zweier Matrizen (hier von 1^1und .1).
Symbol _tut nichts (AFAIK) in R, wird aber routinemäßig in Variablen- oder Funktionsnamen verwendet, wie es hier der Fall ist.

Plannapus
quelle
1

TI-Basic, 36

:End:#$%&'()*+.-/;>=<?@[\]^_`{|}~,!"
Timtech
quelle
Dies ist nicht gültig, da das Anfangszitat häufig für Kommentare verwendet wird.
Tyzoid
@ Tyzoid Ich habe es bis zum Ende verschoben.
Timtech
EndBeendet eine Schleifenanweisung, nicht das Programm. Ich denke du meintest Return.
Lirtosiast