인쇄 가능한 모든 영숫자가 아닌 ASCII 기호를 사용하는 프로그램 작성


17

특히 소스 코드에서 이러한 기호를 각각 한 번 이상 사용하십시오.

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

주석, 문자열 리터럴, 정규 표현식 (또는 다른 종류의 리터럴 등) 내부의 기호는 계산되지 않습니다 (그러나 그와 같은 구분 기호 /**/또는 ""계산).

프로그램은 어떤 작업도 수행해서는 안됩니다. 컴파일 할 때 실행하고 아무것도하지 않아도됩니다.

어떤 이유로 일부 기호를 선택한 언어로 사용할 수없는 경우 그 기호를 엄격하게 설명하십시오 (무엇을 왜 제외해야하는지).

업데이트 : 몇 가지 답변은 정규 표현식과 함께 기호를 사용했습니다. 나는 이것을 약간 문제가 있다고 생각합니다. 문자열 리터럴이나 주석에 넣는 것과 같습니다 (따라서 그 요구 사항 에 을 넣습니다 ). 이것없이 시도하십시오. 또한 위의 요구 사항을 업데이트했습니다.

업데이트 : 가장 짧은 코드가 승리합니다 ( code-golf 로 태그 지정 ). 제안한 바와 같이 타이 브레이커 기준이 필요할 가능성이 높습니다. 넥타이가있는 경우 당첨되는 것은 ASCII 기호가 가능한 많은 순서로 나타나는 것입니다. 공식적으로 : 프로그램에서 나열된 각 기호의 첫 번째 항목을 필터링합니다. 나열된 기호에 순열이 발생합니다. 순열의 반전 수가 적은 프로그램이 승리합니다.

업데이트 : C (++), Java, Scala, Haskell 등과 같은 일반 / 주류 언어로 된 일부 / 더 많은 솔루션을 보게되어 기쁩니다.


1
키워드, 구문 또는 연산자에 특정 언어로 표시되지 않는 문자에 대한 리터럴 예외가 있습니까? 즉도 @%없고 백틱는 C에 나타날 수있는 것을 제외하고 (c 충분히 새로운 버전의 문자의 일부로서 %이중 음자에 나타날 수있다). ( #전 처리기 지시문에만 표시되지만 우리는 그와 함께 살아야합니다)? 즉, Matt의 접근 방식이 명시 적으로 합법적이어야합니다.
dmckee

2
최단 코드 승리? 동점 기준도 필요하다고 생각합니다
ardnew

1
자바 스크립트, 문자에서 #, @그리고`문자 그대로 모든 종류의하지 법정 외입니다
피터 올슨

6
이것은 기본적으로 "이러한 모든 문자를 구문으로 사용할 수있는 언어 찾기"와의 경쟁입니다. 내 의견으로는 꽤 엉터리 코드 골드
Earlz

1
그러나 @Earlz에 동의합니다. 임대 량의 코드에서 사람들이 모든 문자를 가져 오기 위해 보풀을 할 수는 없지만 ardnew의 해결책은 아닙니다. . 그 이유는 당신이 그보다 짧아 질 수 없으며, 일부 사람들이 지적한 것처럼 일부 문자가 리터럴 외부에서 유효하지 않은 언어는 즉시 실격됩니다. 이는 수용 가능한 답변 이 적을 뿐 아니라 정답 기간도 있음을 의미합니다.
Ryan

답변:


18

Brainf * ck, 32 자

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

웃는 얼굴을 인쇄합니다 (콘솔이 ASCII 기호 1을 출력 할 수있는 경우).

골프 스크립트를 능가하는 Branf * ck 솔루션 인 Yay! :피

출력이 없다고 주장하면 +and를 교환하십시오 ..

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

6
흠 ... 댓글에 문자 숨겨져 있다고 말하고 싶지만 아.
반 시계 회전을 중지

5
@leftaroundabout : 유효한 지침을 주석 처리하는 데 사용할 수 없으므로 기술적으로 주석 이 아닙니다 . 공백으로 처리됩니다. 그건 그렇고, 나는 이것이 규칙의 부끄러운 스트레칭이라는 것에 동의합니다.
vsz

3
@vsz 규칙을 구부리는 데 아무런 문제가 없습니다.
Gareth

1
이 솔루션의 반전 번호는 24이므로 규칙에 따라 승자입니다. 문자를 무시하는 것은 주석에 매우 가깝기 때문에 그것에 대해 약간의 의문이 있지만, 그것이 나쁘다고 말하고 싶습니다. 질문을 쓸 때이 가능성을 생각하지 않았습니다.
Petr Pudlák

1
@BodoThiesen 실제로 그것은 오래되었지만, 규칙을 약간 확장 하더라도이 솔루션이 더 좋을지라도이기는 솔루션으로도 자격이 있다고 생각합니다.
Petr Pudlák

47

펄, 32 자

주석, 문자열 리터럴 또는 정규식에 숨은 기호가 없습니다. 모든 기호를 정확하게 한 번 사용합니다.

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

기술

들여 쓰기로 연산자 우선 순위를 나타내려고했습니다. 가장 오른쪽 표현식이 왼쪽에있는 표현식보다 먼저 평가됩니다.

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

내가 틀렸다면 나를 수정하십시오. 그러나 당신은 그냥 스칼라를 만들었 `<@"^[(\{_},)]/+-~%'?&|:!*.=>습니까?
Mr. Llama

2
@GigaWatt 아니오, 이것은 여러 가지 다른 표현의 순서입니다. 평가 방법에 대한 설명을 추가하겠습니다
ardnew

@GigaWatt : 아니요; Perl에서 기호 ID는 모두 단일 문자입니다. 그런 종류의, 내가 생각 에만 사용이 프로그램 $`, @", %', 그리고 *.그것은 굉장히 어렵다 불구하고 (스칼라, 배열, 해시, 그리고 타입 글로브, 각각), 확인 할 수 있습니다. . .
ruakh

23
당신은 천재이거나 임의의 바이트 시퀀스가 ​​유효한 Perl 프로그램입니다. 아니면 둘다.
우고 렌

4
내 자신의 규칙에 따라 Brainfuck 솔루션을 수여해야했지만이 솔루션은 내가 좋아하는 것입니다 (동일한 크기이지만 반전 번호 279).
Petr Pudlák

9

공백, 32

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

공백이 아닌 문자는 모두 무시되므로 실제로는 빈 프로그램입니다.


3
공백이 아닌 모든 문자는 주석이므로 유효하지 않습니다. :
NRGdallas

8

파이썬 65

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

나는 문자 ?$문자열 리터럴 내부를 사용했습니다 . 이러한 문자는 문자열 리터럴 또는 주석 외부에서 유효하지 않습니다 .


잘못된 구문이 포함되어 있습니다. 특히 {[`'"$?'`,]}연관된 값이없는 키로 사전을 작성하므로 유효하지 않습니다. 다음과 같이 두 문자를 더 사용하여 유효하게 만들 수 있습니다.{[`'"$?'`,]:0}
Strigoides

1
@Strigoides nope, 그것은 dict가 아닌 세트를 만듭니다. 그러나 그 경우 (값이없는 dict 키)에도 불구하고 유효한 구문이 아닌 요구 사항이었습니다. (파이썬이 작동하려면 2.7 이상이 필요합니다.)
Matt

나는 그것을 테스트 할 때 파이썬 2.6을 사용하고있는 것을 보았다.
Strigoides

8

PHP, 32 자

아마도 약간의 트롤 인이 PHP 프로그램은 QUINE 이며 나열된 순서대로 모든 기호를 사용합니다.

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

명령 행에서 실행하면 출력이 파일의 내용이 아니기 때문에 단순히 파일의 내용이됩니다. <?php 실행하면 인터프리터를 호출 할 됩니다.

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

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

4
IMHO 이것은 전체 프로그램이 단일 리터럴이므로 주석, 문자열 리터럴, 정규 표현식 (또는 다른 종류의 리터럴 등) 내부의 기호를 위반 합니다.
Petr Pudlák

또한 작업에 필요한 프로그램은 아무 것도 출력하지 않아야하며 아무 것도 출력하지 않는 단 하나의 quine이 있습니다.
Paŭlo Ebermann 2016

PHP에 의해서도 파싱되지 않기 때문에 이것은 거의 유효하지 않습니다
Rob

@RobQuist 물론이 구문 분석됩니다, 그것은 바쁜 사냥의 그 쓴 끝에 TIL 어려운 T_OPEN_TAG 토큰 권리
레이

7

펄 6 (43 문자)

다소 특이한 이름으로 중위 연산자를 정의 해 봅시다 :

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

RE의 리터럴이나 리터럴이 아니며 주석에 숨겨진 것이 아닙니다. 당신은 나를 믿지 않습니까? 다음 프로그램을 실행하면 "2"가 출력됩니다.

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

그러나 나는 nitpickers가 언어 자체의 재정의를 배제하여 펄 러버를 불행하게 만들 규칙을 더 확장 할 것이라고 확신합니다. :(


식별자에 기호를 사용하는 것이 합리적이라고 생각합니다.
Petr Pudlák 5

7

하스켈, 53

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

우리는 이것을 조금 더 짧게 만들 수 있습니다

45

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

그러나이 프로그램은 종료하고, 사용 자 이상 (하지 않는 '!', '<', '|') 새로 정의 중위한다.


5

k (33 자)

k에서 매우 쉽습니다. 불행히도 "짝을 이루어야합니다.

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

5

GolfScript (33 자)

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

"페어링해야합니다. 아무것도 출력하지 않으려면 약간의 시행 착오가 필요했습니다 :'. 결과 의 대부분의 다른 위치는 출력입니다.


5

J, 33 자

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

' 구문 오류를 피하려면 두 배가되어야합니다.

첫 번째 답변에는 몇 가지 기호가 없습니다.


5

C, 48 자

부정 행위의 종류.

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

2
"치팅"의 범위를 대부분 미지의 매크로에 표시 할 때 확실하게 푸시합니다. 어때요 #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \);`. 아무것도 에서 문자열, 그것은 단지 하나의 변환 않겠다 ... 그것은 물론, 더 이상 할 것이다.
dmckee

@ dmckee, 나는 당신의 제안이 나의 것보다 더 정직하다고 생각하지 않습니다. 두 경우 모두 문제가있는 문자는 코드에서 끝나지 않습니다. 나는 그것들을 (내가했던 것처럼 "";) 코드로 옮길 수 있었지만 $@, 백틱은 희망이없는 것처럼 보인다.
우고 렌

의심의 여지없이, 내 또한 파울이고, 수중에 있으며 교활합니다. 하지만 재미 있기도합니다.
dmckee

@ dmckee, 재미는 그것이 무엇인지에 관한 것입니다. BTW, 당신은 필요합니다 #define Q(_) #_. 전처리 기는 "##_##"문자열 리터럴로 취급 됩니다.
우고 렌

5

포스트 스크립트-32 자

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

스택에 객체가 생겨도 효과가 없습니다. 포스트 스크립트 <>()[]{}/는 특수한 구문 형식이고 %주석을 소개하는 것을 제외하고는 식별자에 거의 모든 문자를 허용 합니다 . 이 프로그램은 다음과 같이 토큰 화됩니다

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

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

내가 아는 한 $ 문자는 문자열 리터럴 외부의 유효한 문자가 아니기 때문에 대답에 사용하지 않았습니다.

편집 : Peter Taylor 덕분에 코드가 단축되었습니다.


1
#if A... #endif보다 짧은 #region... #endregion. 그리고 "x"[0]+보다 짧습니다 [System.STAThread].
피터 테일러

3

PowerShell (52 자)

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

내가 아는 한, ^ 문자를 문자열 리터럴로 넣어야했다 . ^ 문자는 법적 PowerShell을 문자 외부의 문자열 리터럴이 아닙니다. 내가 틀렸다면 나를 바로 잡으십시오.

: 문자 에 맞는 유일한 방법 은 :: 연산자 를 사용하여 정적 메서드를 호출하는 것입니다.


3

구성표, 41 자

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

이것은 변수 이름의 문자에 대한 Scheme의 놀라운 공차를 활용합니다. 이 프로그램에서 이름이! $ % & * +,-. / : <=>? @ [] ^ _`{|} ~ 인 변수를 만듭니다.


3

TCL 37 자

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

!#$%&'()*+,-./:<=>?@[]^\_`|~빈 문자열 로 변수 를 정의합니다


3

C : 83 56 자

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

At 부호와 백틱은 허용되는 C 구문의 일부가 아니므로 인용 부호 사이에 넣었습니다.


1
왜 괄호 안에 (b)? 이상한 구문과 문자 낭비입니다.
ugoren

1
점에 구조체를 사용하면 0.0훨씬 짧습니다.
ugoren

나는 그것을 어떻게 생각할 수 없었습니까 (0.0)? 괄호는 실제로 한 문자를 저장했을 때 남은 것이지만 실제로는 불필요합니다. 감사합니다 @ugoren!
Fors

나는 main(_,$)캐릭터를 구할 것이라고 생각 합니다.
ugoren

gcc를 사용하면 글을 쓸 수 x?:y있지만 표준 C는 아닙니다.
ugoren

2

일반적인 리스프, 33 자

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

위의 주요 부분은 다음과 같은 #+()이름의 심볼을 평가합니다 (또는 오히려 그렇지 않은 경우 평가 합니다).

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

#+()출력을 방지하는 것이다. |foo|기호 구문이 리터럴로 계산 되는지 확실하지 않지만 기호는 Common Lisp에서 변수 / 함수 이름으로 사용되며 필요한 문자를 이미 사용하고있는 몇 가지 답변이 있습니다.


2

스몰 토크 (Squeak 4.x dialect) 38

기본 설정 인 밑줄 할당 이 기본 설정 인 경우 Object에서이 메소드를 구현하면 구문이 유효합니다.

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

대화식 인 경우 팝업 메뉴에서 Z를 전역 var로 선언

설명 :

  • % & * + / <=>? @! ~는 이진 선택기 (연산자)입니다.
  • y는 매개 변수 (피연산자)입니다.
  • ""는 빈 댓글입니다
  • ^ 반환을 의미
  • Z는 전역 변수입니다
  • _는 과제입니다
  • ()는 하위 표현식을 구분합니다
  • [: z |]는 하나의 매개 변수 z로 코드 블록을 구분합니다.
  • {}는 배열을 구분합니다
  • # ''은 빈 문자열 (배열의 첫 번째 요소)로 만들어진 Symbol 리터럴입니다.
  • 은 기호 위에 전송 된 이진 메시지입니다.
  • $`는 위 메시지의 인수로 사용되는 문자 리터럴입니다.
  • ; 동일한 Symbol 수신자 #``에 전송 된 두 번째 메시지를 연결하기위한 것입니다.
  • 두 번째 메시지는-
  • y는 두 번째 메시지 인수로 사용됩니다.
  • . 다음 명령을 분리하기위한 것입니다 (여기서는 마지막 기간입니다)

젠장, 스몰 토크를 읽을 수 있다고 누가 말했습니까?

내가 속이지 않았다는 것에 유일하게 유효하지 않은 문자`는 리터럴 문자에 넣는다. 편집 아래 참조, 이것은 잘못된 주장입니다 (적어도 Squeak에서)


그러나이 트릭 으로 34 자로 줄일 수 있습니다

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

이 시간:

  • # ()은 리터럴 배열을 구분합니다
  • 여기에는 4 개의 리터럴 기호가 포함됩니다. _; `와 1 개의 문자 $

엄밀히 말하면, 우리는 이것을 속이는 것으로 간주 할 수 있습니다 ... 리터럴 문자열은 아니지만 여전히 비어 있지 않은 리터럴입니다 ...

여전히 인용 부호 ""를 두 번 주석 처리해야합니다 (리터럴 문자를 $ "로 만들지 않는 한 문자열 인용 부호를 두 배로 늘려야합니다 '').
여전히 매개 변수에 문자를 사용해야합니다 (_ 선택기에서 환경 설정 에서 밑줄 허용 을 true로 합니다).

좋은 점은 메소드를 실행할 수도 있다는 것입니다. 예를 들어 인수 2를 사용하여 메시지를 1로 보냅니다.

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

속임수없이 마지막으로 35 문자로 편집

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

노트:

  • 환경 설정 x_라는 블록 매개 변수를 사용하여 선택기에서 밑줄을 허용합니다.
  • `는 내가 말한 것과 반대로 바이너리 선택기에 유효한 문자입니다.
  • 또한 견적을 두 배로 늘리지 않기 위해 $ '를 사용합니다.

1

R : 108 자

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 을 사용할 수 있으 려면 슬롯 (을 사용하여 색인화 됨 @)과 명명 된 요소 (을 사용하여 색인화 됨) 가있는 객체를 만들어야합니다 $.
내가 생각할 수있는 가장 짧은 해결책은 새로운 클래스의 객체 ( a=new(setClass("a",representation(b="list")))) 를 만드는 것이 었습니다 . 그렇지 않으면, 아파트 고전에서 필요하지 않은 설명 (예 !=, #1:2),

`~`<-`?` 

연산자와 같은 기능을하는 새 연산자를 만듭니다 ?(즉, 앞에있는 요소의 도움말 페이지를 호출 함).

%*%두 행렬 (여기서 1^1및의 .1) 의 내부 곱을 계산합니다 . R에서는
Symbol _이 아무 것도하지 않지만 (AFAIK) 변수 이름이나 함수 이름에 일상적으로 사용됩니다.


1

TI 기본, 36

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

시작 인용 부호가 주석에 자주 사용되므로 유효하지 않습니다.
Tyzoid

@Tyzoid 나는 그것을 끝으로 옮겼습니다.
Timtech

End프로그램이 아닌 루프 문을 종료합니다. 나는 당신이 의미하는 것 같아요 Return.
lirtosiast 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.