Các chương trình Pangram hoàn hảo có thể phát triển thành ASCII có thể in


23

Cập nhật: Giới hạn thời gian loại bỏ. Bạn phải có thể mô tả đầu ra - xem quy tắc mới.

Một pangram là một câu sử dụng mỗi chữ cái trong bảng chữ cái ít nhất một lần, chẳng hạn như:

The quick brown fox jumps over the lazy dog.

Một pangram hoàn hảo sử dụng mỗi chữ cái chính xác một lần.

Hãy xem xét việc viết một chương trình là một pangram hoàn hảo, sử dụng 95 ký tự ASCII có thể in (mã hex 20 đến 7E) làm bảng chữ cái:

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

Một chương trình như vậy phải chứa chính xác 95 ký tự, với mỗi ký tự ASCII có thể in được xảy ra chính xác một lần, nhưng theo bất kỳ thứ tự nào. (Như vậy, có 95! = 1.03 × 10 148 khả năng.)

Nhiệm vụ của bạn là viết chương trình này sao cho số lượng ký tự ASCII có thể in được in ra thiết bị xuất chuẩn càng cao càng tốt (tức là sinh sôi nảy nở).

Điểm của bạn là số ký tự ASCII có thể in được mà chương trình của bạn xuất ra ( tổng số tiền, không phải số lượng riêng biệt : AABCđiểm 4 trong khi ABCđiểm 3) . Điểm cao nhất sẽ thắng.

Chi tiết

  • Đầu ra có thể chứa bất kỳ ký tự nào (bao gồm cả các bản sao) nhưng chỉ các phiên bản của 95 ký tự ASCII có thể in được tính vào điểm số của bạn.
    • Bạn có thể sử dụng JSFiddle này để đếm số lượng ký tự ASCII có thể in trong bất kỳ chuỗi nào.
  • Nếu ngôn ngữ của bạn không có thiết bị xuất chuẩn, hãy sử dụng giải pháp thay thế phù hợp nhất.
  • Chương trình của bạn ...
    • phải có thời gian chạy hữu hạn (giới hạn thời gian đã được gỡ bỏ)
    • phải có đầu ra hữu hạn
    • có thể chứa ý kiến
    • phải biên dịch và chạy mà không có (chưa) lỗi
    • không được nhắc hoặc yêu cầu đầu vào
    • phải bất biến thời gian và xác định
    • không được sử dụng các thư viện bên ngoài
    • không được yêu cầu kết nối mạng
    • không được sử dụng các tập tin bên ngoài
      • (bạn có thể sử dụng chính tệp chương trình miễn là thay đổi tên tệp không làm thay đổi hành vi của chương trình)
  • Nếu nhiệm vụ này là không thể thì một số ngôn ngữ quá tệ.
  • Bạn phải cung cấp đầu ra chính xác của bạn hoặc mô tả chính xác nếu nó quá lớn để phù hợp với bài viết . Bạn không thực sự phải chạy chương trình của bạn. Miễn là nó sẽ chạy trong một khoảng thời gian hữu hạn trên một máy tính có dung lượng bộ nhớ không giới hạn, nó là hợp lệ.

Thí dụ

Chương trình Python 2 đơn giản này là một giải pháp khả thi:

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

Nó xuất ra 987654321010 ký tự ASCII có thể in, do đó đạt 10 điểm.


14
Thật đáng ngưỡng mộ khi sự ám chỉ xuất hiện, pangram chỉ đóng gói một cú đấm mạnh mẽ, vì chúng khá bực tức.
Geobits

2
Tôi chỉ đọc lại quy tắc không phân biệt quá. Tôi đã lướt qua nó sớm hơn, kết luận rằng đó rõ ràng là một quy tắc không hoàn toàn khác biệt vì sự thay thế sẽ dẫn đến các công trình vô lý như in thư asáu triệu triệu lần, trong đó thậm chí không thể đạt được giới hạn trên chính xác số lượng nhân vật. Dù sao, tôi vẫn tự hào về 95 của mình, ngay cả khi nó là loại nhỏ. Kích thước không phải là tất cả mọi thứ, bạn biết.
COTO

Tại sao bạn nghĩ nhiệm vụ này là không thể trong HQ9 +?
Peter Taylor

Tôi sẽ thử và làm điều này trong FORTRAN (vì vậy tôi có thể sử dụng trường hợp không nhạy cảm). --- VÀ cào nó. Tôi cần chữ O 4 lần: 2 lần cho khai báo chương trình và 2 lần cho khai báo vòng lặp của tôi.
Nzall

1
@Dennis số 5more
Sở thích của Calvin

Câu trả lời:


12

GolfScript, ký tự trên 2 (9871 2)

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

In một số nguyên. Tận dụng kích thước thanh ghi CPU không giới hạn (xác định độ dài chuỗi tối đa trong Ruby), bộ nhớ và thời gian chạy. Nguồn cấp dữ liệu chỉ dành cho khả năng đọc.

Mật mã

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.
 }/           #

Điểm số

Xác định b = 9871 2 (xem ký hiệu mũi tên lên của Knuth ).

  • .? thực hiện f: x ↦ x ↑ x .

  • Khối bên trong thực hiện 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 và cứ thế, ta có
    g (x)> x ↑↑ (x + 1)> x ↑↑ x .

  • Khối bên ngoài thực hiện 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 ↑↑↑ 4 và cứ thế, ta có h (x)> x ↑↑↑ (b + 1) .

  • Chúng ta bắt đầu với số nguyên 2 trên ngăn xếp, do đó mã tính h (2)> 2 (b + 1).

  • Điểm số là số chữ số thập phân của h (2) , đó là log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 b .

Do đó, điểm số lớn hơn 2 (9871 2) .

2 ↑↑↑ n phát triển với một tốc độ vô lý khi n lớn hơn. 2 ↑↑↑ 4: = 2 2 ↑↑ 2 ↑↑ 2 = 2 2 ↑↑ 4 = 2 ↑↑ 65536 , là một tháp quyền lực liên kết phải gồm 65536 bản sao của 2 :

                                                                2 4                                                                 

Tương tự, 2 ↑↑↑ 5: = 2 (2 ↑↑↑ 4) , là một tháp năng lượng gồm 2 4 bản sao của 2 .

Bây giờ, điểm số không phải là 2 ↑↑↑ 4 hoặc 2 5 , nó lớn hơn 2 ↑↑↑ b , trong đó b> 2 × 10 39 428 . Đó là một con số lớn ...


@DigitalTrauma - Bạn nên kiểm tra của tôi;)
Trình tối ưu hóa

@Dennis - Khoảng bao nhiêu?
Trình tối ưu hóa

@Optimizer Bạn hiểu ý tôi ;-)
Chấn thương kỹ thuật số

Tuyệt vời! Nó làm tôi nhớ đến số của Graham ... Thật là lớn!
viết lại

3
Lưu ý rằng, về mặt lý thuyết này nên in một số lượng rất lớn các số 0, nhưng trong thực tế, nó chỉ làm hỏng trình thông dịch in `*': bignum too big to convert into `long' (RangeError).
Ilmari Karonen

22

Perl, 70 * 18446744073709551615 * 10 ^ 987654320

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

Đầu ra:

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

lặp lại 18446744073709551615 * 10 ^ 987654320 lần.

$[theo mặc định 0, vì vậy ~$[tương đương với 18446744073709551615.

Như một lưu ý phụ, tôi hết bộ nhớ khi cố gắng tạo số 10^987654320.


Câu trả lời cũ (7703703696):

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

Đầu ra là:

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

lặp lại 98765432 lần.

Lưu ý: Chạy tất cả các mẫu với perl -Mbignum -E


tốt đẹp! nhưng tôi tự hỏi liệu người ta có thể sử dụng đệ quy không ... (không thể tự gọi mình nếu bạn phải sử dụng tên của chính mình, vì nó sẽ đặt lại các ký tự trong tên ... nhưng không thể tên hàm của bạn kết thúc bằng $ _ hoặc một biến số khác của Perl?) .. hoặc sử dụng các cuộc gọi $ 0 một cách khéo léo (không lấp đầy đống)
Olivier Dulac

Nếu bạn có đủ bộ nhớ, bạn có thể làmperl -E'say qw{m}x(9876543210*ord$")'
hmatt1

2
Nếu nó giúp không còn giới hạn thời gian hay bộ nhớ.
Sở thích của Calvin

2
Thật không may khi Perl sử dụng ** thay vì ^ để lũy thừa.
Đánh dấu

11

Bash + coreutils, 151.888.888.888.888.905 (1.5 * 10 ^ 17)

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

Đầu ra số nguyên 1 đến 9x10 15 , mỗi số một dòng. Mất một thời gian dài.

Tại sao 9E15? Hóa ra GNU seqdường như sử dụng phao 64 bit (gấp đôi) bên trong. Số nguyên lớn nhất chúng ta có thể biểu thị với loại này, trước khi tăng thêm một lần dừng do thiếu độ chính xác, là 2 53 hoặc 9007199254740992. Gần nhất chúng ta có thể nhận được với ký hiệu số mũ này là 9E15 hoặc 9000000000000000.

Để tính điểm, tôi đang sử dụng cộng tất cả các số với một số chữ số cho trước và thêm 9E15, bởi vì có một dòng mới giữa mỗi số:

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

Tôi có thể chuyển đầu ra này qua odmột mức độ lớn hơn hoặc hơn, nhưng điều đó làm cho việc tính toán điểm số khó hơn nhiều.


Câu trả lời thay đổi quy tắc:

Bash + coreutils, 18.926.221.380

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

Đầu ra 1 đến 1592346780. Trên macbook giữa năm 2012 của tôi (không quá xa so với điểm chuẩn được liên kết), quá trình này mất khoảng 9m45 giây.

Tôi không thể cưỡng lại việc tối ưu hóa nó thêm một chút nữa, mặc dù có lẽ nó vô nghĩa.

Đầu ra:

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

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

tại sao không phải là bạn làm seq 9876543210;?
durron597

@ durron597 Vì quá lâu - có lẽ khoảng một giờ. Nó cần phải hoàn thành trong vòng dưới 10 phút.
Chấn thương kỹ thuật số

nhưng chắc chắn yếu tố hạn chế duy nhất của chương trình này là i / o ... bất kỳ chương trình nào khác trong bất kỳ ngôn ngữ nào khác không thể thực sự đánh bại điều này.
durron597

@ durron597 Vâng, tôi nghĩ điều đó đúng. Mặc dù tôi sẽ không ngạc nhiên nếu ai đó trong cộng đồng này tìm thấy một cách thông minh ...
Chấn thương kỹ thuật số

1
@DigitalTrauma Tôi thực sự xóa giới hạn thời gian để đảm bảo đây không phải là câu trả lời áp chót (không vi phạm tôi chỉ không muốn cuộc thi kết thúc sớm như vậy: P), vì vậy hãy thoải mái sử dụng 9876543210. Bạn có thể muốn đọc quy tắc mới cuối cùng.
Sở thích của Calvin

6

GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) tức là ≈ 3x10 20000000

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

Làm thế nào nó hoạt động

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";

Dưới đây Xlà số ký tự (độ dài) của biểu diễn chuỗi của mảng [0, 1, 2..,(87^9654321) - 1]sẽ giống như[0 1 2 3 4 ... (87^9654321) - 1]

Tôi đang cố gắng tính toán Xở đây để tìm điểm của tôi. (87^9654321) - 1là khoảng 10^(10^7.272415829713899)với các 18724742chữ số thập phân.

Xđại khái là như 3*10^(2*10^7)vậy X*Xcũng giống nhau thôi. Lưu ý rằng các giá trị này ở phía rất thấp do giới hạn tính toán của (thậm chí) wolframa , tôi không thể tính sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)được giá trị thực củaX


Về lý thuyết, sẽ có một vài cách để làm điều này thậm chí là đẽo, nhưng đáng buồn là BigNum của Ruby có giới hạn và 87 9654321?chỉ là Infinity.
Dennis

Oh! ? Bạn có biết tối đa? ;)
Trình tối ưu hóa

Không chính xác. Có vẻ phụ thuộc vào máy, vì số nguyên phải vừa với RAM. Với bộ nhớ không giới hạn, tôi không biết giới hạn sẽ ở đâu. Có lẽ là 2**(2**64)-1cho Ruby 64-bit.
Dennis

Chúng tôi có dung lượng RAM không giới hạn
Trình tối ưu hóa

Vâng, đó là lý do tại sao tôi làm rõ. Đối với CJam, có một giới hạn cố định và trình thông dịch chỉ gặp sự cố khi bạn làm cạn bộ nhớ. Ruby dường như khác biệt.
Dennis

4

MATLAB, 95

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

Đầu ra

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

Đầu ra chứa tất cả các ký tự ASCII được chỉ định, mỗi ký tự chính xác một lần và theo thứ tự.


1
Lưu ý cho người xem: Câu trả lời này đã được gửi khi thông số kỹ thuật được yêu cầu tối đa hóa các ký tự duy nhất . Đây không còn là mục tiêu, nhưng sẽ ổn nếu câu trả lời này vẫn còn vì nó hợp lệ.
Sở thích của Calvin

2

Ruby, 89

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

Đầu ra:

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

Chứa tất cả các ký tự ASCII trừ, p, , %, q, {, và }.


1
Lưu ý cho người xem: Câu trả lời này đã được gửi khi thông số kỹ thuật được yêu cầu tối đa hóa các ký tự duy nhất . Đây không còn là mục tiêu nữa, nhưng vẫn ổn nếu câu trả lời này vẫn còn vì nó hợp lệ.
Sở thích của Calvin

2

GolfScript, 93

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

Đầu ra:

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

Chứa tất cả các ký tự ASCII ngoại trừ "'.


6
Chương trình của bạn không phải là một pangram hoàn hảo, phải không? Nó dường như không chứa "hoặc 'một trong hai.
Martin Ender

Lưu ý cho người xem: Câu trả lời này đã được gửi khi thông số kỹ thuật được yêu cầu tối đa hóa các ký tự duy nhất . Đây không còn là mục tiêu, nhưng sẽ ổn nếu câu trả lời này vẫn còn nếu nó hợp lệ.
Sở thích của Calvin

1
Thật dễ dàng để làm cho điều này hợp lệ theo các quy tắc mới: chỉ cần xóa #khỏi vị trí hiện tại của nó và nối #"'đến cuối. Điểm số sẽ giảm một, mặc dù.
Ilmari Karonen

2

Bản đánh gôn - 27 * 2 6543 9870

Đây là bài nộp Golfscript đầu tiên của tôi! :)

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

Giải trình:

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

Đầu ra là một danh sách các số. Hãy xem xét các mã sau đây:

12,`{.+}1*

Với 12,nó tạo ra các mảng sau:

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

Backtick biến nó thành một chuỗi, chuyển nó vào khối {.+}. Điều này sao chép chuỗi và sau đó nối hai chuỗi, tạo ra:

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

Thông báo 1*cho trình thông dịch thực hiện khối trước đó một lần (2 1 = 2).

Vì vậy, dựa trên điều đó:

 12,`{.+}n*

Đầu ra đầu ra 12,`2 n lần.

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.