Плодові програми Perfect Pangram, що стосуються друку ASCII


23

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

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

Швидка бура лисиця стрибає над ледачим собакою.

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

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

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

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

Ваше завдання полягає в тому, щоб написати цю програму таким чином, щоб кількість друкованих символів ASCII, що друкуються для stdout, була максимально можливою (тобто плодотворною).

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

Деталі

  • Вихід може містити будь-які символи (включаючи дублікати), але до вашого рахунку зараховуються лише екземпляри 95 друкованих символів ASCII.
    • Ви можете використовувати цю JSFiddle для підрахунку кількості друкованих символів ASCII у будь-якому рядку.
  • Якщо у вашій мові немає штриху, використовуйте найбільш підходящу альтернативу.
  • Ваша програма ...
    • повинен мати обмежений термін виконання (обмеження часу було знято)
    • повинні мати кінцевий вихід
    • може містити коментарі
    • повинен компілювати та запускати без (невловимих) помилок
    • не повинні вимагати введення або вимагати введення
    • повинні бути інваріантними та детермінованими у часі
    • не повинні використовувати зовнішні бібліотеки
    • не повинні вимагати підключення до мережі
    • не повинні використовувати зовнішні файли
      • (Ви можете використовувати сам програмний файл до тих пір, поки зміна імені файлу не змінить поведінку програми)
  • Якщо це завдання неможливо - це якась мова, яка занадто погана.
  • Ви повинні дати точний результат або точно описати його, якщо він занадто великий, щоб вмістити посаду . Насправді не потрібно запускати свою програму. До тих пір , як вона буде працювати в кінцевому час на комп'ютері з необмеженим обсягом пам'яті , вона є дійсною.

Приклад

Ця спрощена програма Python 2 - це можливе рішення:

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

Він виводить, 9876543210який містить 10 символів для друку ASCII, таким чином, 10.


14
Як дивно, захоплююче виглядає алітерація, панграми просто упаковують потужний удар, оскільки вони дуже неприємні.
Геобіц

2
Я просто перечитав загальне непомітне правило теж. Я переглянув це раніше, зробивши висновок, що це, очевидно, aневід'ємне правило, оскільки альтернатива призведе до абсурдних конструкцій, таких як надрукування листа в шість квадрильйонів разів, де навіть неможливо отримати точну верхню межу на кількість символів У всякому разі, я все ще пишаюся своїми 95, навіть якщо вона така маленька. Розмір - це не все, ви знаєте.
COTO

Чому ви вважаєте, що це завдання неможливо в HQ9 +?
Пітер Тейлор

Я спробую це зробити в FORTRAN (щоб я міг скористатися нечутливістю випадку). --- І дряпати це. Мені потрібна літера O 4 рази: 2 рази для декларації програми та 2 рази для моєї декларації циклу.
Nzall

Відповіді:


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 ↑↑↑ 4 екземпляри з 2 .

Тепер оцінка не 2 ↑↑↑ 4 або 2 ↑↑↑ 5 , вона більша, ніж 2 ↑↑↑ b , де b> 2 × 10 39 428 . Це велика кількість ...


@DigitalTrauma - Ви повинні перевірити мою;)
Оптимізатор

@Dennis - скільки це приблизно?
Оптимізатор

@Optimizer Ви мене отримали ;-)
Digital Trauma

Дивовижно! Це мені нагадує номер Грема ... Це велике!
переписано

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


приємно! але мені цікаво, чи можна було б використати рекурсивність ... (неможливо зателефонувати собі, якщо вам доведеться використовувати власне ім’я, як це повторить символи в імені ... але не вдалося ім'я вашої функції закінчитися $ $ або іншу зі змінних 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-бітні поплавці (подвійні) всередині. Найбільша ціла кількість, яку ми можемо представити за допомогою цього типу, до того, як приріст на один перестане працювати через недостатню точність, становить 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.
Денніс

Ой! ? Ви знаєте максимум? ;)
Оптимізатор

Не зовсім. Здається, це залежить від машини, оскільки ціле число повинно вписуватися в оперативну пам'ять. Маючи необмежену пам'ять, я не знаю, де буде межа. Можливо, 2**(2**64)-1для 64-розрядної Рубі.
Денніс

У нас є необмежена кількість оперативної пам’яті
оптимізатор

Так, саме тому я уточнив. Для CJam існує фіксований ліміт, і перекладач просто виходить з ладу, коли ви вичерпуєте пам'ять. Рубі, здається, відрізняється.
Денніс

4

MATLAB, 95

Код

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

Вихід

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

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


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 рази.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.