Bias jarak Levenshtein

10

Tulis sebuah program dalam bahasa dengan nama Ayang, diberi string S, menampilkan nama bahasa pemrograman yang berbeda B. Panjang Bharus sama dengan jarak Levenshtein (abbr. "LD") antara Adan S. Untuk dianggap sebagai bahasa pemrograman, Bharus memiliki halaman esolangs atau halaman Wikipedia.

Contoh:

(Suppose the program is coded in Python)
Input: Jython
Output: R
Input: Pyt4oq
Output: Go
Input: Rs7hon
Output: C++

LD antara Pythondan Jythonsatu, jadi hasilnyaR

Anda hanya perlu menutup-nutupi hingga LD hingga 12. Anda dapat mengasumsikan bahwa LD 0tidak akan pernah terjadi.

Ini adalah , jadi program terpendek dalam byte menang.

(Ini adalah tantangan pertama saya! Umpan balik dihargai)


Papan peringkat

Seadrus
sumber
Mengapa 12? Apakah tidak ada bahasa dengan nama yang lebih besar?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sepertinya hanya sebuah alasan yang masuk akal.
Seadrus
@ThomasKwa saya percaya Radalah bahasa pemrograman ... itu bisa dengan mudah telah C, D, dll
Seadrus
1
jadi, maksudmu nama dengan panjang sama dengan jarak Levenshtein? Apa yang dianggap sebagai bahasa pemrograman? Haruskah ada halaman esolang / Wikipedia?
lirtosiast
6
LD dari "Patton" dan "Python" adalah 2, bukan 3.
Leif Willerts

Jawaban:

3

O, 107 byte

Menggunakan tip dari @ histokrat untuk membuat perhitungan jarak lebih sederhana. Bahasa yang juga digunakan dengan huruf awal yang sama untuk menghapus beberapa karakter

"pyrodecimal""hakespeare""tackstack""nowflake""nowball""nowman""onata""ADOL""taq""oT""R"""ie\'O<-1-{;}d'Soo

Coba di sini

MickyT
sumber
6

PHP, 137 135

Membutuhkan pelaporan kesalahan dan PHP 5.4+. Input adalah variabel GET a.

<?=explode(~ß,~­ß¼Üß¼ÔÔßµž‰žß¬œž“žß¾Š‹¶‹ß¾‘“›¼ß«¶Ò½¾¬¶¼ß½Š“š˜Š’ßµž‰žŒœ–‹ß²ž‹—š’ž‹–œžß¾œ‹–‘¬œ–‹)[levenshtein(PHP,$_GET[a])-1];

Hexdump:

00000000: 3C 3F 3D 65 78 70 6C 6F - 64 65 28 7E DF 2C 7E AD |<?=explode(~ ,~ |
00000010: DF BC DC DF BC D4 D4 DF - B5 9E 89 9E DF AC 9C 9E |                |
00000020: 93 9E DF BE 8A 8B 90 B6 - 8B DF BE 8D 91 90 93 9B |                |
00000030: BC DF AB B6 D2 BD BE AC - B6 BC DF BD 8A 9D 9D 93 |                |
00000040: 9A 98 8A 92 DF B5 9E 89 - 9E 8C 9C 8D 96 8F 8B DF |                |
00000050: B2 9E 8B 97 9A 92 9E 8B - 96 9C 9E DF BE 9C 8B 96 |                |
00000060: 90 91 AC 9C 8D 96 8F 8B - 29 5B 6C 65 76 65 6E 73 |        )[levens|
00000070: 68 74 65 69 6E 28 50 48 - 50 2C 24 5F 47 45 54 5B |htein(PHP,$_GET[|
00000080: 61 5D 29 2D 31 5D 3B    -                         |a])-1];|
00000087;

Versi yang dapat dibaca:

<?=explode(' ','R C# C++ Java Scala AutoIt ArnoldC TI-BASIC Bubblegum Javascript Mathematica ActionScript')[levenshtein(PHP,$_GET[a])-1];
DankMemes
sumber
6

C, 183

main(s){char* a[12]={"R","C#","C++","Java","COBOL","Python","Clipper","VBScript","Smalltalk","Javascript","Mathematica","ActionScript"};printf(a[strlen(gets(&s))-!!strchr(&s,67)-1]);}

Memilih bahasa dengan nama satu karakter memungkinkan Anda menipu dengan perhitungan jarak: jarak string apa pun dari "C" hanyalah panjang string, minus satu jika itu termasuk "C". Saya membayangkan R atau J bisa mengalahkan ini menggunakan strategi yang sama.

histokrat
sumber
Kenapa gets(&s)tidak crash?
anatolyg
Saya tidak yakin, ini berfungsi pada Anarchy Golf dan ideone tetapi jelas bukan benar-benar kriket. Saya membayangkan itu menggunakan memori yang tidak digunakan yang dialokasikan untuk ARGV.
histokrat
5

Perl 5, 325 276

Menggunakan sedikit rekursi untuk menghitung jarak Levenshtein.

@X=(P,e,r,l);$y=@Y=split//,pop;sub L{my($n,$m)=@_;return$m,if!$n;return$n,if!$m;my$c=$X[$n]eq$Y[$m]?0:1;(sort{$a<=>$b}(L($m-1,$n)+1,L($m,$n-1)+1,L($m-1,$n-1)+$c))[0]}print qw(C C# C++ Java COBOL Python Clipper VBScript Smalltalk Javascript Mathematica ActionScript)[L(4,$y)-1]

Versi asli saya mengalami beberapa masalah dengan input yang lebih panjang.
Sampai saya menyadari bahwa fungsi semacam Perl agak abjad.

Menggunakan substring bukannya array ternyata membuatnya sedikit lebih lama.

@L=qw(C C# C++ Java COBOL Python Clipper VBScript Smalltalk Javascript Mathematica ActionScript);sub l{my($s,$t)=@_;return length($t)if!$s;return length($s)if!$t;my($u,$v)=(substr($s,1),substr($t,1));substr($s,0,1)eq substr($t,0,1)?l($u,$v):(sort{$a<=>$b}(l($u,$v),l($s,$v),l($u,$t)))[0]+1}print$L[l('Perl',pop)-1]

Uji

$ perl levenshtein.pl Php
C++
LukStorms
sumber
3

J, 115 byte

{&((}.&'YABC'&.>|.i.4),(g'SMITHb'),'Clojure';(g'ComeFrom2'),((g=:}:;])'StackStacks'),<'CoffeeScript')@<:@(#-'J'&e.)

Ini menggunakan trik perhitungan histokrat (menggunakan bahasa 1 huruf), dan menghasilkan daftar bahasa berikut:

┌─┬──┬───┬────┬─────┬──────┬───────┬────────┬─────────┬──────────┬───────────┬────────────┐
│C│BC│ABC│YABC│SMITH│SMITHb│Clojure│ComeFrom│ComeFrom2│StackStack│StackStacks│CoffeeScript│
└─┴──┴───┴────┴─────┴──────┴───────┴────────┴─────────┴──────────┴───────────┴────────────┘

misalnya:

   {&((}.&'YABC'&.>|.i.4),(g'SMITHb'),'Clojure';(g'ComeFrom2'),((g=:}:;])'StackStacks'),<'CoffeeScript')@<:@(#-'J'&e.) 'C++'
┌───┐
│ABC│
└───┘
   {&((}.&'YABC'&.>|.i.4),(g'SMITHb'),'Clojure';(g'ComeFrom2'),((g=:}:;])'StackStacks'),<'CoffeeScript')@<:@(#-'J'&e.) 'ActionScript'
┌────────────┐
│CoffeeScript│
└────────────┘
   f=:{&((}.&'YABC'&.>|.i.4),(g'SMITHb'),'Clojure';(g'ComeFrom2'),((g=:}:;])'StackStacks'),<'CoffeeScript')@<:@(#-'J'&e.)
   f 'Jython'
┌─────┐
│SMITH│
└─────┘
   f 'Python'
┌──────┐
│SMITHb│
└──────┘
marinus
sumber