致命错误挑战


20

目的

编写一个例程,该例程接受可打印的ASCII字符s字符串,并返回包含与s相同字符的字符串,并重新排序,以使两个字符的子字符串不会出现多次。该程序必须在一台现代计算机上在不到一分钟的时间内处理所有基准字符串(见下文)。我还将向得分最低的答案(在不到一分钟的时间内处理任何有效的30个字符的字符串)颁发50 rep的特别奖励。

例如,给定input Mississippi,有效输出将是issiMspiips(两个字符的子字符串不会出现两次),而无效输出将是ipMsispiiss(因为子字符串is出现两次)。

该例程可以采用以下形式:

  • stdin(或等效项)或命令行读取完整的程序,并输出至stdout(或等效项)
  • 接受单个字符串参数并返回字符串的函数

您可以假设输入字符串始终允许至少一个有效输出。

挑战

您的例程必须包含5行或更多行的代码,并用换行符分隔。空行(包括仅包含空格的行)在所有上下文中都将被忽略,并且不会计入总行数。

在源代码中交换任何两行都必须产生致命错误。所谓“致命错误”,是指以下任何一种情况:

  • 源代码无法编译,编译器/解释器声明了致命错误
  • 例程因运行时致命错误或未处理的运行时异常而中止
  • 例程被迫突然终止,异常程序终止,除了可能的错误消息和/或堆栈转储之外,不产生任何形式的输出

或者,可以使用不包含换行符的连续代码块代替行。这些块应分别在源文件中的各自行上显示,并应理解在编译/解释源代码之前应删除换行符。

例如,代码

aaaa
bbbb
cccc

会凝结为

aaaabbbbcccc

在评估之前。

在这种模式下,致命错误条件适用于交换任何两个代码块(因此适用于交换源代码中的行,然后再去除换行符)。因此,在上面的示例中,例程aaaaccccbbbbbbbbaaaaccccccccbbbbaaaa必须在编译时或运行时都产生致命错误。

使用此替代模式的提交应声明其使用。

计分

Ñ是在源文件中的非空的文本行的个数,与Ñ ≥5令Ç是由所包含的字节数最长的TextLine在源文件(由字节长度)不计算任何尾随换行符。

提交的分数由cn + 10)给出。

得分最低的提交者为获胜者。

祝你好运。;)

基准字符串

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

大写字母与小写字母是否不同?即输入是CooliO,输出oOoCli
FryAmTheEggman 2014年

@FryAmTheEggman:是的。大写字母与小写字母不同。通常,仅考虑字符的ASCII码值。
COTO 2014年

重复是否仅限于输入中出现的字母对?例如Mspiisiipss有效,因为唯一的重复是ii不会发生的Mississippi
TwiNight

@TwiNight:甚至不允许重复出现在原始字符串中的子字符串。
COTO 2014年

我可以假设有关输入长度的任何信息吗?(背景:高炉解决方案有一个绝妙的主意)
PurkkaKoodari 2014年

Answers:


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个字符德布鲁因序列ķ =“ABCDEF”和Ñ = 2,用移动,以避免瞬间匹配的第一个“B”。


5
这不能真正满足>在现代计算机上,程序必须在一分钟内处理任何有效的30个字符的字符串。,并考虑潜在的无限运行时间。
鲍勃

@Bob我已经为答案添加了一些基准。该代码可能效率不高,但是我认为处理30个字符的字符串花费一分钟以上的可能性确实很小。
吱吱作响的ossifrage,2014年

5

Dyalog APL(11(5 + 10)= 165)

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

证明:

  • 第1行和第5行限制了该功能。交换这些行的任何行都将导致在函数外部发生,该函数为SYNTAX ERROR
  • 第2行定义了b,因此它不能换成依赖的行3或。会有一个。(它显然不能用调换或两种)。4bVALUE ERROR15
  • 第3行定义了c,因此它不能换成4依赖于的行c。(并且我们已经证明没有其他行可以与line交换3。)
  • 第4行取决于第2行和第3行的变量,因此必须位于最后。

3
+1。但是,这一切意味着什么?
吱吱作响的ossifrage,2014年

4

APL(Dyalog),6(5 + 10)= 90

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

我正在使用替代方法,因此:

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

这是相同的旧算法。


解释
2,/⍵给出了输入字符串中的字符对
+/∘.≡⍨数组,并生成了一个数字数组,该数组包含每对相等(包括自身)的
1∧.=对数,检查该数组中的每个元素是否等于1,然后将逻辑与结果加在一起

:⍵如果为true(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,/⍵:⍵。此语法称为防护(将其视为有条件的)。的保护条件必须计算为01或的1个元素的数组01。在这里,它的计算结果要比这复杂(标量包含2个元素的数组)。所以这是一个DOMAIN ERROR
如果第2行与第4行交换,您将得到语句1∧.=,该语句尝试在∧.=没有必需的left参数的情况下应用该函数。(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必须定义在一起;所有类型都必须一致,并且无法在它们之间进行转换,依此类推。这导致几乎不可能发生非致命错误。实际上,发生运行时致命错误几乎几乎是不可能的。

请注意,if g是一个有效函数,但类型错误(任何类型不同于[a]->[a]or String -> String等的类型)比这是一个致命错误,因为它不可能应用于g输入。

输出:

Abracadabar Alaazcma
Is Miss. iMsiasusgsa sMniig?s
Ask Alasak's lAaankss
GGAGTGCAATACTTCCggagtaacttcc
A Man AP la nAC  aalnnaPama
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.