Zorluğa yakın kod: Başlangıç


15

Bu, bu sorunun bir devamıdır: Meydan okumaya yakın kod: Tamsayıların toplamı

Bu meydan okuma biraz daha zor ve aynı zamanda serin bir başlık yapar (Bu yüzden onu seçtim):

İki dize arasındaki Levenshtein mesafesini hesaplayın

Son zorluk gibi, bu zorluktaki puanınız da kodunuz ve yukarıdaki alıntı arasındaki Levenshtein mesafesidir .

Şimdi detaylar için!

Programınız, her ikisi de sondaki boşluk veya satırsonu olmayan 2 giriş alır ve aralarındaki Levenshtein mesafesini çıkarır. Levenshtien mesafesi, bir dizeyi diğerine dönüştürmek için gereken ekleme, silme ve ikame sayısı olarak tanımlanır. Nasıl hesaplanacağı hakkında daha fazla bilgi için, yukarıda bağlantı verilen Wikipedia sayfasına bakın. Programınızın çalışıp çalışmadığını test etmek için bu hesap makinesini kullanın . Programınız iki dize arasındaki Levenshtein mesafesinden başka bir şey çıkarmamalıdır. Başka bir şey çıkarılırsa diskalifiye edilecektir. Örnek G / Ç:

Inputs:
test
test2
Output:
1

Inputs:
222
515
Output:
3

Inputs:
Test
test
Output:
1

Kodunuzda hiç işlem veya yorum olmayabilir.

Yanıtlar:


9

Frink , mesafe 24

Calculate[the,Levenshtein]:=editDistance[the,Levenshtein]

Bunu kullanmak için, iki dizeyle Hesapla'yı çağırırsınız ve bu geri döndüğünden, çağrıyı da çevrelemeniz gerekir print[]. Buna izin verilmiyorsa puanım 30.

Misal:

Calculate["kitten","spork"]        -> returns 6
print[Calculate["kitten","spork"]] -> prints 6.

Web yorumlayıcısı işlevlerin tanımlanmasına izin vermediğinden Frink'i indirmeniz gerekir. Bir Java uygulaması olduğu düşünüldüğünde tüm sistemlerde çalışmalıdır. Talimatları buradan indirin . .


Pşşt. Hey! İşte üzerinde çalışıyorum Sembolik bir şey, bir Levenshtein uygulama görebilirsiniz: k=λ:Δ(ί,ί).


3
İlginç bir dil, bana Mathematica'yı hatırlatıyor.
Alex

Bu, standart bir boşluk olarak kabul edilebilecek (ancak bu zorluğa verilen tüm cevapların 90℅'si gibi görünmektedir)
John Dvorak

1
@JanDvorak Yerleşikler gri bir alandır, çünkü standart bir boşluk olarak yerleşik meta cevap listesindeki oy dağılımı yarı yarıya yakındır.
Alex

5

R, mesafe 35

Calculate=function(the,Levenshtein)adist(between<-the,two<-Levenshtein)

Bu işlevi oluşturur Calculateparametrelerle theve Levenshtein. adistMesafeyi hesaplamak için R yerleşik işlevini kullanır . Dize parametreleri adistesas olan theve Levenshteinyeniden adlandırılır betweenve two.


5

PHP4.1, mesafe 32 22 15 14

Çok basit bir şey, heyecan verici bir şey yok.

<?=$Calculate_the=Levenshtein($distance,$between_two_strings);

Veya daha kısa bir versiyon:

<?=$ulatethe=Levenshtein($istance,$etweentwostrin);

Bunun çalışması için aşağıdaki tuşları kullanarak bir POST / GET / COOKIE / oturum değişkeni göndermeniz / ayarlamanız gerekir:

  • distance( istancedaha kısa olanlar için)
  • between_two_strings( etweentwostrindaha kısa olanlar için)

Argümanlar bu sırada.

Skoru http://ideone.com/QzNZ8T adresinde test edin

Misal:

http://localhost/distance.php?distance=string1&between_two_strings=string2

@AboveFire Üzgünüz, ancak düzenlemenizi kabul edemiyorum. OP: "Your code may not have no-ops or comments."ve düzenlemenizi alıntılamak bir HTML yorumu ekledi.
Ismael Miguel

2

PHP, mesafe 44

function Calculate($two,$strings){echo levenshtein($two,$strings);}

levenshteinPHP standart kitaplığındaki yerleşik işlevi kullanın ve mesafeyi en aza indirgemek için argümanları adlandırın.


1
Olmamalı mı $two,$strings?
Ismael Miguel

gerçekten de öyle.
帰 回 帰

1
Ayrıca, eksik;
Ismael Miguel

Size 28 mesafeli bir çözüm öneriyorum:echo$Calculate_the=levenshtein($_GET[distance_between_two],$_GET[strings]);
Ismael Miguel

2

Pip, mesafe 50

Yerleşik Levenshtein işlevi kullanmaz!

xINg?#JgMN[1+(fac:b@>1)1+(fe:a@>1b)(a@0NEb@0)+(fec)]

Bu kod , özyinelemeli Levenshtein algoritmasını uygular ; Bu nedenle, son derece yavaş, hatta uzunluk 5 dizeleri için birkaç saniye sürüyor. Bunu kontrol etmek için programı kendi kendine çalıştırmanızı tavsiye etmem!

İşte boşluk ve yorumlarla birlikte temel kodum:

; Note: a Pip program is an implicit function f, which is called with the command-line
; arguments. The args are stored in the list g, as well as being assigned to the local
; variables a-e.

; Is one of the args the empty string? (NB x is initialized to "")
x IN g ?
 ; If so, join args together and take the length (i.e., length of the non-empty string).
 # J g
 ; If not, take the min of the following:
 MN [
  ; Recursively call f with the first character of a removed; add 1 to the result
  (f a@>1 b) + 1
  ; Recursively call f with the first character of b removed; add 1 to the result
  (f a b@>1) + 1
  ; Recursively call f with the first characters of both removed; iff the two characters
  ; were not equal, add 1 to the result
  (f a@>1 b@>1) + (a@0 NE b@0)
 ]

Son versiyondaki ana değişiklik, geçici değişkenlere bazı değerler atamaktır cve ebunlar meydan okuma dizesinde görünür ve böylece Levenshtein mesafesini biraz azaltır.

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.