Thử thách lỗi nghiêm trọng


20

Mục tiêu

Viết một thói quen chấp nhận một chuỗi các ký tự ASCII có thể in, s và trả về một chuỗi chứa các ký tự giống như s , được sắp xếp lại để không có chuỗi con hai ký tự xuất hiện nhiều hơn một lần. Chương trình phải xử lý tất cả các chuỗi điểm chuẩn (xem bên dưới) trong mỗi phút dưới một máy tính hiện đại . Tôi cũng sẽ trao phần thưởng đặc biệt là 50 đại diện cho câu trả lời cho điểm thấp nhất xử lý bất kỳ chuỗi 30 ký tự hợp lệ nào trong vòng một phút.

Ví dụ, với đầu vào Mississippi, đầu ra hợp lệ sẽ là issiMspiips(không có chuỗi con hai ký tự xuất hiện hai lần), trong khi đầu ra không hợp lệ sẽ là ipMsispiiss(vì chuỗi con isxuất hiện hai lần).

Các thói quen có thể có hình thức:

  • một chương trình hoàn chỉnh đọc từ stdin(hoặc tương đương) hoặc dòng lệnh và xuất ra stdout(hoặc tương đương)
  • một hàm chấp nhận một đối số chuỗi đơn và trả về một chuỗi

Bạn có thể cho rằng chuỗi đầu vào luôn thừa nhận ít nhất một đầu ra hợp lệ.

Các thách thức

Thói quen của bạn phải bao gồm 5 dòng mã trở lên được phân tách bằng dòng mới. Các dòng trống (chỉ bao gồm các dòng chỉ chứa khoảng trắng) được bỏ qua trong tất cả các ngữ cảnh và không được tính vào tổng số dòng.

Hoán đổi bất kỳ hai dòng trong mã nguồn của bạn phải tạo ra một lỗi nghiêm trọng. Theo "lỗi nghiêm trọng", chúng tôi đề cập đến bất kỳ điều kiện nào sau đây:

  • mã nguồn không biên dịch được, với trình biên dịch / trình thông dịch khai báo lỗi nghiêm trọng
  • thường trình hủy bỏ với lỗi nghiêm trọng trong thời gian chạy hoặc ngoại lệ thời gian chạy chưa xử lý
  • thói quen bị buộc phải chấm dứt chương trình đột ngột, bất thường không tạo ra bất kỳ đầu ra nào ngoại trừ thông báo lỗi có thể và / hoặc kết xuất ngăn xếp

Ngoài ra , các khối mã liền kề không chứa ký tự dòng mới có thể được sử dụng thay cho các dòng. Mỗi khối này phải được hiển thị trên dòng riêng của chúng trong tệp nguồn, với sự hiểu rằng các dòng mới bị loại bỏ trước khi mã nguồn được biên dịch / giải thích.

Ví dụ: mã

aaaa
bbbb
cccc

sẽ ngưng tụ để

aaaabbbbcccc

trước khi được đánh giá.

Trong chế độ này, điều kiện lỗi nghiêm trọng áp dụng cho việc hoán đổi bất kỳ hai khối mã nào (và do đó để hoán đổi các dòng trong mã nguồn trước khi các dòng mới bị loại bỏ). Do đó, trong ví dụ trên, các thói quen aaaaccccbbbb, bbbbaaaaccccccccbbbbaaaatất cả phải tạo ra các lỗi nghiêm trọng, tại thời điểm tính toán hoặc thời gian chạy.

Đệ trình sử dụng chế độ thay thế này sẽ tuyên bố việc sử dụng nó.

Chấm điểm

Đặt n là số lượng dòng văn bản không trống trong tệp nguồn của bạn, với n ≥ 5. Gọi c là số byte được bao gồm bởi dòng văn bản dài nhất (theo độ dài byte) trong tệp nguồn của bạn, không tính bất kỳ dòng mới nào.

Điểm của bài nộp được đưa ra bởi c ( n + 10).

Bài nộp với số điểm thấp nhất là người chiến thắng.

May mắn nhất. ;)

Chuỗi điểm chuẩn

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

Là chữ in hoa khác với chữ thường? tức là đầu vào là CooliO, đầu ra oOoCli?
FryAmTheEggman

@FryAmTheEggman: Vâng. Chữ in hoa khác với chữ thường. Nói chung, chỉ xem xét các giá trị mã ASCII của các ký tự.
COTO

Sự lặp lại có giới hạn các cặp chữ xuất hiện trong đầu vào không? Ví dụ: Có Mspiisiipsshợp lệ vì sự lặp lại duy nhất iikhông xảy ra trong Mississippi?
TwiNight

@TwiNight: Ngay cả các chuỗi con lặp đi lặp lại không xuất hiện trong chuỗi gốc cũng không được phép.
COTO

Tôi có thể giả định bất cứ điều gì về chiều dài đầu vào? (nền: có một ý tưởng tuyệt vời cho giải pháp BF)
PurkkaKoodari

Câu trả lời:


6

PHP, điểm = 289 (17 × (7 + 10))

Các hàm dựng sẵn của PHP làm cho nó khá dễ dàng để làm điều này một cách tồi tệ. Đoạn mã sau chỉ xáo trộn chuỗi cho đến khi thu được kết quả hợp lệ:

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

Điểm chuẩn

Thời gian thực hiện trung bình và tối đa được tính bằng mã sau:

$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);

Các kết quả:

  • Mississippi: Trung bình: 0,0002460 giây; Tối đa: 0,0005491 giây
  • Chống vi trùng: Trung bình: 0,0001470 giây; Tối đa: 0,0002971 giây
  • Pneumonoultramicroscopicsilicovolcanoconiosis: Trung bình: 0,0587177 giây; Tối đa: 0.1668079 giây
  • Donaudampfschiffahrtselektrizitinhauptbetriebswerkbauunterbeamtengesellschaft * : Trung bình: 9,5642390 giây; Tối đa: 34.9904099 giây
  • baaacadaeafbbcbdbebfccdcecfdde : Avg: 5.0858626 giây; Tối đa: 9,8927171 giây

* Tôi đã thay đổi äđể atránh các vấn đề nhiều byte
Đây là chuỗi 30 ký tự khó nhất tôi có thể nghĩ ra. Đây thực sự là 30 ký tự đầu tiên của chuỗi De Bruijn cho k = 'abcdef' và n = 2, với 'b' đầu tiên được di chuyển để tránh khớp ngay lập tức.


5
Điều này không thực sự thỏa mãn > Chương trình phải xử lý bất kỳ chuỗi 30 ký tự hợp lệ nào dưới một phút trên máy tính hiện đại. , xem xét thời gian chạy tiềm năng vô hạn.
Bob

@Bob Tôi đã thêm một số điểm chuẩn cho câu trả lời. Mã có thể không hiệu quả, nhưng khả năng nó mất hơn một phút để xử lý chuỗi 30 ký tự, tôi nghĩ, thực sự rất nhỏ.
squossish ossifrage

5

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

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

Bằng chứng:

  • Dòng 1 và 5 ràng buộc chức năng. Hoán đổi bất kỳ dòng nào cho những người sẽ dẫn đến xảy ra bên ngoài một chức năng, đó là một SYNTAX ERROR.
  • Dòng 2 định nghĩa b, vì vậy nó không thể được hoán đổi cho các dòng 3hoặc 4, phụ thuộc vào b. Sẽ có một VALUE ERROR. (Và rõ ràng là không thể hoán đổi với1 hoặc 5một trong hai.)
  • Dòng 3 định nghĩa c, vì vậy nó không thể được hoán đổi cho dòng 4, điều này phụ thuộc vào c. (Và chúng tôi đã chứng minh rằng không có dòng nào khác có thể hoán đổi với dòng3 .)
  • Dòng 4 phụ thuộc vào các biến từ dòng 2 và 3 và do đó phải là cuối cùng.

3
+1. Nhưng tất cả có nghĩa là gì ??
squossish ossifrage

4

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

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

Tôi đang sử dụng thay thế, vì vậy:

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

Đây là cùng một thuật toán cũ.


Giải thích
2,/⍵ đưa ra một mảng các cặp ký tự trong chuỗi đầu vào
+/∘.≡⍨tạo ra một mảng số có bao nhiêu cặp mà mỗi cặp bằng nhau (bao gồm chính nó)
1∧.=kiểm tra xem mỗi phần tử của mảng đó có bằng 1 không, và logic VÀ kết quả cùng nhau

:⍵Nếu đó là true ( 1), trả về chuỗi đầu vào

∇⍵[?⍨⍴⍵] khác xáo trộn chuỗi đầu vào và thực hiện cuộc gọi đệ quy


Trao đổi

Nếu dòng 1 được hoán đổi với dòng 2, thì cuối cùng bạn +/∘.≡⍨{...}chỉ là một mớ hỗn độn của các hàm và toán tử cung cấp SYNTAX ERROR.
Nếu dòng 1 được hoán đổi với dòng 3 hoặc 4, thì bạn có bên ngoài định nghĩa hàm và đó là a SYNTAX ERROR.
Nếu dòng 1 được hoán đổi với dòng 5, chỉ riêng niềng răng không cân bằng sẽ gây ra SYNTAX ERROR, vì vậy đừng lo lắng về 4 lỗi cú pháp khác.

Nếu dòng 5 được hoán đổi với dòng 2/3/4, một lần nữa bạn có bên ngoài định nghĩa hàm. ( SYNTAX ERROR)

Nếu dòng 2 được hoán đổi với dòng 3, bạn kết thúc với 1∧.=2,/⍵:⍵. Cú pháp này được gọi là một người bảo vệ (nghĩ về nó như một điều kiện). Điều kiện bảo vệ phải ước tính 0hoặc 1hoặc một mảng 1 phần tử của 0hoặc 1. Ở đây, nó đánh giá một cái gì đó phức tạp hơn thế (một vô hướng chứa mảng 2 phần tử). Vì vậy, đây là một DOMAIN ERROR.
Nếu dòng 2 được hoán đổi với dòng 4, bạn sẽ nhận được câu lệnh 1∧.=cố gắng áp dụng hàm ∧.=mà không cần đối số bên trái. ( SYNTAX ERROR).

Nếu dòng 3 được hoán đổi với dòng 4, một lần nữa bạn sẽ nhận được một mớ hàm và toán tử ( 1∧.=+/∘.≡⍨) để bạn nhận được SYNTAX ERROR.


Điểm chuẩn
(số tính bằng mili giây)

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

Tôi vẫn đang suy nghĩ về mối nối khác nhau. Ngoài ra tôi có một cách xác định, có hệ thống để thực hiện nhiệm vụ. Tôi chỉ không thể biến nó thành một thuật toán (lấy đi phần sáng tạo của "làm cho số đúng") và không thể đảm bảo nó hoạt động mọi lúc.


0

Haskell, 129 = 3x (33 + 10)

cái này sử dụng chế độ thay thế.

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

hoặc ở dạng có thể đọc được:

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 là một ngôn ngữ rất nghiêm ngặt. ví dụ, importphải đến trước; định nghĩa củas phải đi cùng nhau; tất cả các loại phải đồng ý và không có cách nào để phân chia giữa chúng, v.v. điều này dẫn đến việc có một lỗi không nghiêm trọng gần như không thể. trong thực tế, có một lỗi nghiêm trọng trong thời gian chạy là gần như không thể.

lưu ý rằng nếu glà một hàm hợp lệ nhưng có loại sai (bất kỳ loại nào khác nhau [a]->[a]hoặcString -> String tương tự) thì đây là một lỗi nghiêm trọng vì không thể áp dụng gcho các đầu vào.

đầu ra:

Abracadabar Alaazcma
Is Miss. iMsiasusgsa sMniig?s
Ask Alasak's lAaankss
GGAGTGCAATACTTCCggagtaacttcc
A Man AP la nAC  aalnnaPama
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.