致命的なエラーチャレンジ


20

目的

、印刷可能なASCII文字の文字列を受け取りルーチン書く、と同じ文字を含む文字列を返すのを複数回ありませんので、二部分文字列が表示されていることを並べ替え、。プログラムは、最新のコンピューターで1分以内にすべてのベンチマーク文字列(下記参照)を処理する必要があります。また有効な30文字の文字列を1分以内に処理する最低スコアの回答に対して50 repの特別ボーナスを授与します。

たとえば、inputを指定するMississippiと、有効な出力はissiMspiips(2文字の部分文字列が2回表示されない)、無効な出力はipMsispiiss(部分文字列isが2回表示されるため)になります。

ルーチンの形式は次のとおりです。

  • 完全なプログラムの読み出しstdin(または同等品)またはコマンドライン、及びに出力stdout(または同等品)
  • 単一の文字列引数を受け取り、文字列を返す関数

入力文字列は常に少なくとも1つの有効な出力を許可すると想定できます。

チャレンジ

ルーチンは、改行で区切られた5行以上のコードで構成する必要があります。空行(空白のみを含む行を含む)はすべてのコンテキストで無視され、合計行数にはカウントされません。

ソースコードの2行を入れ替えると、致命的なエラーが発生する必要があります。「致命的なエラー」とは、次の条件のいずれかを指します。

  • ソースコードはコンパイルに失敗し、コンパイラ/インタープリターは致命的なエラーを宣言します
  • ルーチンは、実行時致命的エラーまたは未処理の実行時例外で中止されます
  • ルーチンは、起こりうるエラーメッセージやスタックダンプを除き、いかなる種類の出力も生成しない突然の異常なプログラム終了を強制されます。

または、改行文字を含まない連続したコードブロックを行の代わりに使用できます。これらのブロックは、ソースコードがコンパイル/解釈される前に改行が削除されることを理解して、ソースファイルのそれぞれの行に表示する必要があります。

たとえば、コード

aaaa
bbbb
cccc

に凝縮するだろう

aaaabbbbcccc

評価される前。

このモードでは、致命的なエラー状態は任意の2つのコードブロックのスワップに適用されます(したがって、改行が削除される前のソースコードの行のスワップに適用されます)。したがって、上記の例のルーチンaaaaccccbbbbbbbbaaaaccccおよびccccbbbbaaaaすべてのいずれかコンパイル、または実行時に、致命的なエラーを生成しなければなりません。

この代替モードを使用した送信では、その使用を宣言する必要があります。

得点

してみましょうn個もソースファイル内の非空のテキスト行の数を、とのn ≥5.レッツは、cはに含まれるバイト数も最も長いテキスト行任意の末尾の改行を数えていない、あなたのソースファイル内(バイト長によります)。

提出のスコアはcn + 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 14年

繰り返しは、入力に表示される文字のペアに制限されますか?例:で発生するのMspiisiipssは繰り返しのみであるため、有効ですか?iiMississippi
トワイナイト14年

@TwiNight:元の文字列に表示されない部分文字列を繰り返し使用することはできません。
COTO 14年

入力の長さについて何か推測できますか?(背景:BFソリューションの素晴らしいアイデアを得た)
PurkkaKoodari 14年

回答:


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文字の文字列でした。実際には、k = 'abcdef'およびn = 2の場合のDe Bruijnシーケンスの最初の30文字であり、最初の 'b'は瞬時の一致を避けるために移動されます。


5
これは実際には満足しません>プログラムは、最新のコンピューターで1分以内に有効な30文字の文字列を処理する必要があります。、潜在的に無限のランタイムを考慮します。
ボブ14年

@Bob答えにベンチマークを追加しました。コードは非効率かもしれませんが、30文字の文字列を処理するのに1分以上かかる可能性は確かに非常に小さいと思います。
squeamish ossifrage 14年

5

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

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

証明:

  • 1行目と5行目が関数をバインドしました。それらの行を交換すると、関数の外側で発生しSYNTAX ERRORます。
  • 行2は定義するbので、それを行に交換することができない34、またはに依存しbます。がありますVALUE ERROR。(そして、それは明らかと交換することができない15のいずれか。)
  • 行3は定義するcので、行4に交換できませんc。(そして、他の行をlineと交換できないことがすでに証明されてい3ます。)
  • 4行目は、2行目と3行目の変数に依存するため、最後でなければなりません。

3
+1。しかし、それはすべてどういう意味ですか?
squeamish ossifrage 14年

4

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

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

私は代替を使用しているので:

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

これは同じ古いアルゴリズムです。


説明
2,/⍵は、入力文字列内の文字ペアの配列を提供し、
+/∘.≡⍨各ペアが(ペアを含む)等しいペアの数の数値配列を生成し、
1∧.=その配列の各要素が1に等しいかどうかをチェックし、結果を論理ANDします

:⍵それが真(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か、1またはの1要素の配列0または1。ここでは、それよりも複雑なもの(2要素配列を含むスカラー)に評価されます。だからこれは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まとめる必要があります。すべてのタイプが一致する必要があり、それらの間でキャストする方法などありません。これにより、致命的ではないエラーがほぼ不可能になります。実際、実行時に致命的なエラーが発生することはほとんど不可能です。

if gは有効な関数であるが、入力に適用できないため、これよりも間違ったタイプ(then [a]->[a]などString -> Stringとは異なるタイプ)があると致命的なエラーになることに注意してくださいg

出力:

Abracadabar Alaazcma
Is Miss. iMsiasusgsa sMniig?s
Ask Alasak's lAaankss
GGAGTGCAATACTTCCggagtaacttcc
A Man AP la nAC  aalnnaPama
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.