Errate die Sprache


23

Einführung

Diese Seite baut schnell einen riesigen Datensatz von Code-Schnipsel auf, also lasst uns etwas damit anfangen!

Hier ist eine Datendatei . Es enthält 9.066 eindeutige Sprach- und Snippet-Paare für 113 Sprachen, die alle von dieser Site stammen. Das Format ist durch Tabulatoren getrennt (Language-TAB-Snippet), wobei alle Zeilenumbrüche in den Snippets durch <LF>und alle Tabulatoren durch 4 Leerzeichen ersetzt werden. Es gibt mindestens 5 Ausschnitte für jede Sprache.

[Update: Ich habe eine kleine Änderung an der Datendatei vorgenommen, um einige Python- und RegExp-Versionen zusammenzuführen, die ich zuvor verpasst habe - der obige Link wurde aktualisiert]

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die ein Codefragment nimmt und die Sprache ausgibt, in der es geschrieben ist (Einzelheiten siehe unten). Die Gesamtgröße Ihrer Quelle + aller benötigten Daten darf maximal 300 Byte betragen, und Ihr Programm muss die richtige Sprache ausgeben, wenn es einen eigenen Quellcode erhält. Höchste Genauigkeit (richtigste Antworten auf den obigen Datensatz) gewinnt.

Regeln

  • Die Gesamtgröße Ihres Quellcodes, Ihrer Ressourcen und aller erforderlichen Kompilierungs- / Laufzeitflags darf 300 Byte nicht überschreiten.
  • Ihre Antwort wird anhand des obigen Datensatzes getestet. Es wird einer der "Snippet" -Werte als Eingabe zugewiesen und seine Ausgabe wird mit der "korrekten" Ausgabe gemäß der Datenmenge verglichen. Dies wird für alle Einträge im Datensatz wiederholt und die endgültige Anzahl der richtigen Antworten ist Ihre Punktzahl.
  • Sie können die Eingabecodierung auswählen - ich gehe von UTF-8 aus. Wenn Sie also eine andere Codierung benötigen, geben Sie diese in Ihrer Antwort an.
  • Sie müssen den <LF>Ersatz nicht für Zeilenumbrüche verwenden. Wenn Ihr Eintrag erwartet, dass Zeilenumbrüche als wörtliche Zeilenumbrüche (Zeichen 10) empfangen werden, geben Sie dies in Ihrer Antwort an.
  • Ihr Eintrag muss die Sprache ausgeben, in der er denkt, dass das Eingabefragment geschrieben ist. Um zu vermeiden, dass viele Sprachzeichenfolgen komprimiert werden müssen, erlaube ich Zuordnungen (Wenn Sie 3 für "Java" ausgeben möchten, ist das in Ordnung). Beachten Sie einfach die Zuordnungen in Ihrer Antwort.
  • Sie können nur 1 Ausgabe-Mapping für jede Sprache haben (dh wenn 3 "Java" bedeutet, können Sie nicht auch 4 "Java" bedeuten).
  • Wenn Ihr Programm über einen eigenen Quellcode verfügt, muss es die richtige Antwort liefern (es muss die Sprache ausgeben, in der es geschrieben ist).
  • Sie müssen nicht alle Sprachen in der Datenmenge unterstützen, und Sie können zusätzliche Sprachen unterstützen, wenn Sie möchten (z. B. wenn Ihr Eintrag nicht in einer der Sprachen in der Datenmenge vorliegt).
  • Ihr Programm muss deterministisch sein (das zweimalige Bereitstellen derselben Eingabe muss dieselbe Ausgabe erzeugen).

Binden brechen

  • Gleichstand wird durch Reduzieren des Datensatzes entschieden, bis ein Eintrag gewonnen hat. Der Datensatz wird verkleinert, indem alle Ausschnitte für die am häufigsten verwendete Sprache entfernt werden (dh, die Unstimmigkeiten werden durch die Genauigkeit in selteneren Sprachen unterbrochen). Wenn beispielsweise A und B im gesamten Datensatz 70% erreichen, werden alle Python-Snippets entfernt. Wenn A und B jetzt beide 60% erreichen, wird CJam entfernt. Wenn A jetzt 50% erzielt, B jedoch 55%, ist B der Gewinner.
  • Wenn eine Genauigkeit von 100% erreicht wird, wird die Bindung anhand eines zweiten (blinden) Datensatzes entschieden, der mehr Stichproben für die gleichen Sprachen enthält.

Beispiel 1

Das Python-Skript:

print("python")

Dieses Skript erzeugt erfolgreich "Python", wenn es über einen eigenen Quellcode verfügt. Daher ist es gültig. Auf dem Datensatz erhält es 1008/9066 = 11,1%.

Beispiel 2

Die JavaScript-Funktion:

function f(s){return /function/.test(s)?1:2}

Mit den Zuordnungen 1 → Javascript, 2 → Python. Wiederum produziert es erfolgreich 1 ("Javascript") für seine eigene Quelle, und auf dem Datensatz erhält es 1092/9066 = 12,0%.


Woher kommen die Daten?

Ich habe eine SEDE-Abfrage erstellt , um Beispiele von [Code-Golf] -Herausforderungen auf dieser Site abzurufen. Aus den 10.000 Antworten habe ich ein zusammengebrochenes Python-Skript verwendet, um den Code und den Sprachnamen für jede Sprache zu finden, und dann jede Sprache mit weniger als 5 Beispielen herausgefiltert. Die Daten sind nicht zu 100% sauber (ich weiß, dass es einige Nicht-Code-Snippets gibt, die abgerufen wurden), sollten aber gut genug sein.


Inspiriert von dieser Herausforderung zu Beginn des Jahres: Wer hat das gesagt? Präsidentschaftswahlen 2016

Teilweise auch im Zusammenhang mit What's the Language?


3
Scheint unglaublich herausfordernd in 300 Bytes zu sein. Vielleicht viel mehr Bytes?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala ja, ich stelle mir vor, es wird eine ziemliche Herausforderung! Ich erwarte jedoch nicht, dass irgendjemand eine 100% ige Genauigkeit erreicht. Die Herausforderung besteht darin, so hoch wie möglich zu werden. In der "Wer hat das gesagt?" Die Herausforderung, mit der ich verbunden war, erreichte bei uns allen eine Genauigkeit von ~ 30%. Ich habe versucht, die Bytegrenze so einzustellen, dass hier 50–70% möglich sein sollten. Hoffentlich habe ich die Balance richtig gemacht. Natürlich, wenn Sie eine großartige Lösung finden, die mehr Bytes verwendet, posten Sie sie! Es wird einfach nicht konkurrieren (Sie können es für eine konkurrierende Version reduzieren).
Dave

Haben Sie Polyglots aus dem Datensatz entfernt, oder handelt es sich nur um "Fallstricke"?
Geobits

9
Es wird so schwer sein, zwischen Golflangs zu unterscheiden ...
busukxuan

2
Interessante Fakten: Die 20 am häufigsten verwendeten Sprachen (zumindest in Ihrem Datensatz) machen 81% Ihres Datensatzes aus, und die 10 am häufigsten verwendeten Sprachen machen 61% aus. Selbst das Erkennen von Unterschieden zwischen Javascript, Pyth, CJam und Python reicht aus, um ungefähr 35% zu erreichen.
Helloworld922

Antworten:


17

C, 297 Byte, 43,194351% Übereinstimmung (Version 2)

Dies ist die erste Nicht-Golf-Herausforderung, an der ich teilgenommen habe. Überraschenderweise lassen sich Golfsprachen mit einer Übereinstimmungsgenauigkeit von ca. 60% pro Sprache recht einfach trennen.

Der Code muss als UTF-8-Zeichenfolge eingegeben werden. Die Ergebnisse basieren auf Version 2 des bereitgestellten Datensatzes. Dieser Code muss nicht <LF>durch aktuelle Zeilenumbrüche ersetzt werden.

#define S(x)!!strstr(p,#x)
f(char*p){return S(#d)?:S(voi)?0:S(mai)|S(utc)?:S(mbd)|S(impor)|S(input)|S(def)|S(rang)?2:S(log)|S(fun)|S(=>)|S(lert)?3:S(<?)?4:S(echo)|S(sed)?5:S(+++)?6:S(<-)?7:S($_)|S(say)?8:S(\342)|S(\303)?9:S(->)|S(map)?10:S(@#)|S(]])|S([#)?11:S(V)|S(Q)?12:S(Z)|S(Y)?13:S(.)?14:15;}

Zuordnungstabelle:

 0. java
 1. c
 2. python
 3. javascript
 4. php
 5. bash
 6. brainf*
 7. haskell
 8. perl
 9. apl
10. ruby
11. wolfram
12. pyth
13. matl
14. golfscript
15. cjam

Der Prozentsatz basiert auf meinen Treffern / Gesamtberechnung: 3916 Treffer / 9066 Gesamt.


Auf zu einem guten Start; das war schnell! Was "Mein Testcode und mein Texteditor sehen aus irgendeinem Grund 9068 Einträge anstelle von 9065" betrifft - haben Sie die Überschriften und die leere Zeile am Ende übersprungen? Das würde 2 zusätzliche Zeilen ausmachen.
Dave

Es tut uns leid; Dies entspricht nicht der Regel Nr. 7 (muss die richtige Antwort für den eigenen Quellcode ausgeben): Im Moment steht dort 0, was Python ist.
Dave

Sie können den Raum danach define S(x)und die 1 verlieren, wo immer Sie haben ?1.
Feersum

Vielen Dank! Ich wusste nichts über den ?1Trick und habe den anderen vergessen. ;-)
Owacoder

Wow, das hat sich leise verbessert! Verifiziert die neuesten 43.19% :)
Dave

2

Python 3, 271 278 Bytes, 25.049636% übereinstimmend (Version 2, nicht bestätigt)

def f(c):
 try:compile(c,'','exec');return 5
 except:
  for j in range(9):
   if any(l in c for l in [['echo'],['require'],['Main','string'],['document','alert','var ','function'],['String'],['def ','lambda','print '],['main','int','char'],['+++','<<<'],[]][j]):break
 return j

Karte:

0 = bash
1 = ruby
2 = c#
3 = javascript
4 = java
5 = python
6 = c
7 = brainf*
8 = cjam

viel besser golfen (wahrscheinlich immer noch nicht großartig), endlich die 25% Barriere durchbrochen! Eingaben wurden <LF>durch newline ( \n) ersetzt


Ich mag den execVersuch. Übrigens, Sie können verlangen, dass die Eingabe <LF>vorab durch ersetzt wird \n, sodass Sie dort ein paar Bytes speichern können, um möglicherweise weitere Feinabstimmungen vorzunehmen.
Dave

Endlich war es soweit, dies zu überprüfen. Ich sehe nur 2103 (23,19%) aus irgendeinem Grund - eine Idee, warum der Unterschied?
Dave

hmmm ... ich bin mir nicht sicher. Vielleicht hat es damit zu tun, wie Sie den Input geben? Ich decode('utf-8')verwandle das rohe Eingangsbyte-Array in eine native Python 3-Unicode-Zeichenfolge (utf-16?), Bevor ich es meiner Funktion übergebe.
helloworld922

Ach ok Könnte ein Codierungsproblem sein; Ich verlasse mich nur auf das, was fileinput.input () unter der Haube tut. Ich werde nachforschen.
Dave
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.