Levenshtein Distanz Bias

10

Schreiben Sie ein Programm in einer Sprache mit einem Namen A, der anhand einer Zeichenfolge Sden Namen einer anderen Programmiersprache ausgibt B. Die Länge von Bmuss gleich dem Levenshtein-Abstand (Abk. "LD") zwischen Aund sein S. Um als Programmiersprache zu gelten, Bmuss eine Esolangs-Seite oder eine Wikipedia-Seite vorhanden sein.

Beispiel:

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

Die LD zwischen Pythonund Jythonist eins, also die AusgabeR

Sie müssen nur bis zu einer LD von bis zu abdecken 12. Sie können davon ausgehen, dass eine LD von 0niemals auftreten wird.

Dies ist , also gewinnt das kürzeste Programm in Bytes.

(Dies ist meine erste Herausforderung! Feedback wird geschätzt)


Bestenliste

Seadrus
quelle
Warum 12? Gibt es nicht Sprachen mit größeren Namen?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Es schien nur ein vernünftiger Vorteil zu sein.
Seadrus
@ThomasKwa Ich glaube , Rist eine Programmiersprache , ... könnte es leicht gewesen sein C, Dusw.
Seadrus
1
Sie meinen also einen Namen mit einer Länge , die der Levenshtein-Entfernung entspricht? Was zählt als Programmiersprache? Muss es eine Esolangs / Wikipedia-Seite haben?
Lirtosiast
6
Die LD von "Patton" und "Python" ist 2, nicht 3.
Leif Willerts

Antworten:

3

O, 107 Bytes

Verwenden Sie den Tipp von @histocrat, um die Entfernungsberechnung zu vereinfachen. Verwendete auch Sprachen mit demselben Startbuchstaben, um einige Zeichen zu entfernen

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

Probieren Sie es hier aus

MickyT
quelle
6

PHP, 137 135

Erfordert Fehlerberichterstattung und PHP 5.4+. Die Eingabe ist die 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;

Lesbare Version:

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

Wenn Sie eine Sprache mit einem Namen aus einem Zeichen auswählen, können Sie mit der Entfernungsberechnung schummeln: Die Entfernung einer Zeichenfolge von "C" entspricht nur der Länge der Zeichenfolge, minus eins, wenn sie "C" enthält. Ich kann mir vorstellen, dass R oder J dies mit derselben Strategie schlagen könnten.

Histokrat
quelle
Wie kommt gets(&s)es, dass es nicht abstürzt?
Anatolyg
Ich bin nicht sicher, es funktioniert auf Anarchy Golf und Ideone, aber es ist eindeutig nicht wirklich Cricket. Ich stelle mir vor, es verwendet den nicht verwendeten Speicher, der für ARGV zugewiesen ist.
Histokrat
5

Perl 5, 325 276

Verwenden Sie ein wenig Rekursion, um die Levenshtein-Entfernung zu berechnen.

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

Meine ursprüngliche Version hatte einige Probleme mit den längeren Eingaben.
Bis mir klar wurde, dass die Perl-Sortierfunktion alphabetisch sortiert ist.

Die Verwendung von Teilzeichenfolgen anstelle von Arrays führt zu einer längeren Verlängerung.

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

Prüfung

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

J, 115 Bytes

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

Dies verwendet den Berechnungstrick des Histokraten (unter Verwendung einer 1-Buchstaben-Sprache) und generiert die folgende Liste von Sprachen:

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

z.B:

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