Scrivi un programma che utilizza tutti i simboli ASCII non alfanumerici stampabili


17

In particolare, utilizzare ciascuno di questi simboli almeno una volta nel codice sorgente:

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

I simboli all'interno di commenti, valori letterali a stringa, regexps (o qualsiasi altro tipo di valore letterale ecc.) Non contano (ma i loro delimitatori come /**/o ""contano).

Il programma non dovrebbe eseguire alcuna azione. Deve solo compilare e non fare nulla quando eseguito.

Se per qualche motivo alcuni dei simboli non possono essere utilizzati nella lingua di tua scelta, spiegalo rigorosamente (cosa e perché devono essere esclusi).

Aggiornamento: alcune risposte hanno usato simboli con espressioni regolari. Lo considererei un po 'problematico, è la stessa cosa che inserirli in valori letterali o commenti di stringhe (è per questo che ho inserito ecc. In tale requisito). Per favore, prova senza questo. Ho anche aggiornato il requisito sopra.

Aggiornamento: il codice più corto vince (etichettato come code-golf ). Come suggerito, molto probabilmente avremo bisogno di alcuni criteri di tie-breaker. Suggerisco che se c'è un pareggio, quello vincente è quello in cui i simboli ASCII appaiono il più ordinati possibile. Formalmente: filtra la prima occorrenza di ciascuno dei simboli elencati da un programma. Ciò comporterà una permutazione sui simboli elencati. Vince il programma con meno numero di inversione della sua permutazione.

Aggiornamento: sarei felice di vedere alcune / più soluzioni in linguaggi normali / tradizionali, come C (++), Java, Scala, Haskell, ecc.


1
Possiamo avere un'eccezione letterale per i caratteri che non compaiono in nessuna parola chiave, sintassi o operatore in una lingua particolare? Questo non è @%né il backtick può apparire in c se non come parte di un letterale (in versioni sufficientemente nuove di c %può apparire in digraph). (e #appare solo nelle direttive del preprocessore, ma dovremo solo conviverci)? Cioè, sto chiedendo che l'approccio di Matt sia reso esplicitamente legale.
Dmckee,

2
vince il codice più corto? sospetto che ci sarà anche un criterio di rottura
ardnew

1
In Javascript, i personaggi #, @e `sono al di fuori non è legale di qualsiasi tipo di letterale
Peter Olson

6
Questo è fondamentalmente un concorso di "trova un linguaggio che può usare tutti questi caratteri come sintassi". Secondo me un codice oro piuttosto scadente
Earlz,

1
Sì, sono d'accordo con @Earlz, penso che sarebbe meglio se dovesse fare qualcosa di utile, nella quantità di codice di leasing, in questo modo le persone non potrebbero semplicemente fluffare per ottenere tutti i personaggi, ma non sarebbe la soluzione di Ardnew . Perché così com'è, non puoi essere più breve di così, oltre a qualsiasi lingua in cui alcuni dei personaggi non siano validi al di fuori dei letterali - come è stato sottolineato da diverse persone - vengono immediatamente squalificati. Ciò significa che ci sono solo alcune risposte non solo accettabili, ma un periodo di risposte corrette.
Ryan,

Risposte:


18

Brainf * ck, 32 caratteri

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

Stampa una faccina (se la tua console può generare il simbolo ASCII 1)

Yay, una soluzione Branf * ck che batte Golfscript! : P

Se insisti su nessun output, scambia semplicemente +e .:

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

6
Hm ... preferirei dire che lo fa per nascondere i caratteri nei commenti, ma vabbè.
cessò di girare in senso antiorario l'

5
@leftaroundabout: non sono tecnicamente commenti perché non è possibile utilizzarli per commentare istruzioni valide. Sono gestiti come spazi bianchi. A proposito, sono d'accordo con te che questo è un allungamento spudorato delle regole.
vsz

3
@vsz Non c'è niente di sbagliato nel piegare le regole.
Gareth,

1
Il numero di inversione di questa soluzione è 24, quindi è il vincitore secondo le regole. Ne dubito, dato che ignorare i personaggi è molto vicino ai commenti, ma direi che è un male, non ho pensato a questa possibilità quando ho scritto la domanda.
Petr Pudlák,

1
@BodoThiesen In effetti è piuttosto vecchio, immagino che potrebbe anche qualificarsi per una soluzione vincente, anche se questa è migliore, anche se allunga un po 'le regole.
Petr Pudlák,

47

Perl, 32 caratteri

nessun simbolo nascosto nei commenti, nei letterali di stringa o nelle espressioni regolari. usa tutti i simboli esattamente una volta.

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

Descrizione

ho cercato di indicare la precedenza dell'operatore con rientro: le espressioni più a destra vengono valutate prima di quelle alla loro sinistra

        $`            # 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 #

Correggimi se sbaglio, ma hai appena chiamato uno scalare chiamato `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Mr. Llama

2
@GigaWatt no, questa è una sequenza di diverse espressioni. aggiungerò una descrizione di come viene valutata
ardnew

@GigaWatt: No; in Perl, gli identificatori simbolici sono tutti caratteri singoli. Di questo genere di cose, io penso che questo programma solo usi $`, @", %', e *.(uno scalare, un array, hash, e typeglob, rispettivamente), anche se è terribilmente difficile per essere sicuri. . .
ruakh,

23
O sei un genio, o qualsiasi sequenza di byte casuali è un programma Perl valido. O entrambi.
ugoren,

4
Anche se secondo le mie regole ho dovuto assegnare la soluzione Brainfuck, questa è la mia preferita (stesse dimensioni, ma inversione numero 279).
Petr Pudlák,

9

Spazio bianco, 32

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

tutti i caratteri non bianchi vengono ignorati, quindi in realtà si tratta di un programma vuoto


3
si potrebbe obiettare che tutti i caratteri non bianchi sono commenti e questo non è valido :)
NRGdallas,

8

Python 65

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

Ho usato i personaggi ?e $dentro una stringa letterale. Questi caratteri non sono legali al di fuori dei valori letterali o dei commenti delle stringhe.


Questo contiene sintassi non valida. In particolare, {[`'"$?'`,]}non è valido, in quanto crea un dizionario con una chiave senza valore associato. Puoi renderlo valido con altri due personaggi in questo modo:{[`'"$?'`,]:0}
Strigoides,

1
@Strigoides no, rende un set non un dict. ma anche se fosse il caso (chiave dict senza valore), viene eseguito, che era il requisito, non una sintassi valida. (hai bisogno di Python> = 2.7 perché funzioni)
Matt,

Vedo, stavo usando Python 2.6 quando l'ho provato.
Strigoides,

8

PHP, 32 caratteri

Probabilmente un po 'un troll, questo programma PHP è anche un QUINE e usa tutti i simboli nell'ordine esatto in cui sono elencati.

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

Eseguito dalla riga di comando, l'output sarà semplicemente il contenuto del file, poiché non è <?phpnecessario invocare l'interprete.

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

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

4
IMHO questo viola simboli all'interno di commenti, valori letterali stringa, regexps (o qualsiasi altro tipo di valore letterale ecc.) Non contano , poiché l'intero programma è un singolo valore letterale.
Petr Pudlák,

Inoltre, il programma richiesto dall'attività non dovrebbe produrre nulla e c'è solo un quine che non produce nulla.
Paŭlo Ebermann,

Non viene nemmeno analizzato da PHP, quindi questo è praticamente non valido
Rob,

@RobQuist ovviamente viene analizzato, è impegnato a cacciare quel token T_OPEN_TAG inafferrabile fino alla fine amara
Leigh

7

Perl 6 (43 caratteri)

Definiamo un operatore infix con un nome piuttosto insolito:

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

Non è un letterale né un letterale in una RE o qualcosa di nascosto in un commento. Non mi credi? L'esecuzione del seguente programma produrrà "2":

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

Ma sono abbastanza sicuro che i nitpicker estenderanno ulteriormente le regole per escludere la ridefinizione della lingua stessa per renderci infelici perl. :(


Direi che va bene, usare i simboli in un identificatore sembra ragionevole.
Petr Pudlák,

7

Haskell, 53

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

Possiamo renderlo un po 'più breve

45

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

tuttavia questo programma non termina, e gli usi più caratteri ( '!', '<', '|') nel infisso appena definito.


5

k (33 caratteri)

Molto facile in k. Purtroppo "deve essere accoppiato.

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

5

GolfScript (33 caratteri)

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

"deve essere associato. Ci sono voluti un po 'di tentativi ed errori per non produrre nulla - la maggior parte delle altre posizioni del :'risultato in qualche output.


5

J, 33 caratteri

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

' deve essere raddoppiato per evitare errori di sintassi.

Alla mia prima risposta mancavano alcuni simboli.


5

C, 48 caratteri

Tipo di imbroglio.

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

2
Sicuramente spingendo i limiti del "tradimento", poiché la maggior parte di essi appare in una macro non chiamata. Che ne dici di #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Niente in una stringa, viene semplicemente convertito in uno ... Sarebbe più lungo, ovviamente.
dmckee,

@dmckee, non credo che il tuo suggerimento sia più onesto del mio. In entrambi i casi, i caratteri problematici non finiscono nel codice. Potrei spostare la maggior parte di loro nel codice (come ho fatto con "";), ma il $@backtick sembra senza speranza.
ugoren,

Non c'è dubbio, il mio è anche disgustoso, subdolo e subdolo. Ma è anche divertente.
dmckee,

@dmckee, il divertimento è di cosa si tratta. A proposito, hai bisogno #define Q(_) #_. Il preprocessore considererebbe "##_##"letteralmente una stringa.
ugoren,

5

Postscript - 32 caratteri

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

Risultati in un oggetto nello stack, ma per il resto non ha effetti. Postscript consente quasi tutti i caratteri in un identificatore ad eccezione dei <>()[]{}/quali sono speciali moduli di sintassi e %che introducono un commento. Il programma è tokenizzato come

{                  % 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

3

C # (91 caratteri)

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

Per quanto ne so, il carattere $ non è un carattere valido al di fuori dei letterali di stringa, quindi non l'ho usato nella mia risposta.

EDIT : Grazie a Peter Taylor , ho abbreviato il codice.


1
#if A... #endifè più breve #region... #endregion. Ed "x"[0]+è più corto di [System.STAThread].
Peter Taylor,

3

PowerShell (52 caratteri)

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

Ho dovuto mettere il carattere ^ come una stringa letterale perché, per quanto ne so, il ^ carattere non è un carattere PowerShell legale al di fuori dei letterali stringa. Correggimi se sbaglio.

L'unico modo per trovare il carattere : è usare l' operatore :: per effettuare una chiamata a un metodo statico.


3

Schema, 41 caratteri

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

Questo sfrutta l'incredibile tolleranza di Scheme per i personaggi con nomi di variabili. In questo programma creo una variabile con il nome! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~ Che Scheme accetta felicemente.


3

Tcl 37 caratteri

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

Definisce una variabile !#$%&'()*+,-./:<=>?@[]^\_`|~con una stringa vuota


3

C: 83 56 caratteri

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

I segni di at e backtick non fanno parte della sintassi C consentita, quindi li ho inseriti tra virgolette.


1
Perché tra parentesi (b)? È una sintassi strana e un disastro di personaggi.
ugoren,

1
Se usi la struttura per il punto, 0.0è molto più breve.
ugoren,

Come potrei non pensarci (0.0)? La parentesi è un residuo di quando hanno effettivamente salvato un personaggio, ma ora sono davvero inutili. Grazie @ugoren!
Fors,

Penso main(_,$)che salverà un personaggio.
ugoren,

E con gcc puoi scrivere x?:y, ma non è lo standard C.
ugoren,

2

Lisp comune, 33 caratteri

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

La parte principale di quanto sopra valuta (o meglio, valuterebbe se non fosse per il #+() fronte) al simbolo chiamato:

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

È #+()evitare l'output. Non sono sicuro che la |foo|sintassi dei simboli sia considerata letterale, ma i simboli sono usati come nomi di variabili / funzioni in Common Lisp, e ci sono già alcune risposte che usano i caratteri necessari in quelli.


2

Smalltalk (dialetto Squeak 4.x) 38 caratteri

Implementare questo metodo in Oggetto, la sintassi è valida se Preferenze Consenti assegnazione di trattino basso (che è l'impostazione predefinita)

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

dichiarare Z come var globale nel menu a comparsa se interattivo

spiegazioni:

  • % & * + / <=>? @! ~ è un selettore binario (un operatore)
  • y è il parametro (l'operando)
  • "" è un commento vuoto
  • ^ significa ritorno
  • Z è una variabile globale
  • _ è un compito
  • () delimita una sottoespressione
  • [: z |] delimita un blocco di codice con un parametro z
  • {} delimita un array
  • # '' è un simbolo letterale costituito da una stringa vuota (primo elemento dell'array)
  • , è un messaggio binario inviato al simbolo sopra
  • $ `è un carattere letterale usato come argomento del messaggio precedente
  • ; serve per concatenare un secondo messaggio inviato allo stesso Symbol symbol # ''
  • il secondo messaggio è -
  • y è usato come secondo argomento del messaggio
  • . serve per separare la prossima istruzione (qui è un periodo finale)

Accidenti, chi ha detto che Smalltalk è leggibile?

Nota che non ho imbrogliato, l'unico personaggio non valido `è messo in un personaggio letterale. EDIT vedi sotto, questa era una falsa affermazione (almeno in Squeak)


Ma possiamo arrivare a 34 caratteri con questo trucco

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

Questa volta:

  • # () delimita una matrice letterale
  • che contiene 4 simboli letterali: _; `e 1 carattere letterale $ '

A rigor di termini, possiamo considerare questo come un imbroglio ... Non è una stringa letterale, ma è ancora un letterale non vuoto ...

Devo ancora raddoppiare la citazione del commento "" (a meno che non crei un carattere letterale con esso $ ", ma poi devo raddoppiare la citazione della stringa '')
Devo ancora usare una lettera per il parametro (_ non è accettato anche se impostiamo Preferenze per consentire la sottolineatura nel selettore su true).

La cosa bella è che possiamo persino eseguire il metodo, ad esempio inviare il messaggio a 1 con l'argomento 2:

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

EDIT Finalmente in 35 caratteri senza barare

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

Appunti:

  • Le preferenze consentono il trattino basso nell'abilitazione del selettore usando un parametro di blocco chiamato x_
  • `è un carattere valido per il selettore binario contrariamente a quanto ho detto
  • Uso anche $ 'per evitare di raddoppiare un preventivo

1

R: 108 caratteri

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){`~`<-`?`}#

Chiaramente l'invio più lungo, ma per poter usare i simboli @e $in R, dobbiamo creare un oggetto che abbia degli slot (indicizzati usando @) e degli elementi nominati (indicizzati usando $).
La soluzione più breve che mi è venuta in mente è stata quella di creare una nuova classe di oggetto ( a=new(setClass("a",representation(b="list")))), che prende il suo pedaggio. Altrimenti, a parte i classici che non hanno bisogno di spiegazioni (come !=, #o 1:2),

`~`<-`?` 

crea un nuovo operatore che fa lo stesso dell'operatore ?(ovvero chiama la pagina di aiuto dell'elemento che precede).

%*%calcola il prodotto interno di due matrici (qui di 1^1e .1).
Il simbolo _non fa nulla (AFAIK) in R ma viene usato abitualmente nei nomi di variabili o funzioni, come nel caso di questo caso.


1

TI-Basic, 36

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

Questo non è valido perché la citazione iniziale viene spesso utilizzata per i commenti.
Tyzoid,

@Tyzoid L'ho spostato alla fine.
Timtech,

Endtermina un'istruzione loop, non il programma. Penso che volevi dire Return.
lirtosiast,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.