Biais de distance de Levenshtein

10

Écrivez un programme dans un langage avec un nom Aqui, étant donné une chaîne S, génère le nom d'un autre langage de programmation B. La longueur de Bdoit être égale à la distance de Levenshtein (abréviation "LD") entre Aet S. Pour être considéré comme un langage de programmation, il Bfaut avoir une page esolangs ou une page Wikipedia.

Exemple:

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

Le LD entre Pythonet Jythonest un, donc la sortieR

Vous avez seulement besoin de couvrir jusqu'à un LD jusqu'à 12. Vous pouvez supposer qu'un LD de 0ne se produira jamais.

Il s'agit de , donc le programme le plus court en octets l'emporte.

(Ceci est mon premier défi! Les commentaires sont appréciés)


Classement

Seadrus
la source
Pourquoi 12? N'y a-t-il pas des langues avec des noms plus grands?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Il semblait juste mentir comme un supérieur raisonnable.
Seadrus
@ThomasKwa Je crois Rest un langage de programmation ... il aurait pu être facilement C, Detc.
Seadrus
1
alors, vous voulez dire un nom d'une longueur égale à la distance Levenshtein? Qu'est-ce qui compte comme langage de programmation? Doit-il avoir une page esolangs / Wikipedia?
lirtosiast
6
La LD de "Patton" et "Python" est 2, pas 3.
Leif Willerts

Réponses:

3

O, 107 octets

Utilisez la pointe de @histocrat pour simplifier le calcul de la distance. Langues également utilisées avec la même lettre de départ pour supprimer quelques caractères

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

Essayez-le ici

MickyT
la source
6

PHP, 137 135

Nécessite un rapport d'erreurs et PHP 5.4+. L'entrée est une variable 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;

Version lisible:

<?=explode(' ','R C# C++ Java Scala AutoIt ArnoldC TI-BASIC Bubblegum Javascript Mathematica ActionScript')[levenshtein(PHP,$_GET[a])-1];
DankMemes
la source
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]);}

Choisir une langue avec un nom à un caractère vous permet de tricher avec le calcul de la distance: la distance d'une chaîne par rapport à "C" est juste la longueur de la chaîne, moins une si elle inclut "C". J'imagine que R ou J pourrait battre cela en utilisant la même stratégie.

histocrate
la source
Comment se gets(&s)fait- il que ça ne plante pas?
anatolyg
Je ne suis pas sûr, cela fonctionne sur Anarchy Golf et ideone mais ce n'est clairement pas vraiment du cricket. J'imagine qu'il utilise la mémoire inutilisée allouée à ARGV.
histocrate
5

Perl 5, 325 276

Utiliser un peu de récursivité pour calculer la distance de 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]

Ma version originale avait quelques problèmes avec les entrées plus longues.
Jusqu'à ce que je réalise que la fonction de tri Perl trie par ordre alphabétique.

L'utilisation de sous-chaînes au lieu de tableaux se révèle un peu plus longue.

@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]

Tester

$ perl levenshtein.pl Php
C++
LukStorms
la source
3

J, 115 octets

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

Cela utilise l'astuce de calcul d'histocrate (en utilisant un langage à une lettre) et génère la liste de langues suivante:

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

par exemple:

   {&((}.&'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
la source