Виклик фатальної помилки


20

Об'єктивна

Напишіть процедуру, яка приймає рядок друкованих символів ASCII, s та повертає рядок, що містить ті самі символи, що і s , упорядкована так, що жодна двосимвольна підрядка не з’являється більше одного разу. Програма повинна обробляти всі рядки орієнтиру (див. Нижче) протягом однієї хвилини на кожному з сучасних комп'ютерів . Я також присуджую спеціальний бонус у 50 повторень за найнижчу відповідь, яка обробляє будь-яку дійсну 30-символьну рядок менше ніж за одну хвилину.

Наприклад, з урахуванням вводу Mississippi, дійсним буде вихід issiMspiips(жодні двосимвольні підрядки не з’являються двічі), тоді як недійсний вихід ipMsispiiss(оскільки підрядка isз’являється двічі).

Звичайний може мати форму:

  • повне зчитування програми з stdin(або еквівалентного) або командного рядка та вихід у stdout(або еквівалент)
  • функція, що приймає аргумент одного рядка і повертає рядок

Ви можете припустити, що рядок введення завжди допускає принаймні один дійсний вихід.

Змагання

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

Заміна будь-яких двох рядків у вихідному коді має призвести до фатальної помилки. Під "фатальною помилкою" ми маємо на увазі будь-яке з наступних умов:

  • вихідний код не вдається компілювати, при цьому компілятор / інтерпретатор оголошує фатальну помилку
  • звичайний перериває роботу зі смертельною помилкою виконання або з необробленим винятком із виконання
  • рутина вимушена в різке, ненормальне завершення програми, яке не видає жодного виводу, за винятком можливого повідомлення про помилку та / або дамп стека

Крім того , замість рядків можуть використовуватися суміжні блоки коду, що не містять символів нового рядка. Кожен з цих блоків повинен відображатися у власному рядку у вихідному файлі, розуміючи, що нові рядки викреслюються до того, як вихідний код буде зібраний / інтерпретований.

Наприклад, код

aaaa
bbbb
cccc

конденсується до

aaaabbbbcccc

перед оцінкою.

У цьому режимі умова фатальної помилки застосовується до заміни будь-яких двох блоків коду (і, таким чином, до заміни рядків у вихідному коді до того, як нові рядки будуть зняті). Отже, у наведеному вище прикладі процедури aaaaccccbbbb, bbbbaaaaccccі ccccbbbbaaaaвсі вони повинні створювати фатальні помилки, або під час компіляції, або під час виконання.

Подання, що використовують цей альтернативний режим, повинні оголосити про його використання.

Оцінка балів

Нехай n - кількість не порожніх текстових рядків у вашому вихідному файлі, з n ≥ 5. Нехай c - кількість байтів, що складається з найдовшої текстової лінії (по довжині байтів) у вашому вихідному файлі, не враховуючи жодного останнього нового рядка.

Оцінка подання подається c ( n + 10).

Подання з найнижчою оцінкою є переможцем.

Удачі. ;)

Бенчмарк Струни

Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama

Чи відрізняються великі літери від малих літер? тобто вхід є CooliO, вихід oOoCli?
FryAmTheEggman

@FryAmTheEggman: Так. Великі літери відрізняються від малих літер. Загалом, враховуйте лише значення ASCII коду символів.
COTO

Чи обмеження повторів обмежуються парами букв, які відображаються на вводі? Наприклад, чи справді Mspiisiipssєдине повторення, iiяке не відбувається в Mississippi?
TwiNight

@TwiNight: Навіть повторні підрядки, які не відображаються в початковому рядку, не дозволені.
COTO

Чи можу я припустити щось про довжину введення? (фон: отримала геніальну ідею для рішення BF)
PurkkaKoodari

Відповіді:


6

PHP, оцінка = 289 (17 × (7 + 10))

Вбудовані функції PHP дозволяють зробити це дуже легко. Наступний код просто перетасовує рядок до отримання дійсного результату:

function f($s){
while(preg_match(
'/(..).*?\1/',$s)
+preg_match('/(.'
.')\1\1/',$s))$s=
str_shuffle(
$s);return $s;}

Орієнтири

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

$s = 'Mississippi';
$t_total = 0;
$t_max = 0;
for ($i=0; $i<10; $i++) {
  $t0 = microtime(true);
  echo f($s);
  $t = microtime(true) - $t0;
  printf("  %10.7f\n",$t);
  $t_total += $t;
  if ($t > $t_max) $t_max = $t;
}
printf("Avg: %10.7f secs; Max: %10.7f secs\n",$t_total/$i, $t_max);

Результати:

  • Міссісіпі: Сер .: 0,0002460 сек; Макс: 0,0005491 сек
  • Антиконституційнийпроблем: Сер .: 0,0001470 сек; Макс: 0,0002971 сек
  • Пневмоултрамікроскопічнийсиліковулканоконіоз: Середнє значення: 0,0587177 сек; Макс: 0,1668079 сек
  • Donaudampfschiffahrtselektrizitatenhauptbetriebswerkbauunterbeamtengesellschaft * : Середнє значення: 9.5642390 сек; Макс: 34,9904099 сек
  • baaacadaeafbbcbdbebfccdcecfdde : Сер .: 5,0858626 сек; Макс: 9,8927171 сек

* Я змінив, äщоб aуникнути багатобайтових проблем
† Це була найскладніша рядок з 30 символів, яку я міг придумати. Це фактично перші 30 символів послідовності De Bruijn для k = 'abcdef' і n = 2, причому перший 'b' переміщений, щоб уникнути миттєвої відповідності.


5
Це насправді не задовольняє > Програма повинна обробляти будь-яку дійсну 30-символьну рядок менше ніж за одну хвилину на сучасному комп’ютері. , враховуючи потенційно нескінченний час виконання.
Боб

@Bob Я додав у відповідь деякі орієнтири. Код може виявитися неефективним, але ймовірність, що на обробку 30-символьного рядка знадобиться більше однієї хвилини, я думаю, дуже мала.
писклива косточка

5

Діалог APL (11 (5 + 10) = 165)

f←{a←{⍴⍵}
b←a⌸2,/⍵
c←b⊢⍵[?⍨a⍵]
1∨.≠b:∇c⋄⍵
}

Доказ:

  • Рядки 1 і 5 обмежують функцію. Заміна будь-якого рядка на ці може призвести до появи поза функції, яка є a SYNTAX ERROR.
  • Рядок 2 визначає b, тому він не може бути замінений на рядки 3або 4залежно від цього b. Було б VALUE ERROR. (І, очевидно, це не можна замінити на 1або5 інше.)
  • Рядок 3 визначає c, тому його не можна поміняти на рядок 4, що залежить від c. (І ми вже довели, що жоден інший рядок не може бути замінений рядком3 .)
  • Рядок 4 залежить від змінних з рядків 2 і 3 і тому повинен бути останнім.

3
+1. Але що це все означає ??
пискливе костіння

4

APL (Діалог), 6 (5 + 10) = 90

{1∧.=
+/∘.≡⍨
2,/⍵:⍵
⋄∇⍵[
?⍨⍴⍵]}

Я використовую альтернативу, тому:

{1∧.=+/∘.≡⍨2,/⍵:⍵⋄∇⍵[?⍨⍴⍵]}

Це той самий старий алгоритм.


Пояснення
2,/⍵ дає масив пар символів у вхідному рядку
+/∘.≡⍨генерує числовий масив з кількості пар, рівних кожній парі (включаючи себе),
1∧.=перевіряє, чи кожен елемент цього масиву дорівнює 1, і логічно ТА результати разом

:⍵Якщо це вірно ( 1), поверніть рядок введення

∇⍵[?⍨⍴⍵] інакше прошифруйте рядок введення та виконайте рекурсивний виклик


Обмін

Якщо рядок 1 поміняється на рядок 2, то ви закінчуєте +/∘.≡⍨{...}це лише безлад функцій та операторів, який дає SYNTAX ERROR.
Якщо рядок 1 замінено рядком 3 або 4, то у вас є визначення функції, і це а SYNTAX ERROR.
Якщо рядок 1 замінено рядком 5, це може призвести до неврівноважених дужокSYNTAX ERROR , тому не турбуйтеся про інші 4 синтаксичні помилки.

Якщо рядок 5 поміняється рядком 2/3/4, знову ж таки, ви маєте визначення функції. (SYNTAX ERROR )

Якщо рядок 2 замінено рядком 3, ви закінчите 1∧.=2,/⍵:⍵. Цей синтаксис називається охоронцем (вважайте це умовним). Умова захисту повинна оцінювати до 0або 11-елементного масиву 0або 1. Тут він оцінюється на щось більш складне, ніж те (скаляр, що містить 2-елементний масив). Отже, це a DOMAIN ERROR.
Якщо рядок 2 замінено рядком 4, ви отримаєте оператор 1∧.=, який намагається застосувати функцію ∧.=без необхідного лівого аргументу. ( SYNTAX ERROR).

Якщо рядок 3 замінений рядком 4, ви знову отримаєте безлад функцій та операторів ( 1∧.=+/∘.≡⍨), тож отримаєте SYNTAX ERROR.


Тести
(цифри в мілісекундах)

Abracadabra Alacazam
11 1 3 5 2
Avg: 4.4

Is Miss. Mississauga Missing?
1260 2000 222 117 111
Avg: 742

Ask Alaska's Alaskans
7 2 3 3 4
Avg: 3.8

GGGGAAAATTTTCCCCgggaaatttccc
31 15 24 13 11
Avg: 18.8

A Man A Plan A Canal Panama
377 2562 23 301 49
Avg: 662.4

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


0

Haskell, 129 = 3x (33 + 10)

тут використовується альтернативний режим.

imp
ort
 Da
ta.
Lis
t;a
%[]
=[[
]];
a%s
=[x
:j|
x<-
s,n
ot$
isI
nfi
xOf
[la
st 
a,x
]a,
j<-
(a+
+[x
])%
(s\
\[x
])]
;g 
s=[
]%s
!!0

або в читаному вигляді:

import Data.List
a%[]=[[]]
a%s=[x:j|x<-s,not$isInfixOf[last a,x]a,j<-(a++[x])%(s\\[x])]
g s=[]%s!!0

Haskell - дуже сувора мова. наприклад, муси importповинні прийти першими; визначенняs повинно поєднуватися; всі типи повинні погодитись, і між ними немає ніякого способу кинутись тощо. це призводить до того, що помилкова смерть майже неможлива. насправді фатальна помилка під час виконання занадто майже неможлива.

зауважте, що якщо gце дійсна функція, але має неправильний тип (будь-який тип, відмінний від того [a]->[a]чи іншого String -> String), це небезпечна помилка, оскільки неможливо застосувати gдо входів.

Виходи:

Abracadabar Alaazcma
Is Miss. iMsiasusgsa sMniig?s
Ask Alasak's lAaankss
GGAGTGCAATACTTCCggagtaacttcc
A Man AP la nAC  aalnnaPama
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.