Önemli Hata Sorunu


20

Amaç

, Yazdırılabilir ASCII karakter dizesi kabul eden bir rutin yaz s ve aynı karakterleri içeren bir dize döndürür s hiçbir iki karakterli bir kereden fazla görünür alt dize böylece yeniden sıralanmış. Program, tüm kıyaslama dizelerini (aşağıya bakınız) modern bir bilgisayarda bir dakikadan kısa bir sürede işlemek zorundadır . Ayrıca , herhangi bir geçerli 30 karakterli dizeyi bir dakikadan kısa sürede işleyen en düşük puanlama cevabına 50 rep özel bir bonus vereceğim .

Örneğin, girdi verilmiş Mississippi, geçerli bir çıkış olacağını issiMspiipsgeçersiz çıktı yapılmamakla birlikte, (hiçbir iki karakterlik altdizgelerin iki kez görünür) ipMsispiiss(alt dize beri isiki kez görünür).

Rutin şu şekilde olabilir:

  • stdin(veya eşdeğeri) veya komut satırından tam bir program okuması ve stdout(veya eşdeğeri)
  • tek bir dize bağımsız değişkenini kabul eden ve bir dize döndüren işlev

Giriş dizesinin her zaman en az bir geçerli çıktı kabul ettiğini varsayabilirsiniz.

Meydan okuma

Rutininiz, yeni satırlarla ayrılmış 5 veya daha fazla kod satırı içermelidir. Boş satırlar (yalnızca boşluk içeren satırları içerir) tüm bağlamlarda yok sayılır ve toplam satır sayısına dahil edilmez.

Kaynak kodunuzdaki iki satırı değiştirmek, önemli bir hataya neden olmalıdır . "Ölümcül hata" ile, aşağıdaki koşullardan herhangi birine atıfta bulunuruz:

  • kaynak kodu derlenemez, derleyici / yorumlayıcı önemli bir hata bildirir
  • rutin bir çalışma zamanı ölümcül hatası veya işlenmemiş çalışma zamanı istisnasıyla iptal edilir
  • rutin, olası bir hata mesajı ve / veya yığın dökümü dışında herhangi bir çıktı üretmeyen ani, anormal bir program sonlandırmaya zorlanır

Alternatif olarak , satır yerine yeni satır karakteri içermeyen bitişik kod blokları kullanılabilir. Bu blokların her biri, kaynak kod derlenmeden / yorumlanmadan önce yeni satırların çıkarıldığı anlayışıyla kaynak dosyada kendi satırında görüntülenmelidir.

Örneğin, kod

aaaa
bbbb
cccc

yoğunlaşacak

aaaabbbbcccc

değerlendirilmeden önce.

Bu modda, ölümcül hata durumu herhangi iki kod bloğunun değiştirilmesi (ve böylece yeni satırlar çıkarılmadan önce kaynak kodundaki satırların değiştirilmesi) için geçerlidir. Bu nedenle, yukarıdaki örnekte rutinler aaaaccccbbbb, bbbbaaaaccccve ccccbbbbaaaamutlaka bütün üretmek önemli hatalar, ya compiletime veya zamanında.

Bu alternatif modu kullanan gönderilerin kullanımı bildirilmelidir.

puanlama

Let , n ile kaynak dosyası boş olmayan textlines sayısı olduğu , n ≥ 5. Let c içerdiği bayt sayısı, en uzun TextLine sonda yeni satır sayım kaynak dosya (bayt uzunluğu).

Bir sunumun puanı c ( n + 10) ile verilir.

En düşük puana sahip başvuru kazanır.

İyi şanslar. ;)

Karşılaştırma Dizeleri

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

Büyük harfler küçük harflerden farklı mıdır? yani Giriş CooliO, çıkış oOoCli?
FryAmTheEggman

@FryAmTheEggman: Evet. Büyük harfler küçük harflerden farklıdır. Genel olarak, yalnızca karakterlerin ASCII kod değerlerini göz önünde bulundurun.
COTO

Tekrarlar girişte görünen harf çiftleriyle sınırlanıyor mu? Örneğin Mspiisiipsstek tekrarlama iigerçekleşmediği için geçerlidir Mississippimi?
TwiNight

@TwiNight: Orijinal dizede görünmeyen tekrarlanan alt dizelere bile izin verilmez.
COTO

Giriş uzunluğu hakkında herhangi bir şey varsayabilir miyim? (arka plan: bir BF çözümü için mükemmel bir fikrim var)
PurkkaKoodari

Yanıtlar:


6

PHP, puan = 289 (17 × (7 + 10))

PHP'nin yerleşik işlevleri bunu kötü bir şekilde yapmayı kolaylaştırır. Aşağıdaki kod, geçerli bir sonuç elde edilene kadar dizeyi karıştırır:

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

Deneyler

Aşağıdaki kod kullanılarak hesaplanan ortalama ve maksimum yürütme süreleri:

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

Sonuçlar:

  • Mississippi: Ortalama: 0.0002460 sn; Maks: 0.0005491 saniye
  • Meşrutiyetsizlik: Ortalama: 0.0001470 sn; Maks: 0.0002971 saniye
  • Pneumonoultramicroscopicsilicovolcanoconiosis: Ort: 0.0587177 sn; Maks: 0.1668079 saniye
  • Donaudampfschiffahrtselektrizitatenhauptbetriebswerkbauunterbeamtengesellschaft * : Ort: 9.5642390 saniye; Maks: 34.9904099 saniye
  • baaacadaeafbbcbdbebfccdcecfdde : Ort: 5.0858626 saniye; Maks: 9.8927171 saniye

* Çok baytlı sorunları önlemek äiçin değiştirdim a
† Bu, gelebileceğim en zor 30 karakterli dizedir. Aslında k = 'abcdef' ve n = 2 için De Bruijn dizisinin ilk 30 karakteri , ilk 'b' anlık bir eşleşmeyi önlemek için taşındı.


5
Bu gerçekten tatmin edici değil > Program, modern bir bilgisayarda herhangi bir geçerli 30 karakterli dizeyi bir dakikadan kısa sürede işlemelidir. , potansiyel olarak sonsuz çalışma süresini göz önünde bulundurarak.
Bob

@Bob Cevaba bazı kıstaslar ekledim. Kod verimsiz olabilir, ancak 30 karakterlik bir dizeyi işlemek için bir dakikadan fazla zaman alma olasılığı bence çok küçüktür.
gıcırtılı ossifrage

5

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

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

Kanıt:

  • 1. ve 5. satırlar işlevi sınırlar. Bunlar için herhangi bir satırın değiştirilmesi , bir fonksiyonun dışında meydana gelmesine neden olur SYNTAX ERROR.
  • Satır 2 tanımlar b, böylece satırlar için değiştirilemez 3veya buna 4bağlı olarak değişir b. Bir olurdu VALUE ERROR. (Ve açıkça 1ya 5da ikisiyle değiştirilemez .)
  • Satır 3 tanımlar c, bu nedenle 4bağlı olan satır için değiştirilemez c. (Ve zaten başka hiçbir hattın hatla değiştirilemeyeceğini kanıtladık 3.)
  • Satır 4, satır 2 ve 3'teki değişkenlere bağlıdır ve bu nedenle son olmalıdır.

3
+1. Ama hepsi ne demek ??
squeamish ossifrage

4

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

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

Alternatifi kullanıyorum, yani:

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

Bu aynı eski algoritma.


Açıklama
2,/⍵ , giriş dizesindeki
+/∘.≡⍨bir karakter çiftleri dizisi verir , her bir çiftin kaç çiftin eşit olduğunu (kendisi de dahil)
1∧.=, bu dizinin her öğesinin 1'e eşit olup olmadığını ve mantıksal VE sonuçları birlikte kontrol ettiğinden oluşan sayısal bir dizi oluşturur

:⍵Bu true ( 1) ise, giriş dizesini döndür

∇⍵[?⍨⍴⍵] yoksa giriş dizesini karıştırın ve yinelemeli çağrı yapın


Değişim

Satır 1, satır 2 ile değiştirilirse, sonuçta +/∘.≡⍨{...}sadece işlevler ve işleçlerin karmaşası olur SYNTAX ERROR.
Satır 1, satır 3 veya 4 ile değiştirilirse , bir işlev tanımının dışındasınız demektir ve bu bir SYNTAX ERROR.
Satır 1, satır 5 ile değiştirilirse, dengesiz ayraçlar tek başına neden olur SYNTAX ERROR, bu nedenle diğer 4 sözdizimi hataları hakkında endişelenmeyin.

5. satır 2/3/4 satırıyla değiştirilirse, yine bir işlev tanımının dışındasınız demektir . ( SYNTAX ERROR)

Satır 2, satır 3 ile değiştirilirse, son olarak 1∧.=2,/⍵:⍵. Bu sözdizimine bekçi denir (koşullu olarak düşünün). Koruma durumu için değerlendirilmelidir 0veya 1veya bir 1-öğeli bir dizi 0ya da 1. Burada, bundan daha karmaşık bir şeyi değerlendirir (2 elemanlı bir dizi içeren bir skaler). Yani bu bir DOMAIN ERROR.
Satır 2, satır 4 ile değiştirilirse 1∧.=, işlevi ∧.=gerekli sol bağımsız değişken olmadan uygulamaya çalışan deyimi alırsınız . ( SYNTAX ERROR).

Satır 3, satır 4 ile değiştirilirse, yine işlevler ve işleçler ( 1∧.=+/∘.≡⍨) karışıklığı elde edersiniz SYNTAX ERROR.


Deneyler
(milisaniye cinsinden sayılar)

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

Hala farklı bölümler düşünüyorum. Ayrıca bu görevi yerine getirmede deterministik, sistematik bir yolum var. Bunu bir algoritmaya dönüştüremiyorum ("sayıları doğru yapmak" ın yaratıcı kısmını alıyorum) ve her seferinde çalıştığından emin olamıyorum.


0

Haskell, 129 = 3x (33 + 10)

bu alternatif modu kullanır.

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

veya okunabilir bir biçimde:

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 çok katı bir dildir. örneğin, önce importgelmelidir; tanımları bir saraya gelmelidir; tüm türler aynı fikirde olmalıdır ve aralarında döküm yapmanın bir yolu yoktur. bu ölümcül olmayan bir hataya neden olur. aslında, bir çalışma zamanı ölümcül hataya sahip olmak neredeyse imkansızdır.

Not ki eğer ggeçerli bir fonksiyondur ancak (sonra herhangi bir türü farklı bir türü yanlış vardır [a]->[a]ya String -> Stringda uygulamak mümkün olmadığından bu bir hatadır daha ve benzeri) ggirişlerine.

çıktılar:

Abracadabar Alaazcma
Is Miss. iMsiasusgsa sMniig?s
Ask Alasak's lAaankss
GGAGTGCAATACTTCCggagtaacttcc
A Man AP la nAC  aalnnaPama
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.