Программы Prolific Perfect Pangram, относящиеся к печати ASCII

23

Обновления: ограничение по времени снято. Вы должны быть в состоянии описать вывод - см. Новое правило.

Панграмма является предложением , которое использует каждую букву в алфавите , по крайней мере один раз, такие как:

Быстрая коричневая лиса прыгает через ленивую собаку.

Идеально панграмма использует каждую букву только один раз.

Подумайте о том, чтобы написать программу, которая является идеальной панграммой, используя в качестве алфавита 95 печатных символов ASCII (шестнадцатеричные коды от 20 до 7E):

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

Такая программа должна содержать ровно 95 символов, причем каждый печатный символ ASCII встречается ровно один раз, но в любом порядке. (Таким образом, существует 95! = 1,03 × 10 148 возможностей.)

Ваша задача состоит в том, чтобы написать эту программу так, чтобы количество печатаемых символов ASCII, печатаемых на стандартный вывод, было как можно выше (т.е. плодовитым).

Ваша оценка - это количество печатаемых символов ASCII, которые выводит ваша программа ( общая сумма, а не отдельная сумма: AABCбаллы 4, тогда как ABCбаллы 3) . Самый высокий балл побеждает.

Детали

  • Вывод может содержать любые символы (включая дубликаты), но только экземпляры из 95 печатных символов ASCII засчитываются в ваш счет.
    • Вы можете использовать этот JSFiddle для подсчета количества печатных символов ASCII в любой строке.
  • Если у вашего языка нет стандартного вывода, используйте наиболее подходящую альтернативу.
  • Ваша программа ...
    • должно иметь конечное время выполнения (ограничение по времени было снято)
    • должен иметь конечный вывод
    • может содержать комментарии
    • должен компилироваться и запускаться без ошибок
    • не должен запрашивать или требовать ввода
    • должен быть инвариантным по времени и детерминированным
    • не должен использовать внешние библиотеки
    • не должен требовать подключения к сети
    • не должен использовать внешние файлы
      • (вы можете использовать сам файл программы, если изменение имени файла не влияет на поведение программы)
  • Если эта задача невозможна, это какой-то язык, который слишком плох.
  • Вы должны дать свой точный вывод или точно описать его, если он слишком велик, чтобы поместиться в посте . Вы на самом деле не должны запускать вашу программу. До тех пор, пока он будет работать за ограниченное время на компьютере с неограниченным объемом памяти, он действителен.

пример

Эта упрощенная программа на Python 2 является возможным решением:

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

Он выводит, 9876543210который содержит 10 печатных символов ASCII, получая при этом 10.

Кальвин Хобби
источник
14
Как бы удивительно ни выглядела аллитерация, панграммы наносят мощный удар, так как они довольно неприятны.
Geobits
2
Я просто перечитал правило полного не различения тоже. Я обдумал это ранее, заключив, что это было явно не-общее правило, так как альтернатива привела бы к абсурдным конструкциям, таким как печать письма aшесть квадриллионов раз, когда даже невозможно получить точный верхний предел количество символов Во всяком случае, я все еще горжусь своими 95, даже если это немного. Знаете, размер - это еще не все.
COTO
Как вы думаете, почему эта задача невозможна в HQ9 +?
Питер Тейлор
Я собираюсь попытаться сделать это на Фортране (чтобы я мог использовать регистронезависимость). --- И поцарапайте это. Мне нужна буква O 4 раза: 2 раза для объявления программы и 2 раза для объявления цикла.
Nzall
1
@Dennis No. 5more
Увлечения Кэлвина

Ответы:

12

GolfScript, более 2 ↑↑↑ (9871 ↑↑ 2) символов

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

Печатает целое число Воспользуйтесь неограниченным размером регистра ЦП (который определяет максимальную длину строки в Ruby), памятью и временем выполнения. Перевод строки предназначен исключительно для удобства чтения.

Код

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 (см. Обозначение Кнута со стрелкой вверх ).

  • .? выполняет 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 ↑↑↑ 4 и т. д., h (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 ↑↑↑ n растет с нелепой скоростью, когда n становится больше. 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 , что является правоассоциативной энергетической башней из 65536 экземпляров 2 :

                                                                2 ↑↑↑ 4                                                                 

Точно так же 2 ↑↑↑ 5: = 2 ↑↑ (2 ↑↑↑ 4) , который является силовой башней 2 copies 4 копии 2 .

Теперь счет не 2 ↑↑↑ 4 или 2 ↑↑↑ 5 , он больше 2 ↑↑↑ b , где b> 2 × 10 39 428 . Это большое число ...

Деннис
источник
@DigitalTrauma - Вы должны проверить мой;)
Оптимизатор
@ Денис - Сколько это примерно?
Оптимизатор
@Optimizer Вы меня поймали ;-)
Цифровая травма
Потрясающе! Это напоминает мне номер Грэма ... Это большое!
переписано
3
Обратите внимание, что, хотя теоретически это должно вывести очень большое количество нулей, на практике это просто приводит к аварийному завершению интерпретатора in `*': bignum too big to convert into `long' (RangeError).
Ильмари Каронен,
22

Perl, 70 * 18446744073709551615 * 10 ^ 987654320

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

Выход:

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

повторяется 18446744073709551615 * 10 ^ 987654320 раз.

$[по умолчанию 0, поэтому ~$[эквивалентно 18446744073709551615.

Как примечание, у меня не хватило памяти, пытаясь создать номер 10^987654320.


Старый ответ (7703703696):

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

Выход:

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

повторяется 98765432 раза.

Примечание: запустить все образцы с perl -Mbignum -E

es1024
источник
хороший! но мне интересно, можно ли использовать рекурсивность ... (невозможно назвать себя, если вам нужно использовать свое собственное имя, так как оно будет повторять символы в имени ... но не может имя вашей функции закончиться в $ _ или другую переменную Perl?) .. или используйте $ 0 вызовов умно (без заполнения кучи)
Оливье Дюлак
Если бы у вас было достаточно памяти, вы могли бы сделатьperl -E'say qw{m}x(9876543210*ord$")'
hmatt1
2
Если это помогает, больше нет времени или ограничения памяти.
Увлечения Кэлвина
2
К сожалению, Perl использует **, а не ^ для возведения в степень.
Марк
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-битные числа с плавающей точкой (double). Самое большое целое число, которое мы можем представить этим типом, до того, как приращение на единицу перестанет работать из-за недостатка точности, равно 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на дополнительный порядок или около того, но это усложняет вычисление баллов.


Ответ перед изменением правила:

Bash + coreutils, 18 926 221 380

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

Выводы с 1 по 1592346780. На моем macbook середины 2012 года (который не так уж далек от связанного теста) это занимает около 9м45 с.

Я не мог удержаться, чтобы оптимизировать его немного больше, хотя это, вероятно, бессмысленно.

Выход:

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

real    9m46.564s
user    11m7.419s
sys 0m10.974s
$ 
Цифровая травма
источник
почему не делаешь seq 9876543210;?
durron597
@ durron597 Потому что это занимает слишком много времени - вероятно, около часа. Это должно завершиться менее чем за 10 минут.
Цифровая травма
но, безусловно, единственным ограничивающим фактором этой программы является ввод / вывод ... любая другая программа на любом другом языке не может действительно победить это.
durron597
@ durron597 Да, я думаю, что это правильно. Хотя я не удивлюсь, если кто-то в этом сообществе найдет умный путь ...
Digital Trauma
1
@DigitalTrauma Я на самом деле убираю ограничение по времени, чтобы убедиться, что это не предпоследний ответ (без обид, я просто не хочу, чтобы конкурс так скоро закончился: P), так что не стесняйтесь использовать 9876543210. Вы можете прочитать новое последнее правило.
Увлечения Кэлвина
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же и только то же самое. Обратите внимание, что эти значения находятся на очень низкой стороне, так как из-за вычислительных ограничений (даже) вольфрамы , я не смог вычислить, sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)что является истинным значениемX

оптимизатор
источник
Теоретически, было бы несколько способов сделать это даже хьюгером, но, к сожалению, BigNum в Ruby имеет свои ограничения и 87 9654321?является справедливым Infinity.
Деннис
Ой! ? Вы знаете максимум? ;)
Оптимизатор
Не совсем. Кажется, зависит от машины, так как целое число должно вписываться в RAM. С неограниченной памятью я не знаю, где будет предел. Вероятно, 2**(2**64)-1для 64-битного Ruby.
Деннис
У нас неограниченный объем оперативной памяти
Оптимизатор
Да, именно поэтому я уточнил. Для CJam есть фиксированный предел, и интерпретатор просто падает, когда вы исчерпываете память. Рубин, похоже, другой.
Деннис
4

МАТЛАБ, 95

Код

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

Выход

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

Вывод содержит все указанные символы ASCII, каждый ровно один раз и по порядку.

COTO
источник
1
Примечание для зрителей: этот ответ был отправлен, когда спецификация попросила максимизировать количество уникальных символов. Это больше не цель, но это нормально, если этот ответ остается, поскольку он действителен.
Увлечения Кэлвина
2

Руби, 89

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

Выход:

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

Содержит все символы ASCII , за исключением, p, , %, q, {, и }.

Дверная ручка
источник
1
Примечание для зрителей: этот ответ был отправлен, когда спецификация попросила максимизировать количество уникальных символов. Это больше не цель, но это нормально, если этот ответ остается, поскольку он действителен.
Увлечения Кэлвина
2

GolfScript, 93

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

Выход:

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

Содержит все символы ASCII, кроме "и '.

Дверная ручка
источник
6
Ваша программа не идеальная панграмма, правда? Кажется, он не содержит "ни того, 'ни другого.
Мартин Эндер
Примечание для зрителей: этот ответ был отправлен, когда спецификация попросила максимизировать количество уникальных символов. Это больше не цель, но это нормально, если этот ответ останется, если он станет действительным.
Увлечения Кэлвина
1
Достаточно легко сделать это действительным в соответствии с новыми правилами: просто удалите #его из текущей позиции и добавьте #"'в конец. Счет уменьшится на один, хотя.
Ильмари Каронен,
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 раз.

Бета распад
источник