Viés de distância de Levenshtein

10

Escreva um programa em uma linguagem com nome Aque, dada uma string S, produz o nome de uma linguagem de programação diferente B. O comprimento de Bdeve ser igual à distância de Levenshtein (abrev. "LD") entre Ae S. Para ser considerada uma linguagem de programação, Bdeve ter uma página esolangs ou uma página da Wikipedia.

Exemplo:

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

O LD entre Pythone Jythoné um, então a saídaR

Você só precisa cobrir até um LD de até 12. Você pode assumir que um LD de 0nunca ocorrerá.

Isso é , então o programa mais curto em bytes vence.

(Este é o meu primeiro desafio! O feedback é apreciado)


Entre os melhores

Seadrus
fonte
Por que 12? Não há idiomas com nomes maiores?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Parecia apenas um argumento razoável.
Seadrus 29/09/2015
@ThomasKwa Eu acredito que Ré uma linguagem de programação ... poderia ter sido facilmente C, Detc.
Seadrus
11
então, você quer dizer um nome com um comprimento igual à distância de Levenshtein? O que conta como uma linguagem de programação? Ele deve ter uma página esolangs / Wikipedia?
Lirtosiast
6
O LD de "Patton" e "Python" é 2, não 3.
Leif Willerts

Respostas:

3

O, 107 bytes

Usando a dica de @histocrat para simplificar o cálculo da distância. Idiomas também usados ​​com a mesma letra inicial para remover alguns caracteres

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

Experimente aqui

MickyT
fonte
6

PHP, 137 135

Requer relatório de erros desativado e PHP 5.4+. A entrada é variável 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;

Versão legível:

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

Escolher um idioma com o nome de um caractere permite trapacear com o cálculo da distância: a distância de qualquer string de "C" é apenas o comprimento da string, menos um se incluir "C". Eu imagino que R ou J poderiam superar isso usando a mesma estratégia.

histocrata
fonte
Como é gets(&s)que não bate?
Anatolyg
Não tenho certeza, ele funciona no Anarchy Golf e no ideone, mas claramente não é realmente o críquete. Eu imagino que ele esteja usando a memória não utilizada alocada para ARGV.
histocrat
5

Perl 5, 325 276

Usando um pouco de recursão para calcular a distância 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]

Minha versão original teve alguns problemas com as entradas mais longas.
Até eu perceber que a função de classificação Perl é classificada em ordem alfabética.

Usar substrings em vez de matrizes acaba por torná-lo um pouco mais longo.

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

Teste

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

J, 115 bytes

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

Isso está usando o truque de cálculo do histocrat (usando um idioma de 1 letra) e gera a seguinte lista de idiomas:

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

por exemplo:

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