Viết chương trình sử dụng tất cả các ký hiệu ASCII không chữ và số có thể in được


17

Cụ thể, sử dụng từng ký hiệu này ít nhất một lần trong mã nguồn của bạn:

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

Các biểu tượng bên trong các bình luận, chuỗi ký tự, biểu thức chính quy (hoặc bất kỳ loại chữ nào khác, v.v.) không được tính (nhưng các dấu phân cách của chúng như /**/hoặc ""đếm).

Chương trình không nên thực hiện bất kỳ hành động. Nó chỉ phải biên dịch và không làm gì khi chạy.

Nếu vì một lý do nào đó, một số biểu tượng không thể được sử dụng trong ngôn ngữ bạn chọn, hãy giải thích điều đó một cách chặt chẽ (những gì và tại sao phải được loại trừ).

Cập nhật: Một vài câu trả lời được sử dụng với các biểu thức thông thường. Tôi coi điều này có một chút vấn đề, nó giống như việc đưa chúng vào chuỗi ký tự hoặc bình luận (đó là lý do tại sao tôi đặt vv trong yêu cầu đó). Hãy thử mà không có điều này. Tôi cũng cập nhật các yêu cầu trên.

Cập nhật: Chiến thắng mã ngắn nhất (được gắn thẻ là mã golf ). Theo đề xuất, rất có thể chúng ta sẽ cần một số tiêu chí tie-breaker. Tôi đề nghị rằng nếu có một sự ràng buộc, thì người chiến thắng là người mà các biểu tượng ASCII xuất hiện càng nhiều thứ tự càng tốt. Chính thức: Lọc ra lần xuất hiện đầu tiên của từng biểu tượng được liệt kê từ một chương trình. Điều này sẽ dẫn đến một hoán vị trên các biểu tượng được liệt kê. Chương trình có số lần nghịch đảo ít hơn sẽ hoán vị.

Cập nhật: Tôi rất vui khi thấy một số / nhiều giải pháp bằng các ngôn ngữ thông thường / chính thống, chẳng hạn như C (++), Java, Scala, Haskell, v.v.


1
Chúng ta có thể có một ngoại lệ theo nghĩa đen cho các ký tự không xuất hiện trong bất kỳ từ khóa, cú pháp hoặc toán tử trong một ngôn ngữ cụ thể không? Điều đó không phải @%cũng không phải là backtick có thể xuất hiện trong c ngoại trừ một phần của nghĩa đen (trong các phiên bản đủ mới của c %có thể xuất hiện trong các bản sao). (và #chỉ xuất hiện trong các chỉ thị tiền xử lý, nhưng chúng ta sẽ phải sống với điều đó)? Đó là, tôi đang yêu cầu cách tiếp cận của Matt phải được thực hiện hợp pháp.
dmckee

2
Mã ngắn nhất thắng? tôi nghi ngờ sẽ cần phải là một tiêu chí quyết định phá vỡ quá
ardnew

1
Trong javascript, các nhân vật #, @, và `nằm ngoài không hợp pháp của bất kỳ loại đen
Peter Olson

6
Về cơ bản, đây là một cuộc thi "tìm một ngôn ngữ có thể sử dụng tất cả các ký tự này làm cú pháp". Theo ý kiến ​​của tôi, mã vàng khá
nhảm nhí

1
Vâng, tôi đồng ý với @Earlz, tôi nghĩ sẽ tốt hơn nếu nó phải làm một cái gì đó hữu ích, trong số tiền thuê mã, theo cách đó mọi người không thể bỏ qua để đưa tất cả các nhân vật vào nhưng nó sẽ không phải là giải pháp của họ. . Vì lý do là bạn không thể rút ngắn hơn, cộng với bất kỳ ngôn ngữ nào trong đó một số ký tự không hợp lệ ngoài nghĩa đen - như đã được một số người chỉ ra - ngay lập tức bị loại. Điều đó có nghĩa là chỉ có một vài câu trả lời không chỉ chấp nhận được mà còn có thời gian trả lời đúng.
Ryan

Câu trả lời:


18

Brainf * ck, 32 ký tự

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

In mặt cười (nếu bảng điều khiển của bạn có thể xuất ký hiệu ASCII 1)

Yay, một giải pháp Branf * ck đánh bại Golfscript! : P

Nếu bạn khăng khăng không có đầu ra, chỉ cần trao đổi +.:

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

6
Hm ... Tôi muốn nói nó không ẩn các nhân vật trong các ý kiến, nhưng oh well.
đã ngừng quay ngược chiều

5
@leftaroundabout: Chúng không phải là nhận xét về mặt kỹ thuật vì bạn không thể sử dụng chúng để nhận xét các hướng dẫn hợp lệ. Chúng được xử lý như khoảng trắng. Nhân tiện, tôi đồng ý với bạn rằng đây là một sự kéo dài không biết xấu hổ của các quy tắc.
vsz

3
@vsz Không có gì sai khi bẻ cong các quy tắc.
Gareth

1
Số lượng đảo ngược của giải pháp này là 24, vì vậy nó là người chiến thắng theo các quy tắc. Tôi có một số nghi ngờ về điều đó, vì bỏ qua các nhân vật rất gần với các bình luận, nhưng tôi nói đó là điểm xấu của tôi, tôi đã không nghĩ đến khả năng này khi viết câu hỏi.
Petr Pudlák

1
@BodoThiesen Thật sự khá cũ, tôi đoán rằng cũng có thể đủ điều kiện cho một giải pháp chiến thắng, mặc dù giải pháp này tốt hơn, mặc dù nó kéo dài các quy tắc một chút.
Petr Pudlák

47

Perl, 32 ký tự

không có biểu tượng ẩn trong các bình luận, chuỗi ký tự hoặc biểu thức chính quy. sử dụng tất cả các biểu tượng chính xác một lần.

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

Sự miêu tả

tôi đã cố gắng chỉ ra quyền ưu tiên của toán tử với thụt lề: các biểu thức hầu hết bên phải được đánh giá trước các biểu thức bên trái của chúng

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

Sửa lỗi cho tôi nếu tôi sai, nhưng bạn vừa gọi vô hướng `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Ông Llama

2
@GigaWatt không, đây là một chuỗi các biểu thức khác nhau. tôi sẽ thêm một mô tả về cách nó được đánh giá
ardew

@GigaWatt: Không; trong Perl, các định danh tượng trưng đều là các ký tự đơn. Trong đó đại loại như vậy, tôi nghĩ rằng chương trình này chỉ sử dụng $`, @", %', và *.(một đại lượng vô hướng, mảng, băm, và typeglob, tương ứng), mặc dù nó là hết sức khó khăn để đảm bảo. . .
ruakh

23
Bạn là một thiên tài, hoặc bất kỳ chuỗi byte ngẫu nhiên nào là một chương trình Perl hợp lệ. Hoặc cả hai.
ugoren

4
Mặc dù theo quy tắc của riêng tôi, tôi đã phải trao giải cho Brainfuck, đây là giải pháp yêu thích của tôi (cùng kích thước, nhưng số đảo ngược 279).
Petr Pudlák

9

Khoảng trắng, 32

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

tất cả các ký tự không phải khoảng trắng đều bị bỏ qua, vì vậy đây thực sự là một chương trình trống


3
người ta có thể lập luận rằng tất cả các nhân vật không phải là khoảng trắng đều là nhận xét và điều này không hợp lệ :)
NRGdallas

8

Con trăn 65

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

Tôi đã sử dụng các ký tự ?$bên trong một chuỗi ký tự. Những ký tự này không hợp pháp bên ngoài chuỗi chữ hoặc bình luận.


Điều này chứa cú pháp không hợp lệ. Cụ thể, {[`'"$?'`,]}không hợp lệ, vì nó tạo ra một từ điển với khóa không có giá trị liên quan. Bạn có thể làm cho nó hợp lệ với hai ký tự như vậy:{[`'"$?'`,]:0}
Strigoides

1
@Strigoides không, nó làm cho một bộ không phải là một dict. nhưng ngay cả khi đó là trường hợp (khóa dict không có giá trị) thì nó vẫn chạy, đó là yêu cầu, không phải là cú pháp hợp lệ. (bạn cần python> = 2.7 để nó hoạt động)
Matt

Tôi thấy, tôi đã sử dụng python 2.6 khi tôi thử nghiệm nó.
Strigoides

8

PHP, 32 ký tự

Có lẽ là một chút troll, chương trình PHP này cũng là một QUINE và sử dụng tất cả các biểu tượng theo thứ tự chính xác mà chúng được liệt kê.

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

Được thực hiện từ dòng lệnh, đầu ra sẽ chỉ đơn giản là nội dung của tệp, vì không có gì <?phpđể gọi trình thông dịch.

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

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

4
IMHO điều này vi phạm các Biểu tượng bên trong các bình luận, chuỗi ký tự, biểu thức chính quy (hoặc bất kỳ loại chữ nào khác, v.v.) không được tính , vì toàn bộ chương trình là một chữ duy nhất.
Petr Pudlák

Ngoài ra, chương trình được yêu cầu bởi tác vụ sẽ không tạo ra kết quả gì và chỉ có một quine không tạo ra kết quả gì.
Paŭlo Ebermann 8/12/2016

Nó thậm chí không được phân tích cú pháp bởi PHP nên điều này khá không hợp lệ
Rob

@RobQuist tất nhiên là nó được phân tích cú pháp, nó đang bận săn lùng mã thông báo T_OPENiah khó nắm bắt cho đến khi kết thúc cay đắng
Leigh

7

Perl 6 (43 ký tự)

Hãy xác định một toán tử infix với một tên khá bất thường:

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

Nó không phải là nghĩa đen hay nghĩa đen trong RE hay bất cứ điều gì ẩn trong một bình luận. Bạn không tin tôi? Chạy chương trình sau sẽ xuất "2":

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

Nhưng tôi khá chắc chắn rằng các bộ điều khiển của bạn sẽ mở rộng các quy tắc hơn nữa để loại trừ việc xác định lại ngôn ngữ để làm cho chúng ta không hài lòng. :


Tôi muốn nói rằng điều này là ổn, sử dụng các ký hiệu trong một định danh có vẻ hợp lý.
Petr Pudlák

7

Haskell, 53

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

Chúng ta có thể làm điều này ngắn hơn một chút

45

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

Tuy nhiên chương trình này không chấm dứt, và việc sử dụng ký tự trở lên ( '!', '<', '|') trong trung tố mới được xác định.


5

k (33 ký tự)

Rất dễ dàng trong k. Thật không may "phải được ghép nối.

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

5

GolfScript (33 ký tự)

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

"phải được ghép nối Phải mất một chút thử nghiệm và lỗi để đưa nó ra đầu ra không có gì - hầu hết các vị trí khác của :'kết quả trong một số đầu ra.


5

J, 33 ký tự

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

' cần phải được nhân đôi để tránh lỗi cú pháp.

Câu trả lời đầu tiên của tôi là thiếu một số biểu tượng.


5

C, 48 ký tự

Loại gian lận.

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

2
Chắc chắn đẩy các giới hạn của "gian lận" khi hầu hết chúng xuất hiện trong một macro chưa được khám phá. Thế còn #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Không có gì trong một chuỗi, nó chỉ được chuyển đổi thành một ... Tất nhiên nó sẽ dài hơn.
dmckee

@dmckee, tôi không nghĩ đề xuất của bạn trung thực hơn của tôi. Trong cả hai trường hợp, các ký tự có vấn đề không kết thúc bằng mã. Tôi có thể chuyển hầu hết chúng sang mã (như tôi đã làm với "";), nhưng $@backtick dường như vô vọng.
ugoren

Không nghi ngờ gì về điều đó, tôi cũng hôi, lén lút và lén lút. Nhưng nó cũng rất vui.
dmckee

@dmckee, vui là những gì nó nói về. BTW, bạn cần #define Q(_) #_. Bộ tiền xử lý sẽ coi "##_##"như một chuỗi ký tự.
ugoren

5

Bản thảo - 32 ký tự

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

Kết quả trong một đối tượng trên ngăn xếp, nhưng mặt khác không có hiệu ứng. Postcript cho phép hầu hết mọi char trong một định danh ngoại trừ <>()[]{}/các dạng cú pháp đặc biệt và %giới thiệu một nhận xét. Chương trình được mã hóa thành

{                  % 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 ký tự)

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

Theo như tôi biết, ký tự $ không phải là ký tự hợp lệ ngoài chuỗi ký tự, vì vậy tôi đã không sử dụng nó trong câu trả lời của mình.

BIÊN TẬP : Nhờ Peter Taylor , tôi đã rút ngắn mã.


1
#if A... #endifngắn hơn #region... #endregion. Và "x"[0]+ngắn hơn [System.STAThread].
Peter Taylor

3

PowerShell (52 ký tự)

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

Tôi phải đặt ký tự ^ là một chuỗi ký tự bởi vì theo như tôi biết, ký tự ^ không phải là ký tự PowerShell hợp pháp bên ngoài chuỗi ký tự. Đúng nếu tôi đã sai lầm.

Cách duy nhất tôi thấy phù hợp với ký tự : là sử dụng toán tử :: để thực hiện cuộc gọi đến một phương thức tĩnh.


3

Lược đồ, 41 ký tự

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

Điều này tận dụng khả năng chịu đựng đáng kinh ngạc của Scheme cho các ký tự trong tên biến. Trong chương trình này, tôi tạo một biến có tên! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~ Mà Scheme vui vẻ chấp nhận.


3

Tcl 37 ký tự

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

Xác định một biến !#$%&'()*+,-./:<=>?@[]^\_`|~với một chuỗi rỗng


3

C: 83 56 ký tự

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

Dấu hiệu và backticks không phải là một phần của cú pháp C được phép, vì vậy tôi đã đặt chúng giữa các dấu ngoặc kép.


1
Tại sao dấu ngoặc trong (b)? Đó là cú pháp lạ và một ký tự.
ugoren

1
Nếu bạn sử dụng struct cho dấu chấm, 0.0thì ngắn hơn nhiều.
ugoren

Làm thế nào tôi có thể không nghĩ về điều đó (0,0)? Dấu ngoặc đơn là phần còn lại từ khi họ thực sự lưu một ký tự, nhưng bây giờ chúng thực sự không cần thiết. Cảm ơn @ugoren!
Dành cho

Tôi nghĩ main(_,$)sẽ cứu một nhân vật.
ugoren

Và với gcc, bạn có thể viết x?:y, nhưng nó không phải là tiêu chuẩn C.
ugoren

2

Lisp thông thường, 33 ký tự

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

Phần chính của các đánh giá trên (hay đúng hơn, sẽ đánh giá nếu không phải #+()ở phía trước của nó) với biểu tượng có tên:

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

Các #+()là để tránh đầu ra. Tôi không chắc liệu |foo|cú pháp cho các ký hiệu có được tính là một chữ hay không, nhưng các ký hiệu được sử dụng làm tên biến / hàm trong Common Lisp, và có một vài câu trả lời đã sử dụng các ký tự cần thiết trong đó.


2

Smalltalk (Phương ngữ Squeak 4.x) 38 ký tự

Thực hiện phương thức này trong Object, cú pháp hợp lệ nếu Tùy chọn Cho phép gán dấu gạch dưới (là cài đặt mặc định)

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

khai báo Z là var toàn cầu trong menu bật lên nếu tương tác

Giải thích:

  • % & * + / <=>? @! ~ Là bộ chọn nhị phân (toán tử)
  • y là tham số (toán hạng)
  • "" là một bình luận trống rỗng
  • ^ có nghĩa là trở về
  • Z là biến toàn cục
  • _ là một bài tập
  • () phân định biểu thức con
  • [: z |] phân định một khối mã với một tham số z
  • {} phân định một mảng
  • # '' là một ký hiệu theo nghĩa đen được tạo bởi một Chuỗi trống (phần tử đầu tiên của Mảng)
  • , là một thông điệp nhị phân được gửi đến Biểu tượng trên
  • $ `là một ký tự bằng chữ được sử dụng làm đối số của thông báo trên
  • ; là để kết nối một tin nhắn thứ hai được gửi đến cùng một người nhận Biểu tượng # ''
  • thông điệp thứ hai là -
  • y được sử dụng làm đối số tin nhắn thứ hai
  • . là để phân tách hướng dẫn tiếp theo (đây là giai đoạn cuối)

Chết tiệt, ai nói Smalltalk có thể đọc được?

Lưu ý rằng tôi đã không gian lận, ký tự không hợp lệ duy nhất `được đặt vào một ký tự chữ. EDIT xem bên dưới, đây là một khẳng định sai (ít nhất là trong Squeak)


Nhưng chúng ta có thể giảm xuống còn 34 ký tự với thủ thuật này

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

Thời gian này:

  • # () phân định một mảng theo nghĩa đen
  • trong đó có 4 ký hiệu theo nghĩa đen: _; `và 1 ký tự chữ $ '

Nói một cách chính xác, chúng ta có thể coi điều này là gian lận ... Đó không phải là một chuỗi chữ, nhưng nó vẫn là một chữ không trống rỗng ...

Tôi vẫn phải tăng gấp đôi nhận xét trích dẫn "" (trừ khi tôi tạo một ký tự bằng chữ $ ", nhưng sau đó tôi cần phải gấp đôi trích dẫn Chuỗi '')
Tôi vẫn phải sử dụng một chữ cái cho tham số (_ không được chấp nhận ngay cả khi chúng tôi đặt Tùy chọn cho phép gạch dưới trong bộ chọn thành đúng).

Điều tuyệt vời là chúng ta thậm chí có thể chạy phương thức, ví dụ gửi tin nhắn đến 1 với đối số 2:

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

EDIT Cuối cùng trong 35 ký tự mà không gian lận

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

Ghi chú:

  • Tùy chọn cho phép gạch dưới trong bộ chọn cho phép sử dụng tham số khối có tên x_
  • `là một ký tự hợp lệ cho bộ chọn nhị phân trái với những gì tôi đã nói
  • Tôi cũng sử dụng $ 'để tránh nhân đôi trích dẫn

1

R: 108 ký tự

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

Rõ ràng là lần gửi dài nhất, nhưng để có thể sử dụng các ký hiệu @$trong R, chúng ta cần tạo một đối tượng có các vị trí (được lập chỉ mục bằng cách sử dụng @) và các phần tử được đặt tên (được lập chỉ mục bằng cách sử dụng $).
Giải pháp ngắn nhất mà tôi có thể nghĩ ra là tạo ra một lớp đối tượng mới ( a=new(setClass("a",representation(b="list")))), điều này sẽ gây ra hậu quả. Mặt khác, xuất hiện từ các tác phẩm kinh điển không cần giải thích (như !=, #hoặc 1:2),

`~`<-`?` 

tạo một toán tử mới thực hiện giống như toán tử ?(nghĩa là nó gọi trang trợ giúp của phần tử mà nó đứng trước).

%*%tính sản phẩm bên trong của hai ma trận (ở đây 1^1.1).
Biểu tượng _không có gì (AFAIK) trong R nhưng thường được sử dụng trong các tên biến hoặc hàm, như trường hợp ở đây.


1

TI-Basic, 36

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

Điều này không hợp lệ vì trích dẫn bắt đầu thường được sử dụng để bình luận.
Tyzoid

@Tyzoid Tôi chuyển nó đến cuối cùng.
Timtech

Endkết thúc một câu lệnh lặp, không phải chương trình. Tôi nghĩ bạn có ý đó Return.
lirtosiast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.