Napisz program, który używa wszystkich drukowalnych niealfanumerycznych symboli ASCII


17

W szczególności użyj każdego z tych symboli przynajmniej raz w kodzie źródłowym:

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

Symbole wewnątrz komentarzy, literałów łańcuchowych, wyrażeń regularnych (lub innych literałów itp.) Nie liczą się (ale ich ograniczniki, takie jak /**/lub ""liczą).

Program nie powinien wykonywać żadnych działań. Po prostu musi się skompilować i nic nie robić po uruchomieniu.

Jeśli z jakiegoś powodu niektóre symbole nie mogą być użyte w wybranym przez ciebie języku, wyjaśnij to rygorystycznie (co i dlaczego należy wykluczyć).

Aktualizacja: Kilka odpowiedzi używało symboli z wyrażeniami regularnymi. Uznałbym to za nieco problematyczne, jest to to samo, co umieszczenie ich w literałach lub komentarzach łańcuchowych (dlatego umieszczam itd. W tym wymaganiu). Spróbuj bez tego. Zaktualizowałem również powyższy wymóg.

Aktualizacja: Wygrywa najkrótszy kod (oznaczony jako golf golfowy ). Zgodnie z sugestią najprawdopodobniej będziemy potrzebować kryteriów rozstrzygających. Sugeruję, że w przypadku remisu wygrywa ten, w którym symbole ASCII pojawiają się w możliwie największej kolejności. Formalnie: odfiltruj pierwsze wystąpienie każdego z wymienionych symboli z programu. Spowoduje to permutację wymienionych symboli. Program z mniejszą liczbą inwersji jego permutacji wygrywa.

Aktualizacja: Byłbym szczęśliwy widząc niektóre / więcej rozwiązań w zwykłych / głównych językach, takich jak C (++), Java, Scala, Haskell itp.


1
Czy możemy mieć wyjątek literalny dla znaków, które nie występują w żadnym słowie kluczowym, składni lub operatorze w danym języku? To nie jest @%ani odwrót może pojawić się w c, chyba że jako część literału (w wystarczająco nowych wersjach c %może pojawić się w digrafach). (i #pojawia się tylko w dyrektywach preprocesora, ale będziemy musieli z tym żyć)? To znaczy, proszę, aby podejście Matta zostało wyraźnie zatwierdzone.
dmckee,

2
najkrótszy kod wygrywa? Podejrzewam, że będą też
obowiązywać

1
W JavaScript, znaki #, @i `nie są poza prawną jakiejkolwiek dosłownym
Peter Olson

6
Jest to w zasadzie konkurs „znajdź język, w którym wszystkie te znaki mogą być używane jako składnia”. Moim zdaniem dość kiepskie złoto kodowe
Earlz

1
Tak, zgadzam się z @Ellz, myślę, że byłoby lepiej, gdyby musiał zrobić coś pożytecznego, w dzierżawnej ilości kodu, w ten sposób ludzie nie mogliby po prostu puścić wszystkich znaków, ale to nie byłoby rozwiązanie . Ponieważ w obecnej postaci nie można tego skrócić, a każdy język, w którym niektóre znaki nie są ważne poza literałami - jak zauważyło kilka osób - jest natychmiast dyskwalifikowany. Co oznacza, że ​​istnieje tylko kilka nie tylko akceptowalnych odpowiedzi, ale poprawny okres odpowiedzi.
Ryan

Odpowiedzi:


18

Brainf * ck, 32 znaki

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

Drukuje uśmiechniętą twarz (jeśli konsola może wyświetlać symbol ASCII 1)

Tak, rozwiązanie Branf * ck, które bije Golfscript! : P

Jeśli nalegasz na brak danych wyjściowych, po prostu wymień +i .:

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

6
Hm ... Wolałbym powiedzieć, że robi ukrywanie znaków w komentarzach, ale cóż.
przestał obracać przeciwnie do zegara

5
@leftaroundabout: Nie są to komentarze techniczne, ponieważ nie można ich używać do komentowania prawidłowych instrukcji. Są traktowane jako białe znaki. Nawiasem mówiąc, zgadzam się z tobą, że jest to bezwstydne rozciąganie zasad.
vsz

3
@vsz Nie ma nic złego w zginaniu reguł.
Gareth,

1
Numer inwersji tego rozwiązania wynosi 24, więc jest to zwycięzca zgodnie z zasadami. Mam co do tego pewne wątpliwości, ponieważ ignorowanie postaci jest bardzo bliskie komentarzom, ale powiedziałbym, że to moje złe, nie pomyślałem o tej możliwości, pisząc pytanie.
Petr Pudlák,

1
@ BodoThiesen Rzeczywiście, jest to dość stary, myślę, że może również kwalifikować się do zwycięskiego rozwiązania, chociaż ten jest lepszy, nawet jeśli nieco rozciąga zasady.
Petr Pudlák,

47

Perl, 32 znaki

bez ukrywania symboli w komentarzach, literałach łańcuchowych lub wyrażeniach regularnych. używa wszystkich symboli dokładnie raz.

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

Opis

próbowałem wskazać pierwszeństwo operatora za pomocą wcięcia: wyrażenia znajdujące się najbardziej po prawej stronie są oceniane przed wyrażeniami po ich lewej stronie

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

Popraw mnie, jeśli się mylę, ale czy właśnie stworzyłeś skalar o nazwie `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Pan Llama,

2
@GigaWatt nie, jest to sekwencja kilku różnych wyrażeń. dodam opis tego, jak to jest oceniane
nowy

@GigaWatt: Nie; w Perlu wszystkie identyfikatory symboliczne to pojedyncze znaki. Tego rodzaju rzeczy, ja myślę program wykorzystuje tylko $`, @", %'oraz *.(skalar, tablica hash i typeglob, odpowiednio), choć to strasznie trudno być pewny. . .
ruakh

23
Albo jesteś geniuszem, albo dowolna losowa sekwencja bajtów jest prawidłowym programem w Perlu. Lub oba.
ugoren

4
Chociaż zgodnie z własnymi zasadami musiałem nagrodzić rozwiązanie Brainfuck, ten jest moim ulubionym (ten sam rozmiar, ale numer inwersji 279).
Petr Pudlák,

9

Biała spacja, 32

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

wszystkie znaki niebiałe są ignorowane, więc jest to właściwie pusty program


3
można argumentować, że wszystkie znaki
niebiałe

8

Python 65

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

Użyłem znaków ?i $dosłownego ciągu znaków. Te znaki nielegalne poza literałami ciągów lub komentarzami.


Zawiera niepoprawną składnię. W szczególności {[`'"$?'`,]}nie jest poprawny, ponieważ tworzy słownik z kluczem bez powiązanej wartości. Możesz sprawić, by był ważny jeszcze dwoma postaciami:{[`'"$?'`,]:0}
Strigoides,

1
@ Strigoides nie, to sprawia, że ​​zestaw nie jest dyktą. ale nawet jeśli tak było (klawisz dict bez wartości), działa, co było wymaganiem, niepoprawna składnia. (potrzebujesz Pythona = = 2,7, aby to działało)
Matt

Rozumiem, używałem Pythona 2.6 podczas testowania.
Strigoides,

8

PHP, 32 znaki

Prawdopodobnie trochę troll, ten program PHP jest również QUINE i używa wszystkich symboli w dokładnie takiej kolejności, w jakiej są wymienione.

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

Wykonane z wiersza poleceń, wyjście będzie po prostu zawartością pliku, ponieważ nie <?phpmożna wywołać interpretatora.

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

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

4
IMHO narusza to Symbole wewnątrz komentarzy, literałów łańcuchowych, wyrażeń regularnych (lub innych literałów itp.) Nie liczą się , ponieważ cały program jest jednym literałem.
Petr Pudlák

Ponadto program wymagany przez zadanie nie powinien nic wypisywać, a jest tylko jeden quine, który nic nie wypisuje.
Paŭlo Ebermann

Nie jest nawet analizowany przez PHP, więc jest to prawie nieprawidłowe
Rob

@RobQuist oczywiście się analizuje, jest zajęty polowaniem na nieuchwytny token T_OPEN_TAG aż do samego końca
Leigh

7

Perl 6 (43 znaki)

Zdefiniujmy operator infix o dość nietypowej nazwie:

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

To nie jest dosłowność ani dosłowność w RE ani nic ukrytego w komentarzu. Nie wierzysz mi? Uruchomienie następującego programu spowoduje wyświetlenie „2”:

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

Ale jestem pewien, że wy, nitpickerzy, rozszerzyliście zasady, aby wykluczyć redefinicję samego języka, abyśmy byli nieszczęśliwi. :(


Powiedziałbym, że to w porządku, użycie symboli w identyfikatorze wydaje się rozsądne.
Petr Pudlák

7

Haskell, 53

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

Możemy to nieco skrócić

45

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

jednak ten program nie kończy, i zużywa więcej znaków ( '!', '<', '|') w nowo zdefiniowanej wrostkiem.


5

k (33 znaków)

Bardzo łatwe w k. Niestety "musi zostać sparowany.

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

5

GolfScript (33 znaki)

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

"musi zostać sparowany. Zajęło trochę prób i błędów, aby nic nie wyświetlało - większość innych pozycji :'wyniku w niektórych wynikach.


5

J, 33 znaki

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

' należy podwoić, aby uniknąć błędów składniowych.

W mojej pierwszej odpowiedzi brakowało niektórych symboli.


5

C, 48 znaków

Rodzaj oszustwa.

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

2
Zdecydowanie przekraczając granice „oszukiwania”, ponieważ większość z nich pojawia się w niesprawdzonym makrze. Co powiesz na #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Nic w łańcuchu, po prostu zamienia się w jeden ... Oczywiście byłby dłuższy.
dmckee,

@dmckee, nie sądzę, że twoja sugestia jest bardziej uczciwa niż moja. W obu przypadkach problematyczne znaki nie kończą się na kodzie. Mógłbym przenieść większość z nich do kodu (jak to zrobiłem "";), ale $@backtick wydaje się beznadziejny.
ugoren

Bez wątpienia moje jest również ohydne, podstępne i podstępne. Ale to też jest fajne.
dmckee,

@dmckee, chodzi o zabawę. BTW, potrzebujesz #define Q(_) #_. Preprocesor traktowałby "##_##"jako dosłowny ciąg znaków.
ugoren

5

Postscript - 32 znaki

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

Powoduje powstanie obiektu na stosie, ale poza tym nie ma żadnych efektów. Postscript dopuszcza prawie każdy znak w identyfikatorze, z wyjątkiem <>()[]{}/specjalnych form składni i %wprowadzających komentarz. Program jest tokenizowany jako

{                  % 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 znaków)

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

O ile mi wiadomo, znak $ nie jest prawidłowym znakiem poza literałami ciągów, więc nie użyłem go w mojej odpowiedzi.

EDYCJA : Dzięki Peterowi Taylorowi skróciłem kod.


1
#if A... #endifjest krótsza niż #region... #endregion. I "x"[0]+jest krótszy niż [System.STAThread].
Peter Taylor,

3

PowerShell (52 znaki)

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

Musiałem umieścić znak ^ jako literał łańcuchowy, ponieważ o ile wiem, znak ^ nie jest legalnym znakiem PowerShell poza literałami łańcuchowymi. Popraw mnie, jeśli się mylę.

Jedynym sposobem, w jaki udało mi się zmieścić w znaku : jest użycie operatora :: w celu wywołania metody statycznej.


3

Schemat, 41 znaków

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

Wykorzystuje to niesamowitą tolerancję Scheme dla znaków w nazwach zmiennych. W tym programie tworzę zmienną o nazwie! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~, Którą Schemat chętnie przyjmuje.


3

Tcl 37 znaków

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

Definiuje zmienną !#$%&'()*+,-./:<=>?@[]^\_`|~z pustym ciągiem


3

C: 83 56 znaków

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

Znaki i znaki wsteczne nie są częścią dozwolonej składni C, więc umieściłem je między cudzysłowami.


1
Dlaczego w nawiasie (b)? To dziwna składnia i mnóstwo postaci.
ugoren

1
Jeśli użyjesz struktury dla kropki, 0.0jest ona znacznie krótsza.
ugoren

Jak mogłem o tym nie myśleć (0.0)? Nawias jest pozostałością po tym, jak uratowali jedną postać, ale teraz są naprawdę niepotrzebni. Dzięki @ugoren!
Fors

Myślę, że main(_,$)uratuje postać.
ugoren

Dzięki gcc możesz pisać x?:y, ale nie jest to standardowy C.
ugoren

2

Common Lisp, 33 znaki

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

Główna część powyższej wartości ocenia (a raczej oceniałaby, gdyby nie #+()przed nią), symbol o nazwie:

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

Ma #+()to na celu uniknięcie wyjścia. Nie jestem pewien, czy |foo|składnia symboli liczy się jako literał, ale symbole są używane jako nazwy zmiennych / funkcji we wspólnym Lisp, i jest już kilka odpowiedzi, w których zastosowano niezbędne znaki.


2

Smalltalk (dialekt Squeak 4.x) 38 znaków

Zaimplementuj tę metodę w Object, składnia jest poprawna, jeśli Preferencje Zezwalaj na przypisywanie podkreślenia (co jest ustawieniem domyślnym)

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

zadeklaruj Z jako globalną zmienną w wyskakującym menu, jeśli jest interaktywne

Objaśnienia:

  • % & * + / <=>? @! ~ to selektor binarny (operator)
  • y jest parametrem (operand)
  • „” to pusty komentarz
  • ^ oznacza powrót
  • Z jest zmienną globalną
  • _ to zadanie
  • () ogranicza wyrażenie podrzędne
  • [: z |] ogranicza blok kodu za pomocą jednego parametru z
  • {} ogranicza tablicę
  • # '' jest literałem symbolu wykonanym z pustego ciągu znaków (pierwszy element tablicy)
  • , to wiadomość binarna wysłana na powyższy symbol
  • $ `to dosłowny znak używany jako argument powyższej wiadomości
  • ; służy do łączenia drugiej wiadomości wysłanej do tego samego odbiornika symboli # ''
  • druga wiadomość to -
  • y jest używany jako argument drugiego komunikatu
  • . służy do oddzielenia następnej instrukcji (tutaj jest ostatni okres)

Cholera, kto powiedział, że Smalltalk jest czytelny?

Zauważ, że nie oszukiwałem, jedyna nieważna postać `jest umieszczona w literalnej postaci. EDYCJA patrz poniżej, to było fałszywe stwierdzenie (przynajmniej w skrzypieniu)


Ale dzięki tej sztuczce możemy zmniejszyć do 34 znaków

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

Tym razem:

  • # () ogranicza literalną tablicę
  • który zawiera 4 literalne symbole: _; `i 1 dosłowny znak $ '

Ściśle mówiąc, możemy uznać to za oszustwo ... To nie jest dosłowny Sznurek, ale wciąż jest niepusty dosłowny ...

Nadal muszę podwoić komentarz „” (chyba że utworzę z niego literalną postać $ ”, ale muszę podwoić ciąg„ ”)
Nadal muszę użyć litery dla parametru (_ nie jest akceptowane, nawet jeśli ustawiamy Preferencje zezwalaj na podkreślenie w selektorze na true).

Fajne jest to, że możemy nawet uruchomić metodę, na przykład wysłać wiadomość do 1 z argumentem 2:

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

EDYCJA Wreszcie w 35 znakach bez oszukiwania

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

Uwagi:

  • Preferencje pozwalają na podkreślenie w selektorze za pomocą parametru bloku o nazwie x_
  • `jest poprawnym znakiem dla selektora binarnego, w przeciwieństwie do tego, co powiedziałem
  • Używam również $ ', aby uniknąć podwojenia wyceny

1

R: 108 znaków

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

Najwyraźniej najdłuższe przesłanie, ale aby móc używać symboli @i $w R, musimy utworzyć obiekt, który ma szczeliny (za pomocą indeksowania @) i nazwane elementy (za pomocą indeksowania $).
Najkrótszym rozwiązaniem, jakie mogłem wymyślić, było stworzenie nowej klasy object ( a=new(setClass("a",representation(b="list")))), która zbiera swoje żniwo. W przeciwnym razie, appart od klasyki, które nie wymagają wyjaśnienia (takie jak !=, #lub 1:2),

`~`<-`?` 

tworzy nowego operatora, który robi to samo co operator ? (tzn. wywołuje stronę pomocy elementu, który poprzedza).

%*%oblicza iloczyn wewnętrzny dwóch macierzy (tutaj 1^1i .1).
Symbol _nic nie robi (AFAIK) w R, ale jest rutynowo używany w nazwach zmiennych lub funkcji, jak ma to miejsce w tym przypadku.


1

TI-Basic, 36

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

Nie jest to ważne, ponieważ cytat początkowy jest często używany do komentarzy.
Tyzoid

@Tyzoid Przeniosłem go na koniec.
Timtech

Endkończy instrukcję pętli, a nie program. Myślę, że miałeś na myśli Return.
lirtosiast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.