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 nie są legalne 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.