치명적 오류 챌린지


20

목표

인쇄 가능한 ASCII 문자의 문자열을 받아들이는 일상적인 쓰기 이야 ,와 같은 문자가 포함 된 문자열을 반환 에는 두 문자가 두 번 이상 나타납니다 하위 문자열하지 않도록 다시 정렬을. 프로그램은 최신 컴퓨터 에서 각각 1 분 이내에 모든 벤치 마크 문자열 (아래 참조)을 처리해야 합니다 . 또한 특별 보너스를 수여합니다 (50) 대표를 처리하는 가장 낮은 점수 대답에 어떤 일분 아래에서 유효한 30 자 문자열입니다.

예를 들어, input이 주어지면 Mississippi유효한 출력은 issiMspiips(2 문자 서브 스트링이 두 번 나타나지 않음), 유효하지 않은 출력은 ipMsispiiss(하위 문자열 is이 두 번 나타나기 때문에 )됩니다.

이 루틴은 다음과 같은 형태를 취할 수 있습니다.

  • stdin(또는 동등한) 또는 명령 행 에서 읽고 완전한 프로그램 stdout(또는 동등한)
  • 단일 문자열 인수를 허용하고 문자열을 반환하는 함수

입력 문자열이 항상 하나 이상의 유효한 출력을 허용한다고 가정 할 수 있습니다.

도전

루틴은 개행으로 구분 된 5 줄 이상의 코드 행으로 구성되어야합니다. 빈 줄 (공백 만 포함하는 줄 포함)은 모든 컨텍스트에서 무시되며 총 줄 수에 포함되지 않습니다.

소스 코드에 두 줄을 스와핑 합니다 치명적인 오류가 발생합니다. "치명적 오류"는 다음 조건 중 하나를 나타냅니다.

  • 컴파일러 / 인터프리터가 치명적인 오류를 선언하면서 소스 코드를 컴파일하지 못함
  • 런타임 치명적 오류 또는 처리되지 않은 런타임 예외로 루틴이 중단됩니다.
  • 루틴이 갑작스럽고 비정상적인 프로그램 종료로 강제되어 가능한 오류 메시지 및 / 또는 스택 덤프를 제외하고 어떤 종류의 출력도 생성하지 않습니다.

또는 줄 바꿈 문자가없는 연속 된 코드 블록을 줄 대신 사용할 수 있습니다. 소스 코드를 컴파일 / 해석하기 전에 줄 바꿈이 제거된다는 것을 이해하면서 소스 파일에서이 블록을 각각 자신의 줄에 표시해야합니다.

예를 들어, 코드

aaaa
bbbb
cccc

응축 될 것이다

aaaabbbbcccc

평가하기 전에.

이 모드에서 치명적 오류 조건은 두 코드 블록을 교체하는 데 적용되므로 줄 바꿈이 제거되기 전에 소스 코드의 라인을 교체하는 데 적용됩니다. 따라서 위의 예제에서 루틴 aaaaccccbbbb, bbbbaaaaccccccccbbbbaaaa은 모두 컴파일 타임 또는 런타임에 치명적인 오류를 생성해야합니다.

이 대체 모드를 사용한 제출은 그 사용을 선언해야합니다.

채점

하자 N 과 소스 파일에서 비어 있지 않은 textlines의 수, 수 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 개 문자이다 드 브루 인 시퀀스 에 대한 K 'ABCDEF'= 및 N 인스턴트 일치하지 않도록 이동 제 'B'로, = 2.


5
이것은 실제로 만족스럽지 않습니다 > 프로그램은 최신 컴퓨터에서 1 분 이내에 유효한 30 자 문자열을 처리해야합니다. 잠재적으로 무한한 런타임을 고려합니다.

@ 밥 나는 대답에 몇 가지 벤치 마크를 추가했습니다. 코드가 비효율적 일 수 있지만 30 자 문자열을 처리하는 데 1 분 이상 걸릴 가능성은 실제로 매우 작습니다.
squeamish ossifrage

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또는 4에 따라 바꿀 수 없습니다 b. 있을 것 VALUE ERROR입니다. (그리고 분명히 1또는 로 바꿀 수는 없습니다 5.)
  • 3 행은 정의 c되어 있으므로이 행 4에 따라 바꿀 수 없습니다 c. (우리는 이미 다른 라인을 line과 바꿀 수 없음을 이미 입증했습니다 3.)
  • 4 행은 2 행과 3 행의 변수에 의존하므로 마지막이어야합니다.

3
+1. 그러나 그것은 무엇을 의미 합니까 ??
squeamish ossifrage

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

하스켈, 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

하스켈은 매우 엄격한 언어입니다. 예를 들어, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.