인쇄 가능한 모든 영숫자가 아닌 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.