Sesgo de distancia de Levenshtein

10

Escriba un programa en un lenguaje con un nombre Aque, dada una cadena S, muestre el nombre de un lenguaje de programación diferente B. La longitud de Bdebe ser igual a la distancia de Levenshtein (abreviatura "LD") entre Ay S. Para ser considerado un lenguaje de programación, Bdebe tener una página de esolangs o una página de Wikipedia.

Ejemplo:

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

El LD entre Pythony Jythones uno, por lo que la salidaR

Solo necesita cubrir hasta un LD de hasta 12. Puede suponer que 0nunca se producirá un LD de .

Este es el , por lo que gana el programa más corto en bytes.

(¡Este es mi primer desafío! Se agradecen los comentarios)


Tabla de clasificación

Seadrus
fuente
¿Por qué 12? ¿No hay idiomas con nombres más grandes?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Simplemente parecía una banda superior razonable.
Seadrus
@ThomasKwa creo que Res un lenguaje de programación ... que podría haber sido fácilmente C, Detc.
Seadrus
1
entonces, ¿te refieres a un nombre con una longitud igual a la distancia de Levenshtein? ¿Qué cuenta como lenguaje de programación? ¿Debe tener una página de esolangs / Wikipedia?
lirtosiast
66
El LD de "Patton" y "Python" es 2, no 3.
Leif Willerts

Respuestas:

3

O, 107 bytes

Usando la sugerencia de @histocrat para simplificar el cálculo de la distancia. También se utilizan idiomas con la misma letra inicial para eliminar algunos caracteres.

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

Pruébalo aquí

MickyT
fuente
6

PHP 137 137

Requiere un informe de error y PHP 5.4+. La entrada es GET variable 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ón legible:

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

Elegir un idioma con un nombre de un carácter te permite hacer trampa con el cálculo de la distancia: la distancia de cualquier cadena desde "C" es solo la longitud de la cadena, menos uno si incluye "C". Me imagino que R o J podrían superar esto usando la misma estrategia.

histocrat
fuente
¿Cómo gets(&s)es que no se estrella?
anatolyg
No estoy seguro, funciona en Anarchy Golf e ideone, pero claramente no es realmente cricket. Me imagino que está usando la memoria no utilizada asignada para ARGV.
histocrat
5

Perl 5, 325 276

Usando un poco de recursión para calcular la distancia 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]

Mi versión original tenía algunos problemas con las entradas más largas.
Hasta que me di cuenta de que la función de ordenación de Perl se ordena alfabéticamente.

El uso de subcadenas en lugar de matrices resulta que es un poco más largo.

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

Prueba

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

J, 115 bytes

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

Esto está usando el truco de cálculo de histocrat (usando un lenguaje de 1 letra) y genera la siguiente lista de idiomas:

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

p.ej:

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