Objektif
Tulis rutin yang menerima string karakter ASCII yang dapat dicetak, s , dan mengembalikan string yang berisi karakter yang sama dengan s , disusun ulang sehingga tidak ada substring dua karakter yang muncul lebih dari satu kali. Program harus memproses semua string benchmark (lihat di bawah) masing-masing dalam waktu kurang dari satu menit pada komputer modern . Saya juga akan penghargaan bonus khusus dari 50 rep untuk jawaban skor terendah yang memproses setiap string yang 30-karakter yang valid di dalam satu menit.
Misalnya, dengan diberi input Mississippi
, output yang valid adalah issiMspiips
(tidak ada substring dua karakter yang muncul dua kali), sedangkan output yang tidak valid adalah ipMsispiiss
(karena substring is
muncul dua kali).
Rutin dapat berupa:
- pembacaan program lengkap dari
stdin
(atau setara) atau baris perintah, dan keluaran kestdout
(atau setara) - sebuah fungsi yang menerima argumen string tunggal dan mengembalikan string
Anda dapat mengasumsikan bahwa string input selalu mengakui setidaknya satu output yang valid.
Tantangan
Rutin Anda harus terdiri dari 5 atau lebih baris kode yang dipisahkan oleh baris baru. Baris kosong (yang termasuk baris yang hanya berisi spasi putih) diabaikan dalam semua konteks dan tidak dihitung terhadap jumlah baris total.
Mengganti dua baris dalam kode sumber Anda harus menghasilkan kesalahan fatal. Dengan "kesalahan fatal", kami merujuk ke salah satu kondisi berikut:
- kode sumber gagal dikompilasi, dengan kompiler / juru bahasa menyatakan kesalahan fatal
- aborsi rutin dengan kesalahan fatal runtime atau pengecualian runtime tidak tertangani
- rutin dipaksa menjadi penghentian tiba-tiba, program abnormal yang tidak menghasilkan output apa pun kecuali untuk pesan kesalahan yang mungkin dan / atau tumpukan dump
Atau , blok kode yang berdekatan yang tidak mengandung karakter baris baru dapat digunakan sebagai ganti baris. Blok-blok ini masing-masing harus ditampilkan pada baris mereka sendiri di file sumber, dengan pemahaman bahwa baris baru dihapus sebelum kode sumber dikompilasi / ditafsirkan.
Misalnya kodenya
aaaa
bbbb
cccc
akan mengembun
aaaabbbbcccc
sebelum dievaluasi.
Dalam mode ini, kondisi kesalahan fatal berlaku untuk menukar dua blok kode apa pun (dan dengan demikian untuk menukar baris dalam kode sumber sebelum baris baru dihapus). Oleh karena itu dalam contoh di atas rutinitas aaaaccccbbbb
, bbbbaaaacccc
dan ccccbbbbaaaa
semua harus menghasilkan kesalahan fatal, baik di compiletime atau runtime.
Pengajuan yang menggunakan mode alternatif ini harus menyatakan penggunaannya.
Mencetak gol
Biarkan n menjadi jumlah baris teks tidak kosong dalam file sumber Anda, dengan n ≥ 5. Biarkan c menjadi jumlah byte yang terdiri dari baris teks terpanjang (dengan panjang byte) dalam file sumber Anda, tidak termasuk baris baru yang tertinggal.
Skor pengajuan diberikan oleh c ( n + 10).
Pengajuan dengan skor terendah adalah pemenang.
Semoga berhasil. ;)
String Tolok Ukur
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
CooliO
, outputoOoCli
?Mspiisiipss
valid karena satu-satunya pengulanganii
yang tidak terjadiMississippi
?Jawaban:
PHP, skor = 289 (17 × (7 + 10))
Fungsi bawaan PHP membuatnya mudah untuk melakukan hal ini dengan buruk. Kode berikut hanya mengacak string hingga hasil yang valid diperoleh:
Tingkatan yang dicapai
Rata-rata dan waktu eksekusi maksimum dihitung menggunakan kode berikut:
Hasil:
* Saya mengubah
ä
untuka
menghindari masalah multi-byte† Ini adalah string 30-karakter tersulit yang dapat saya buat. Ini sebenarnya 30 karakter pertama dari urutan De Bruijn untuk k = 'abcdef' dan n = 2, dengan 'b' pertama dipindahkan untuk menghindari pertandingan instan.
sumber
Dyalog APL (11 (5 + 10) = 165)
Bukti:
⍵
terjadi di luar fungsi, yaitu aSYNTAX ERROR
.b
, sehingga tidak dapat ditukar dengan garis3
atau4
, yang bergantung padab
. Akan ada aVALUE ERROR
. (Dan itu jelas tidak bisa ditukar dengan1
atau5
salah.)c
, sehingga tidak dapat ditukar dengan jalur4
, yang tergantung padac
. (Dan kami sudah membuktikan tidak ada jalur lain yang bisa ditukar dengan garis3
.)sumber
APL (Dyalog), 6 (5 + 10) = 90
Saya menggunakan alternatif, jadi:
Ini adalah algoritma lama yang sama.
Penjelasan
2,/⍵
memberikan array pasangan karakter dalam string input+/∘.≡⍨
menghasilkan array numerik dari berapa pasangan yang masing-masing pasangan sama (termasuk dirinya sendiri)1∧.=
memeriksa apakah setiap elemen array itu sama dengan 1, dan logis DAN hasilnya bersamaan:⍵
Jika itu benar (1
), kembalikan string input∇⍵[?⍨⍴⍵]
lain mengacak string input dan melakukan panggilan rekursifBertukar
Jika saluran 1 bertukar dengan saluran 2, maka Anda akan berakhir dengan
+/∘.≡⍨{...}
kekacauan fungsi dan operator yang memberiSYNTAX ERROR
.Jika baris 1 bertukar dengan baris 3 atau 4, maka Anda memiliki di
⍵
luar definisi fungsi, dan itu aSYNTAX ERROR
.Jika baris 1 ditukar dengan baris 5, kawat gigi yang tidak seimbang sendiri akan menyebabkan
SYNTAX ERROR
, jadi jangan khawatir tentang 4 kesalahan sintaks lainnya.Jika baris 5 ditukar dengan baris 2/3/4, sekali lagi Anda memiliki di
⍵
luar definisi fungsi. (SYNTAX ERROR
)Jika jalur 2 ditukar dengan jalur 3, Anda berakhir dengan
1∧.=2,/⍵:⍵
. Sintaks ini disebut pelindung (anggap sebagai kondisional). Kondisi penjaga harus mengevaluasi ke0
atau1
atau array 1 elemen dari0
atau1
. Di sini, ia mengevaluasi sesuatu yang lebih kompleks dari itu (skalar yang mengandung array 2-elemen). Jadi ini aDOMAIN ERROR
.Jika baris 2 ditukar dengan baris 4, Anda mendapatkan pernyataan
1∧.=
, yang mencoba menerapkan fungsi∧.=
tanpa argumen kiri yang diperlukan. (SYNTAX ERROR
).Jika saluran 3 bertukar dengan saluran 4, sekali lagi Anda mendapatkan banyak fungsi dan operator (
1∧.=+/∘.≡⍨
) sehingga Anda dapatSYNTAX ERROR
.Benchmark
(angka dalam milidetik)
Saya masih berpikir tentang perpecahan yang berbeda. Saya juga memiliki cara yang deterministik dan sistematis untuk melakukan tugas itu. Saya tidak bisa membuatnya menjadi sebuah algoritma (menghilangkan bagian kreatif dari "membuat angka-angka yang benar") dan tidak dapat memastikan itu berfungsi setiap saat.
sumber
Haskell, 129 = 3x (33 + 10)
ini menggunakan mode alternatif.
atau dalam bentuk yang dapat dibaca:
Haskell adalah bahasa yang sangat ketat. misalnya,
import
harus didahulukan; definisis
harus bersatu; semua tipe harus setuju dan tidak ada cara untuk memilih di antara mereka, dan sebagainya. ini menyebabkan kesalahan tidak fatal hampir tidak mungkin terjadi. pada kenyataannya, memiliki kesalahan fatal runtime terlalu hampir mustahil.perhatikan bahwa jika
g
fungsi yang valid tetapi memiliki jenis yang salah (semua jenis berbeda maka[a]->[a]
atauString -> String
dan sejenisnya) daripada ini adalah kesalahan fatal karena tidak mungkin untuk menerapkang
pada input.output:
sumber