ความท้าทายข้อผิดพลาดร้ายแรง


20

วัตถุประสงค์

เขียนรูทีนที่ยอมรับสตริงของอักขระ ASCII ที่พิมพ์ได้sและส่งคืนสตริงที่มีอักขระเดียวกับsเรียงลำดับใหม่เพื่อให้ไม่มีสตริงย่อยสองอักขระปรากฏมากกว่าหนึ่งครั้ง โปรแกรมต้องประมวลผลสตริงมาตรฐานทั้งหมด (ดูด้านล่าง) ในภายใต้หนึ่งนาทีในแต่ละบนคอมพิวเตอร์ที่ทันสมัย ฉันยังจะได้รับรางวัลโบนัสพิเศษของ50 ตัวแทนไปที่คำตอบให้คะแนนต่ำสุดที่ประมวลผลใด ๆสตริงอักขระ 30 ตัวที่ถูกต้องในภายใต้หนึ่งนาที

ตัวอย่างเช่นเมื่อรับอินพุตMississippiเอาต์พุตที่ถูกต้องจะเป็นissiMspiips(ไม่มีสตริงย่อยสองอักขระปรากฏสองครั้ง) ในขณะที่เอาต์พุตไม่ถูกต้องipMsispiiss(เนื่องจากสตริงย่อยisปรากฏสองครั้ง)

รูทีนอาจอยู่ในรูปของ:

  • โปรแกรมที่สมบูรณ์อ่านจากstdin(หรือเทียบเท่า) หรือบรรทัดคำสั่งและส่งออกไปยังstdout(หรือเทียบเท่า)
  • ฟังก์ชั่นที่ยอมรับอาร์กิวเมนต์สตริงเดี่ยวและส่งคืนสตริง

คุณอาจสมมติว่าสายป้อนข้อมูลยอมรับอย่างน้อยหนึ่งเอาต์พุตที่ถูกต้อง

ความท้าทาย

ชุดคำสั่งของคุณจะต้องประกอบด้วยรหัสอย่างน้อย 5 บรรทัดคั่นด้วยบรรทัดใหม่ บรรทัดว่าง (ซึ่งรวมถึงบรรทัดที่มีเพียงช่องว่างเท่านั้น) จะถูกละเว้นในบริบททั้งหมดและไม่นับรวมในการนับบรรทัดทั้งหมด

การสลับสองบรรทัดในซอร์สโค้ดของคุณต้องสร้างข้อผิดพลาดร้ายแรง โดย "ข้อผิดพลาดร้ายแรง" เราอ้างถึงเงื่อนไขใด ๆ ต่อไปนี้:

  • ซอร์สโค้ดไม่สามารถคอมไพล์ด้วยคอมไพเลอร์ / ล่ามประกาศข้อผิดพลาดร้ายแรง
  • รูทีนจะยกเลิกพร้อมกับข้อผิดพลาดร้ายแรงขณะทำงานหรือข้อยกเว้นรันไทม์ที่ไม่ได้จัดการ
  • รูทีนถูกบังคับให้หยุดทำงานโดยกะทันหันผิดปกติของโปรแกรมที่ไม่สร้างเอาต์พุตใด ๆ ยกเว้นข้อความแสดงข้อผิดพลาดที่เป็นไปได้และ / หรือสแต็คดัมพ์

หรือมิฉะนั้นบล็อกที่ต่อเนื่องกันของรหัสที่ไม่มีอักขระบรรทัดใหม่อาจถูกใช้แทนบรรทัด บล็อกเหล่านี้ควรจะแสดงในบรรทัดของตนเองในไฟล์ต้นฉบับด้วยความเข้าใจว่าการขึ้นบรรทัดใหม่ถูกตัดออกก่อนที่จะคอมไพล์ / ตีความ

ตัวอย่างเช่นรหัส

aaaa
bbbb
cccc

จะรวมตัวกับ

aaaabbbbcccc

ก่อนที่จะถูกประเมิน

ในโหมดนี้เงื่อนไขข้อผิดพลาดร้ายแรงจะใช้กับการสลับบล็อคโค้ดสองรายการใด ๆ (และเพื่อทำการสลับบรรทัดในซอร์สโค้ดก่อนจะขึ้นบรรทัดใหม่) ดังนั้นในตัวอย่างข้างต้นปฏิบัติaaaaccccbbbb, bbbbaaaaccccและccccbbbbaaaaต้องข้อผิดพลาดร้ายแรงผลิตทั้งหมดทั้งที่ compiletime หรือรันไทม์

การส่งโดยใช้โหมดทางเลือกนี้ควรประกาศการใช้งาน

เกณฑ์การให้คะแนน

ให้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 วินาที
  • anticonstitutionnellement: ค่าเฉลี่ย: 0.0001470 วินาที สูงสุด: 0.0002971 วินาที
  • Pneumonoultramicroscopicsilicovolcanoconiosis: เฉลี่ย: 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 อักขระคือฉันคิดว่ามีขนาดเล็กมากอย่างแน่นอน
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(และเราได้พิสูจน์แล้วว่าไม่มีบรรทัดอื่นที่สามารถสลับกับบรรทัด3ได้)
  • บรรทัดที่ 4 ขึ้นอยู่กับตัวแปรจากบรรทัดที่ 2 และ 3 และจะต้องอยู่ท้าย

3
+1 แต่มันหมายความว่าอย่างไร ?
ossifrage คลื่นไส้

4

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

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

ฉันกำลังใช้ทางเลือกดังนั้น:

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

นี่เป็นอัลกอริทึมแบบเดิม


คำอธิบาย
2,/⍵ให้อาร์เรย์ของคู่อักขระในสตริงอินพุต
+/∘.≡⍨สร้างอาร์เรย์ตัวเลขของจำนวนคู่ที่แต่ละคู่เท่ากัน (รวมถึงตัวเอง)
1∧.=ตรวจสอบว่าแต่ละองค์ประกอบของอาร์เรย์นั้นเท่ากับ 1 และตรรกะและผลลัพธ์ร่วมกัน

:⍵หากเป็นจริง ( 1) ให้ส่งคืนสตริงอินพุต

∇⍵[?⍨⍴⍵] มิฉะนั้นช่วงชิงสตริงป้อนข้อมูลและทำการโทรซ้ำ


แลกเปลี่ยน

ถ้าบรรทัด 1 สลับกับสาย 2 แล้วคุณจะจบลงด้วยซึ่งเป็นเพียงระเบียบของฟังก์ชั่นและผู้ประกอบการที่ให้+/∘.≡⍨{...} ถ้าบรรทัดที่ 1 จะสลับกับสาย 3 หรือ 4 แล้วคุณมีนอกนิยามฟังก์ชั่นและที่เป็น หากบรรทัดที่ 1 สลับกับบรรทัดที่ 5 การจัดฟันที่ไม่สมดุลจะทำให้เกิดข้อผิดพลาดดังนั้นอย่ากังวลเกี่ยวกับข้อผิดพลาดทางไวยากรณ์ 4 ข้ออื่น ๆSYNTAX ERROR
SYNTAX ERROR
SYNTAX ERROR

หากสลับบรรทัดที่ 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ต้องมารวมกัน; ทุกประเภทจะต้องเห็นด้วยและไม่มีทางที่จะแยกระหว่างพวกเขาและอื่น ๆ สิ่งนี้นำไปสู่การมีข้อผิดพลาดที่ไม่ร้ายแรงเป็นไปไม่ได้เกือบ ในความเป็นจริงการมีข้อผิดพลาดร้ายแรงขณะทำงานนั้นเกือบจะเป็นไปไม่ได้

โปรดทราบว่าหาก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.