인쇄 가능한 ASCII와 관련된 완벽한 퍼펙트 팬 그램 프로그램


23

업데이트 : 시간 제한이 제거되었습니다. 출력을 설명 할 수 있어야합니다 (새 규칙 참조).

팬 그램은 같은 적어도 한 번 알파벳의 모든 문자를 사용 문장입니다 :

빠른 갈색 여우는 게으른 개 위로 뛰어 넘습니다.

완벽한 팬 그램은 정확히 한 번씩 편지를 사용합니다.

95 개의 인쇄 가능한 ASCII 문자 (16 진 코드 20-7E)를 알파벳으로 사용하여 완벽한 팬 그램 인 프로그램을 작성하십시오 .

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

이러한 프로그램에는 인쇄 가능한 각 ASCII 문자가 정확히 한 번, 순서에 관계없이 정확히 95 자 여야합니다. (따라서 95! = 1.03 × 10 148 가능성이 있습니다.)

당신의 임무는 stdout에 인쇄 가능한 인쇄 가능한 ASCII 문자의 수가 가능한 한 많도록 (즉, 많은)이 프로그램을 작성하는 것입니다.

당신의 점수는 인쇄 가능한 ASCII 문자 프로그램 출력의 수입니다 합니다 ( 금액이 아닌 별개 : 양 AABC반면 점수 네 ABC점수 3) . 가장 높은 점수가 이깁니다.

세부

  • 출력에는 모든 문자 (중복 포함)가 포함될 수 있지만 95 개의 인쇄 가능한 ASCII 문자 인스턴스 만 점수에 포함됩니다.
    • 이 JSFiddle 을 사용 하여 문자열에서 인쇄 가능한 ASCII 문자 수를 계산할 수 있습니다 .
  • 귀하의 언어에 stdout이 없으면 가장 적합한 대안을 사용하십시오.
  • 프로그램 ...
    • 런타임이 유한해야합니다 (시간 제한이 제거되었습니다)
    • 유한 한 출력이 있어야합니다
    • 주석이 포함되어있을 수 있습니다
    • (잡히지 않은) 오류없이 컴파일하고 실행해야합니다.
    • 입력을 요구하거나 요구하지 않아야 함
    • 시간이 변하지 않고 결정 론적이어야 함
    • 외부 라이브러리를 사용해서는 안됩니다
    • 네트워크 연결이 필요하지 않아야합니다
    • 외부 파일을 사용해서는 안됩니다
      • (파일 이름을 변경해도 프로그램의 동작이 변경되지 않는 한 프로그램 파일 자체를 사용할 수 있습니다)
  • 이 작업이 불가능하다면 너무 나쁜 언어도 있습니다.
  • 게시물에 맞추기에는 너무 큰 경우 정확한 결과를 제공 하거나 정확하게 설명해야합니다 . 실제로 프로그램을 실행할 필요는 없습니다. 만큼이 같은 메모리의 억제 할 수없는 양의 컴퓨터에서 일정한 시간에 실행이 유효합니다.

이 간단한 Python 2 프로그램은 가능한 솔루션입니다.

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

987654321010 개의 인쇄 가능한 ASCII 문자가 포함 된 10 점을 출력 합니다.


14
allioneration이 나타나는 것처럼 놀랍도록 훌륭한 팬 그램은 강력한 펀치를 포장합니다.
Geobits

2
나는 방금 명확하지 않은 규칙을 다시 읽었습니다. 나는 그것을 대체로 완전히 a상한선을 보였고 , 대안은 문자를 6 조회 인쇄하는 것과 같은 터무니없는 구조로 이어질 수 있기 때문에 분명히 총계가 아닌 규칙 이었다는 결론을 내렸다 . 문자 수. 어쨌든, 나는 비록 그것이 작은 경우에도 여전히 내 95를 자랑스럽게 생각합니다. 크기가 전부는 아닙니다.
COTO

HQ9 +에서는 왜이 작업이 불가능하다고 생각합니까?
피터 테일러

나는 FORTRAN에서 이것을 시도 할 것입니다 (그래서 대소 문자를 구분할 수 없습니다). --- 그리고 그것을 긁으십시오. 프로그램 선언의 경우 2 번, 루프 선언의 경우 2 번 문자 O가 4 번 필요합니다.
Nzall

1
@Dennis No. 5more
캘빈의 취미

답변:


12

GolfScript, 2 ↑↑↑ (9871 ↑↑ 2) 자 이상

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

정수를 인쇄합니다. 무제한 CPU 레지스터 크기 (루비에서 최대 문자열 길이를 결정), 메모리 및 런타임을 활용하십시오. 줄 바꿈은 단지 가독성을위한 것입니다.

코드

2             # Push 2.
9871.?        # Push b := 9871↑↑2 = 9871↑9871 = 9871**9871.
,{            # For each i from 0 to b - 1:
  ;0$         #   Discard i and duplicate the integer on the stack.
  [45)63]n+*  #   Replicate ".?\n" that many times.
  ~           #   Evaluate.
 }/           #

점수

b = 9871 ↑↑ 2를 정의합니다 ( Knuth의 위쪽 화살표 표기법 참조 ).

  • .? 이 실행 F : ↦ X X X ↑ .

  • 내부 블록은 g : x ↦ f x (x)를 실행 합니다.

    이후 F (X) = X X X = ↑ ↑↑ 2 , F (2) (X) = (X ↑ x)에 ↑ (↑ X X)> ↑ X X X X = ↑ ↑↑ (3) ,
    F (3) (X) = ((x ↑ x) ↑ (x ↑ x)) ↑ ((x ↑ x) ↑ (x ↑ x))> (x ↑ x ↑ x) ↑ (x ↑ x ↑ x)> x ↑ x ↑ x ↑ x = x ↑↑ 4 등등,
    g (x)> x ↑↑ (x + 1)> x ↑↑ x가 있습니다.

  • 외부 블록은 h : x ↦ g b (x)를 실행 합니다.

    이후 g (X) = X ↑↑ ↑↑↑ X = X (2) , g (2) (X) = (X X ↑↑) ↑↑ (X ↑↑ X)> ↑↑ X X X X = ↑↑ ↑↑↑ 3 ,
    g 3 (x) = ((x ↑↑ x) ↑↑ (x ↑↑ x)) ↑↑ ((x ↑↑ x) ↑↑ (x ↑↑ x))> (x ↑↑ x ↑↑ x) ↑ (x ↑↑ x ↑↑ x)> x ↑↑ x ↑↑ x ↑↑ x = x ↑↑↑ 4h (x)> x ↑↑↑ (b + 1)이 있습니다.

  • 스택 에서 정수 2로 시작 하므로 코드는 h (2)> 2 ↑↑↑ (b + 1)을 계산합니다.

  • 점수는 h (2) 의 소수점 이하 자릿수 이며 log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 ↑↑↑ b 입니다.

따라서 점수가 2 ↑↑↑ (9871 ↑↑ 2) 보다 큽니다 .

2 ↑↑↑ nn 이 커질수록 말도 안되는 속도로 자랍니다 . ↑↑↑ 2 4 : 2 = 2 ↑↑ ↑↑ ↑↑ 2 2 2 = 2 ↑↑ ↑↑ ↑↑ 4 = 2 65536 의 우측 연관 전력 타워, 65536 개 사본 2 :

                                                                2 ↑↑↑ 4                                                                 

마찬가지로, 2 ↑↑↑ 5 = 2 ↑↑ (2 ↑↑↑ 4) 의 전원 타워 인 2 개 ↑↑↑ 4 사본 2 .

이제, 점수가 아닌 2 ↑↑↑ 4 또는 2 ↑↑↑ 5 , 그것보다 큰의 2 ↑↑↑ B , B> 2 × 10 39 428 . 그것은 큰 숫자입니다 ...


@DigitalTrauma-당신은 내 것을 확인해야합니다;)
Optimizer

@Dennis-대략 얼마입니까?
Optimizer

@Optimizer 당신은 저를 얻었습니다 ;-)
Digital Trauma

대박! 그레이엄의 번호를 생각 나게합니다.
재 작성

3
이것은 이론적 으로 매우 많은 수의 0을 인쇄해야 하지만 실제로는 인터프리터와 충돌합니다 in `*': bignum too big to convert into `long' (RangeError).
Ilmari Karonen

22

펄, 70 * 18446744073709551615 * 10 ^ 987654320

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

산출:

!"#%&'+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`bcdfghijklmnoprtuvwz|

18446744073709551615 * 10 ^ 987654320 번 반복 되었습니다.

$[기본적 0으로이므로 ~$[와 같습니다 18446744073709551615.

참고로, number을 만들려는 메모리가 부족합니다 10^987654320.


기존 답변 (7703703696) :

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

출력은 다음과 같습니다

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

98765432 번 반복되었습니다.

참고 : 모든 샘플을 perl -Mbignum -E


좋은! 그러나 재귀를 사용할 수 있는지 궁금합니다 ... (이름에 문자를 반복하기 때문에 자신의 이름을 사용해야하는 경우 자신을 호출 할 수는 없지만 함수 이름은 $ _로 끝날 수 없습니다 또는 다른 Perl의 변수?) .. 또는 $ 0 호출을 똑똑하게 사용하십시오 (힙을 채우지 않고)
Olivier Dulac

충분한 메모리가 있다면 할 수 있습니다perl -E'say qw{m}x(9876543210*ord$")'
hmatt1

2
도움이되면 더 이상 시간이나 메모리 제한이 없습니다.
Calvin 's Hobbies

2
불행히도 Perl은 지수 대신 ^ 대신 **를 사용합니다.
Mark

11

Bash + coreutils, 151,888,888,888,888,905 (1.5 * 10 ^ 17)

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

한 줄에 하나씩 정수 1-9x10 15 를 출력 합니다. 오랜 시간이 걸립니다.

9E15? GNU seq는 내부적으로 64 비트 float (double)을 사용하는 것으로 나타 났습니다 . 정밀도 부족으로 인해 1 스톱 씩 증가하기 전에이 유형으로 나타낼 수있는 최대 정수는 2 53 또는 9007199254740992입니다. 지수 표기법으로 가장 가까운 정수는 9E15 또는 9000000000000000입니다.

점수를 계산하기 위해 각 숫자 사이에 줄 바꿈이 있기 때문에 주어진 자릿수로 모든 숫자를 더하고 9E15를 추가하는 것을 사용하고 있습니다.

8000000000000001*16 + 900000000000000*15 + 90000000000000*14 + 9000000000000*13 + 900000000000*12 + 90000000000*11 + 9000000000*10 + 900000000*9 + 90000000*8 + 9000000*7 + 900000*6 + 90000*5 + 9000*4 + 900*3 + 90*2 + 9 + 9000000000000000

나는이 출력을 od약간의 순서로 파이프 할 수 있지만, 그로 인해 점수 계산이 훨씬 어려워집니다.


사전 규칙 변경 답변 :

배쉬 + 코어 유틸리티, 18,926,221,380

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

출력 1에서 1592346780. 2012 년 중반 맥북 (링크 된 벤치 마크와 크게 다르지 않음)에는 약 9m45가 걸립니다.

의미가 없지만 아마 조금 더 최적화하는 것에 저항 할 수 없었습니다.

산출:

$ time ./pangram.sh | wc
 1592346780 1592346780 18926221380

real    9m46.564s
user    11m7.419s
sys 0m10.974s
$ 

왜 안해 seq 9876543210;?
durron597

@ durron597 시간이 너무 오래 걸리기 때문에 약 1 시간 정도 걸립니다. 10 분 안에 완료해야합니다.
Digital Trauma

그러나이 프로그램의 유일한 제한 요소는 i / o입니다. 다른 언어로 된 다른 프로그램은 실제로 이것을 이길 수 없습니다.
durron597

@ durron597 네, 그렇습니다. 이 커뮤니티의 누군가가 영리한 길을 찾더라도 놀라지 않을 것입니다 ...
Digital Trauma

1
@DigitalTrauma 실제로 시간 제한을 제거하여 이것이 두 번째 답변이되지 않도록합니다 9876543210. 새로운 마지막 규칙을 읽으십시오.
Calvin 's Hobbies

6

GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) 즉 ≈ 3x10 20000000

 87 9654321?,`0${;.p}/#!"%&'()*+-9:<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnoqrstuvwxyz|~

작동 원리

87 9654321?                "Pushes 87^9654321 to stack";
           ,               "Pushes an array [0, 1, 2 ... (87^9654321) - 1] to stack";
            `              "Creates a string representation of the array like "[0 1 2...]";
             0$            "Copies the string";
               {;.p}/      "Print the string wrapped in quotes X times";
                     #...  "This is all comment";

여기서 X배열의 문자열 표시의 문자 수 (길이)는 [0, 1, 2..,(87^9654321) - 1]같은 것[0 1 2 3 4 ... (87^9654321) - 1]

X내 점수를 찾기 위해 여기 에서 계산하려고합니다 . (87^9654321) - 1약이다 10^(10^7.272415829713899)18724742진수.

X약입니다 3*10^(2*10^7)그래서 X*X또한 단지 동일합니다. 참고 이러한 값의 계산에 의한 제한으로 아주 낮은쪽에 있는지 (짝수) wolframa , I는 계산할 수 없었다 sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)참값 인X


이론적으로는 이것을 허거까지 만드는 몇 가지 방법이 있지만 슬프게도 Ruby의 BigNum에는 한계 87 9654321?가 있으며 단지 Infinity있습니다.
Dennis

오! ? 당신은 최대를 알고 있습니까? ;)
Optimizer

정확히. 정수는 RAM에 맞아야하므로 머신에 의존하는 것 같습니다. 무한한 기억으로 한계가 어디 있는지 모릅니다. 아마도 2**(2**64)-164 비트 루비 일 것입니다.
Dennis

우리는 RAM의 무제한의 양이
최적화

그렇습니다. CJam의 경우 고정 한계가 있으며 메모리를 모두 사용하면 인터프리터가 충돌합니다. 루비는 다른 것 같습니다.
Dennis

4

MATLAB, 95

암호

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

산출

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

출력에는 지정된 ASCII 문자가 모두 정확히 한 번, 순서대로 포함됩니다.


1
시청자 참고 사항 :이 답변은 사양에서 고유 문자 를 최대화하도록 요청했을 때 제출되었습니다 . 이것은 더 이상 목표는 아니지만,이 답변이 유효하기 때문에 그대로 유지된다면 괜찮습니다.
Calvin 's Hobbies

2

루비, 89

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

산출:

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

모든 ASCII 문자 제외 포함, p, , %, q, {,와 }.


1
시청자 참고 사항 :이 답변은 사양에서 고유 문자 를 최대화하도록 요청했을 때 제출되었습니다 . 이것은 더 이상 목표는 아니지만,이 답변이 유효하기 때문에 그대로 유지된다면 괜찮습니다.
Calvin 's Hobbies

2

골프 스크립트, 93

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

산출:

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

모든 ASCII 문자 제외 포함 "하고 '.


6
당신은 프로그램이 완벽한 팬 그램이 아닙니다, 그렇지 않습니까? 포함하지 않는 것 "또는 '중 하나.
Martin Ender

시청자 참고 사항 :이 답변은 사양에서 고유 문자 를 최대화하도록 요청했을 때 제출되었습니다 . 이것은 더 이상 목표는 아니지만이 답변이 유효하게 유지된다면 괜찮습니다.
Calvin 's Hobbies

1
새로운 규칙에 따라 이것을 유효하게 만드는 것은 쉽습니다. #현재 위치에서 제거 #"'하고 끝에 추가 하십시오. 그러나 점수는 1 씩 떨어집니다.
Ilmari Karonen

2

골프 스크립트-27 * 2 6543 9870

이것은 나의 첫번째 Golfscript 제출입니다! :)

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

설명:

12,                     - Creates an array of ascending numbers from 0 to 11
   `                    - Converts the array to a string
    {.+}                - Duplicates the string on the stack and concatenates the two
        6543 9870?      - Calculates 6543^9870 and pushes it to the stack
                  *     - Repeat the block 6543^9870 times
                   #... - The rest is a comment

출력은 숫자 목록의로드입니다. 다음 코드를 고려하십시오.

12,`{.+}1*

12,그 다음 배열을 생성합니다

[0 1 2 3 4 5 6 7 8 9 10 11]

백틱은 문자열을 문자열로 변환하여 블록으로 전달합니다 {.+}. 이것은 문자열을 복제 한 다음 두 문자열을 연결하여 다음을 생성합니다.

[0 1 2 3 4 5 6 7 8 9 10 11][0 1 2 3 4 5 6 7 8 9 10 11]

이 명령 1*은 인터프리터에게 이전 블록을 한 번만 실행하도록 지시합니다 (2 1 = 2).

따라서이를 바탕으로 :

 12,`{.+}n*

출력의 출력을 12,`2 N 번.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.