Tulis program yang menggunakan semua simbol ASCII non-alfanumerik yang dapat dicetak

17

Secara khusus, gunakan masing-masing simbol ini setidaknya sekali dalam kode sumber Anda:

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

Simbol di dalam komentar, string literal, regexps (atau jenis literal lainnya, dll.) Tidak dihitung (tetapi pembatasnya seperti /**/atau ""memang dihitung).

Program seharusnya tidak melakukan tindakan apa pun. Hanya perlu mengkompilasi dan tidak melakukan apa-apa saat dijalankan.

Jika karena alasan tertentu beberapa simbol tidak dapat digunakan dalam bahasa pilihan Anda, jelaskan dengan seksama (apa dan mengapa harus dikecualikan).

Pembaruan: Beberapa jawaban menggunakan simbol dengan ekspresi reguler. Saya menganggap ini agak bermasalah, itu sama dengan menempatkan mereka ke string literal atau komentar (itu sebabnya saya menempatkan dll dalam persyaratan itu). Silakan coba tanpa ini. Saya juga memperbarui persyaratan di atas.

Pembaruan: Kemenangan kode terpendek (ditandai sebagai kode-golf ). Seperti yang disarankan, kemungkinan besar kita akan memerlukan beberapa kriteria tie-breaker. Saya menyarankan bahwa jika ada dasi, yang menang adalah di mana simbol ASCII muncul sebanyak yang dipesan. Secara formal: Saring kejadian pertama dari masing-masing simbol yang terdaftar dari suatu program. Ini akan menghasilkan permutasi pada simbol yang terdaftar. Program dengan jumlah inversi yang lebih sedikit dari permutasi yang dimenangkan.

Pembaruan: Saya akan senang melihat beberapa / lebih banyak solusi dalam bahasa reguler / umum, seperti C (++), Java, Scala, Haskell, dll.

Petr Pudlák
sumber
1
Bisakah kita memiliki pengecualian literal untuk karakter yang tidak muncul dalam kata kunci, sintaks atau operator dalam bahasa tertentu? Itu bukan @%atau backtick dapat muncul dalam c kecuali sebagai bagian dari literal (dalam versi c yang cukup baru %dapat muncul dalam digraf). (dan #hanya muncul dalam arahan preprosesor, tetapi kita hanya harus hidup dengan itu)? Yaitu, saya meminta pendekatan Matt agar dibuat eksplisit secara hukum.
dmckee
2
kode menang terpendek? saya curiga akan perlu ada kriteria yang mengikat juga
ardnew
1
Dalam Javascript, karakter #, @dan `tidak sah di luar jenis literal apa pun
Peter Olson
6
Ini pada dasarnya adalah kompetisi "menemukan bahasa yang dapat menggunakan semua karakter ini sebagai sintaksis". Emas kode yang jelek, menurut saya
Earlz
1
Ya saya setuju dengan @Earlz, saya pikir akan lebih baik jika harus melakukan sesuatu yang bermanfaat, dalam jumlah kode sewaan, dengan cara itu orang tidak bisa begitu saja untuk mendapatkan semua karakter tetapi itu bukan solusi ardnew . Karena memang Anda tidak bisa lebih pendek dari itu, ditambah bahasa apa pun di mana beberapa karakter tidak valid di luar literal - seperti yang telah ditunjukkan oleh beberapa orang - langsung didiskualifikasi. Yang berarti hanya ada beberapa jawaban tidak hanya dapat diterima tetapi periode jawaban yang benar.
Ryan

Jawaban:

18

Brainf * ck, 32 karakter

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

Mencetak wajah yang tersenyum (jika konsol Anda dapat menampilkan simbol ASCII 1)

Yay, solusi Branf * ck yang mengalahkan Golfscript! : P

Jika Anda bersikeras tidak ada hasil, cukup tukarkan +dan .:

!"#$%&'()*.+-/:;>=<?@[\]^_`{|}~,
vsz
sumber
6
Hm ... Saya lebih suka mengatakan itu tidak karakter hide dalam komentar, tapi oh well.
Berhenti menghidupkan counterclockwis
5
@leftaroundabout: Itu bukan komentar teknis karena Anda tidak dapat menggunakannya untuk berkomentar instruksi yang valid. Mereka ditangani sebagai ruang kosong. Ngomong-ngomong, saya setuju dengan Anda bahwa ini adalah peregangan aturan yang tidak tahu malu.
vsz
3
@ vsz Tidak ada yang salah dengan menekuk aturan.
Gareth
1
Nomor inversi dari solusi ini adalah 24, jadi pemenangnya sesuai dengan aturan. Saya memiliki keraguan tentang hal itu, karena mengabaikan karakter sangat dekat dengan komentar, tetapi saya akan mengatakan itu buruk saya, saya tidak memikirkan kemungkinan ini ketika menulis pertanyaan.
Petr Pudlák
1
@BodoThiesen Memang itu sudah cukup tua, saya kira itu mungkin juga memenuhi syarat untuk solusi yang menang, meskipun yang ini lebih baik, meskipun itu sedikit memperpanjang aturan.
Petr Pudlák
47

Perl, 32 karakter

tidak ada simbol yang disembunyikan dalam komentar, string literal, atau ekspresi reguler. menggunakan semua simbol tepat sekali.

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

Deskripsi

Saya telah mencoba untuk menunjukkan operator diutamakan dengan lekukan: ekspresi paling kanan dievaluasi sebelum yang ke kiri

        $`            # 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 #
ardnew
sumber
Koreksi saya jika saya salah, tetapi apakah Anda baru saja membuat skalar yang disebut `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Tn. Llama
2
@ GigaWatt tidak, ini adalah urutan dari beberapa ekspresi yang berbeda. saya akan menambahkan deskripsi tentang bagaimana itu dievaluasi
ardnew
@GigaWatt: Tidak; di Perl, pengidentifikasi simbolis semuanya adalah karakter tunggal. Dari hal semacam itu, saya pikir program ini hanya menggunakan $`, @", %', dan *.(skalar, array, hash, dan typeglob, masing-masing), meskipun itu sangat sulit untuk memastikan. . .
ruakh
23
Entah Anda seorang jenius, atau urutan byte acak adalah program Perl yang valid. Atau keduanya.
ugoren
4
Meskipun menurut aturan saya sendiri saya harus memberikan solusi Brainfuck, yang ini adalah favorit saya (ukuran yang sama, tetapi nomor inversi 279).
Petr Pudlák
9

Ruang putih, 32

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

semua karakter non-spasi diabaikan, jadi ini sebenarnya adalah program kosong

SeanC
sumber
3
orang bisa berpendapat bahwa semua karakter non-spasi putih adalah komentar dan ini tidak valid :)
NRGdallas
8

Python 65

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

Saya menggunakan karakter ?dan $di dalam string literal. Karakter-karakter ini tidak sah di luar string literal atau komentar.

Mat
sumber
Ini mengandung sintaks yang tidak valid. Khususnya, {[`'"$?'`,]}tidak valid, karena membuat kamus dengan kunci tanpa nilai yang terkait. Anda dapat membuatnya valid dengan dua karakter lebih seperti:{[`'"$?'`,]:0}
Strigoides
1
@Strigoides tidak, itu membuat set bukan dict. tetapi bahkan jika itu terjadi (kunci dict tanpa nilai) berjalan, yang merupakan persyaratan, bukan sintaks yang valid. (Anda perlu python> = 2,7 agar bisa berfungsi)
Matt
Saya tahu, saya menggunakan python 2.6 ketika saya mengujinya.
Strigoides
8

PHP, 32 karakter

Mungkin sedikit troll, program PHP ini juga QUINE , dan menggunakan semua simbol dalam urutan yang tepat seperti yang tercantum.

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

Dieksekusi dari baris perintah, output hanya akan menjadi isi file, karena tidak ada <?phpuntuk memanggil penerjemah.

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

$ php a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Leigh
sumber
4
IMHO ini melanggar Simbol di dalam komentar, string literal, regexps (atau jenis literal dll.) Tidak masuk hitungan , karena keseluruhan program adalah satu literal tunggal.
Petr Pudlák
Selain itu, program yang diperlukan oleh tugas seharusnya tidak menghasilkan apa-apa, dan hanya ada satu quine yang tidak menghasilkan apa-apa.
Paŭlo Ebermann
Bahkan tidak diuraikan oleh PHP jadi ini cukup tidak valid
Rob
@RobQuist tentu saja diuraikan, sibuk berburu token T_OPEN_TAG yang sulit dipahami sampai akhir yang pahit
Leigh
7

Perl 6 (43 karakter)

Mari kita definisikan operator infiks dengan nama yang agak tidak biasa:

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

Ini bukan literal atau literal dalam RE atau apa pun yang tersembunyi dalam komentar. Kamu tidak percaya padaku? Menjalankan program berikut akan menghasilkan "2":

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

Tapi saya cukup yakin Anda penipu akan memperpanjang aturan lebih lanjut untuk mengecualikan redefinisi dari bahasa itu sendiri untuk membuat kita tidak senang. :(

gfldex
sumber
Saya akan mengatakan ini ok, menggunakan simbol dalam pengenal tampaknya masuk akal.
Petr Pudlák
7

Haskell, 53

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

Kita bisa membuat ini sedikit lebih pendek

45

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

Namun program ini tidak menghentikan, dan menggunakan lebih karakter ( '!', '<', '|') di infiks baru-didefinisikan.

berhenti mengubah counterclockwis
sumber
5

k (33 karakter)

Sangat mudah dalam k. Sayangnya "harus dipasangkan.

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

GolfScript (33 karakter)

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

"harus dipasangkan. Butuh sedikit trial and error untuk membuatnya tidak menghasilkan apa-apa - sebagian besar posisi lain dari :'hasil dalam beberapa keluaran.

Peter Taylor
sumber
5

J, 33 karakter

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

' perlu digandakan untuk menghindari kesalahan sintaksis.

Jawaban pertama saya hilang beberapa simbol.

Gareth
sumber
5

C, 48 karakter

Agak curang.

#define _ ~''*+,-./:<=>?[]`|\
@%^$&!
main(){"";}
ugoren
sumber
2
Jelas mendorong batas "kecurangan" karena kebanyakan dari mereka muncul dalam makro yang tidak pantas. Bagaimana dengan #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Tidak ada dalam string, itu hanya akan dikonversi menjadi satu ... Itu akan lebih lama, tentu saja.
dmckee
@ dmckee, saya tidak berpikir saran Anda lebih jujur ​​daripada saya. Dalam kedua kasus, karakter bermasalah tidak berakhir dalam kode. Saya bisa memindahkan sebagian besar dari mereka ke kode (seperti yang saya lakukan dengan "";), tetapi $@dan backtick sepertinya tidak ada harapan.
ugoren
Tidak diragukan lagi, punyaku juga busuk, licik, dan licik. Tapi itu juga menyenangkan.
dmckee
@ dmckee, asyik tentang ini. BTW, kamu butuh #define Q(_) #_. Preprosesor akan memperlakukan "##_##"sebagai string literal.
ugoren
5

Postscript - 32 karakter

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

Menghasilkan objek di stack, tetapi sebaliknya tidak memiliki efek. Postscript memungkinkan hampir semua karakter dalam pengidentifikasi kecuali <>()[]{}/yang merupakan bentuk sintaksis khusus dan %yang memberikan komentar. Program ini ditandai sebagai

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

C # (91 karakter)

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

Sejauh yang saya tahu, $ karakter bukan karakter yang valid di luar string literal, jadi saya tidak menggunakannya dalam jawaban saya.

EDIT : Terima kasih kepada Peter Taylor , saya mempersingkat kodenya.

Masyarakat
sumber
1
#if A... #endiflebih pendek dari #region... #endregion. Dan "x"[0]+lebih pendek dari [System.STAThread].
Peter Taylor
3

PowerShell (52 karakter)

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

Saya harus meletakkan karakter ^ sebagai string literal karena sejauh yang saya tahu, ^ karakter bukan karakter PowerShell legal di luar string literal. Koreksi saya jika saya salah.

Satu-satunya cara yang saya temukan cocok dengan karakter : adalah dengan menggunakan operator :: untuk melakukan panggilan ke metode statis.


sumber
3

Skema, 41 karakter

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

Ini mengambil keuntungan dari toleransi Skema yang luar biasa untuk karakter dalam nama variabel. Dalam program ini saya membuat variabel dengan nama! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~ Yang diterima dengan senang hati oleh Skema.

Strigoides
sumber
3

Tcl 37 karakter

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

Mendefinisikan variabel !#$%&'()*+,-./:<=>?@[]^\_`|~dengan string kosong

Johannes Kuhn
sumber
3

C: 83 56 karakter

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

Tanda-tanda dan backticks bukan bagian dari sintaks C yang diizinkan, jadi saya telah menempatkannya di antara tanda kutip.

Untuk S
sumber
1
Mengapa tanda kurung masuk (b)? Ini sintaks yang aneh dan pemborosan karakter.
ugoren
1
Jika Anda menggunakan struct untuk titik, 0.0jauh lebih pendek.
ugoren
Bagaimana saya tidak bisa memikirkan itu (0,0)? Tanda kurung adalah sisa dari ketika mereka benar-benar menyelamatkan satu karakter, tetapi sekarang mereka memang tidak perlu. Terima kasih @ugoren!
Fors
Saya pikir main(_,$)akan menghemat karakter.
ugoren
Dan dengan gcc, Anda dapat menulis x?:y, tetapi itu bukan standar C.
ugoren
2

Gangguan Umum, 33 karakter

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

Bagian utama dari evaluasi di atas (atau lebih tepatnya, akan mengevaluasi jika bukan untuk yang #+()di depannya) dengan simbol bernama:

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

The #+()adalah untuk menghindari output. Saya tidak yakin apakah |foo|sintaks untuk simbol dianggap sebagai literal, tetapi simbol digunakan sebagai nama variabel / fungsi dalam Common Lisp, dan ada beberapa jawaban yang sudah menggunakan karakter yang diperlukan di dalamnya.

Strigoides
sumber
2

Smalltalk (Squeak 4.x dialek) 38 karakter

Menerapkan metode ini di Object, sintaksnya valid jika Preferensi Izinkan penetapan garis bawah (yang merupakan pengaturan default)

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

menyatakan Z sebagai var global dalam menu pop-up jika interaktif

Penjelasan:

  • % & * + / <=>? @! ~ adalah pemilih biner (operator)
  • y adalah parameter (operan)
  • "" adalah komentar kosong
  • ^ berarti kembali
  • Z adalah variabel global
  • _ adalah tugas
  • () membatasi sub-ekspresi
  • [: z |] membatasi satu blok kode dengan satu parameter z
  • {} membatasi suatu Array
  • # '' adalah simbol literal yang terbuat dari String kosong (elemen pertama dari Array)
  • , adalah pesan biner yang dikirim ke Simbol di atas
  • $ `adalah karakter literal yang digunakan sebagai argumen dari pesan di atas
  • ; adalah untuk menghubungkan pesan kedua yang dikirim ke penerima Simbol yang sama # ''
  • pesan kedua adalah -
  • y digunakan sebagai argumen pesan kedua
  • . adalah untuk memisahkan instruksi berikutnya (ini periode terakhir)

Sial, siapa bilang Smalltalk bisa dibaca?

Perhatikan bahwa saya tidak curang, satu-satunya karakter yang tidak valid `dimasukkan ke dalam Karakter literal. Sunting lihat di bawah, ini adalah pernyataan salah (setidaknya dalam mencicit)


Tapi kita bisa mencapai 34 karakter dengan trik ini

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

Kali ini:

  • # () membatasi Array literal
  • yang berisi 4 Simbol literal: _; `dan 1 Karakter literal $ '

Sebenarnya, kita dapat menganggap ini sebagai kecurangan ... Ini bukan String literal, tetapi masih non literal ...

Saya masih harus menggandakan kutipan komentar "" (kecuali jika saya membuat Karakter literal dengan $ ", tapi kemudian saya perlu menggandakan kutipan String '')
Saya masih harus menggunakan huruf untuk parameter (_ tidak diterima bahkan jika kita atur Preferensi mengizinkan garis bawah pada pemilih menjadi true).

Yang menyenangkan adalah kita bahkan dapat menjalankan metode, misalnya mengirim pesan ke 1 dengan argumen 2:

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

EDIT Akhirnya dalam 35 karakter tanpa curang

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

Catatan:

  • Preferensi memungkinkan underscore dalam pemilih mengaktifkan menggunakan parameter blok bernama x_
  • `adalah karakter yang valid untuk pemilih biner yang bertentangan dengan apa yang saya katakan
  • Saya juga menggunakan $ 'untuk menghindari menggandakan penawaran
alias bagus
sumber
1

R: 108 karakter

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

Jelas pengajuan terpanjang, tetapi untuk dapat menggunakan simbol @dan $dalam R, kita perlu membuat objek yang memiliki slot (diindeks menggunakan @) dan elemen bernama (diindeks menggunakan $).
Solusi terpendek yang dapat saya pikirkan adalah membuat kelas objek baru ( a=new(setClass("a",representation(b="list")))), yang memakan biaya. Jika tidak, mulai dari klasik yang tidak memerlukan penjelasan (seperti !=, #atau 1:2),

`~`<-`?` 

membuat operator baru yang melakukan hal yang sama dengan operator ?(yaitu memanggil halaman bantuan dari elemen yang didahului).

%*%menghitung produk dalam dari dua matriks (di sini 1^1dan .1).
Simbol _tidak melakukan apa pun (AFAIK) dalam R tetapi secara rutin digunakan dalam nama variabel atau fungsi, seperti halnya di sini.

plannapus
sumber
1

TI-Basic, 36

:End:#$%&'()*+.-/;>=<?@[\]^_`{|}~,!"
Timtech
sumber
Ini tidak valid karena kutipan awal sering digunakan untuk komentar.
Tyzoid
@ Tyzoid saya memindahkannya sampai akhir.
Timtech
Endmengakhiri pernyataan loop, bukan program. Saya pikir Anda maksud Return.
lirtosiast