Devinez la langue

23

introduction

Ce site crée rapidement un énorme ensemble de données d'extraits de code, alors faisons quelque chose avec!

Voici un fichier de données . Il contient 9 066 paires de langues + d'extraits uniques pour 113 langues, toutes tirées de ce site. Le format est séparé par des tabulations (language-TAB-snippet), tous les sauts de ligne des snippets étant remplacés par <LF>, et tous les tabulations remplacés par 4 espaces. Il existe au moins 5 extraits pour chaque langue.

[mise à jour: j'ai apporté une modification mineure au fichier de données pour fusionner certaines versions de Python et RegExp que j'ai manquées auparavant - le lien ci-dessus a été mis à jour]

Défi

Écrivez un programme ou une fonction qui prend un extrait de code et génère la langue dans laquelle il est écrit (voir ci-dessous pour plus de détails). La taille totale de votre source + toutes les données dont vous avez besoin doit être de 300 octets ou moins, et votre programme doit produire la langue correcte lorsqu'il reçoit son propre code source. La précision la plus élevée (réponses les plus correctes sur l'ensemble de données ci-dessus) l'emporte.

Règles

  • La taille totale de votre code source, de vos ressources et de tout indicateur de compilation / d'exécution requis ne doit pas dépasser 300 octets.
  • Votre réponse sera testée par rapport à l'ensemble de données ci-dessus; il recevra une des valeurs "Extrait" en entrée et sa sortie sera comparée à la sortie "correcte" en fonction de l'ensemble de données. Cela sera répété pour toutes les entrées de l'ensemble de données et le nombre final de réponses correctes est votre score.
  • Vous pouvez choisir l'encodage d'entrée - je suppose que l'UTF-8, donc si vous avez besoin d'un autre encodage, spécifiez-le dans votre réponse.
  • Vous n'avez pas besoin d'utiliser le <LF>remplacement pour les nouvelles lignes; si votre entrée s'attend à recevoir des retours à la ligne en tant que retours à la ligne littéraux (caractère 10), spécifiez-le dans votre réponse.
  • Votre entrée doit sortir la langue dans laquelle elle pense que l'extrait d'entrée est écrit. Pour éviter d'avoir à compresser beaucoup de chaînes de langue, je vais autoriser les mappages (si vous voulez sortir 3 pour "Java", c'est très bien); notez simplement les mappages dans votre réponse.
  • Vous ne pouvez avoir qu'un seul mappage de sortie pour chaque langue (c'est-à-dire que si 3 signifie "Java", vous ne pouvez pas aussi avoir 4 signifiant "Java").
  • Lorsqu'il reçoit son propre code source, votre programme doit produire la bonne réponse (doit afficher la langue dans laquelle il est écrit).
  • Vous n'avez pas besoin de prendre en charge toutes les langues de l'ensemble de données, et vous pouvez prendre en charge des langues supplémentaires si vous le souhaitez (par exemple, si votre entrée n'est pas dans l'une des langues de l'ensemble de données).
  • Votre programme doit être déterministe (fournir deux fois la même entrée doit produire la même sortie).

Briser l'égalité

  • Les égalités seront décidées en réduisant l'ensemble de données jusqu'à ce qu'une entrée gagne. L'ensemble de données sera réduit en supprimant tous les extraits de code pour la langue la plus populaire (c'est-à-dire que les liens sont rompus par la précision sur les langues plus rares). Par exemple, si A et B obtiennent 70% sur l'ensemble de données complet, tous les extraits de code Python seront supprimés. Si A et B obtiennent désormais 60%, CJam sera supprimé. Si A marque maintenant 50% mais B marque 55%, B est le gagnant.
  • Si une précision de 100% est atteinte, les liens seront déterminés à l'aide d'un deuxième ensemble de données (aveugle) contenant plus d'échantillons pour les mêmes langues.

Exemple 1

Le script Python:

print("python")

Ce script produit avec succès "python" lorsqu'il reçoit son propre code source, il est donc valide. Sur l'ensemble de données, il obtient 1008/9066 = 11,1%

Exemple 2

La fonction JavaScript:

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

Avec les mappages 1 → javascript, 2 → python. Encore une fois, il produit avec succès 1 ("javascript") pour sa propre source, et sur l'ensemble de données, il obtient 1092/9066 = 12,0%


D'où proviennent les données?

J'ai créé une requête SEDE pour extraire des échantillons des défis [code-golf] sur ce site. À partir des 10 000 réponses obtenues, j'ai utilisé un script python piraté pour trouver le code et le nom de la langue pour chacun, puis filtré toute langue avec moins de 5 exemples. Les données ne sont pas 100% propres (je sais qu'il y a des extraits non-code qu'elles ont extraits), mais devraient être assez bonnes.


Inspiré par ce défi du début de l'année: qui a dit ça? Élection présidentielle de 2016

Également en partie lié à Quelle est la langue?

Dave
la source
3
Semble incroyablement difficile à faire en 300 octets. Peut-être allouer plus d'octets?
Rohan Jhunjhunwala
1
@RohanJhunjhunwala oui j'imagine que ce sera tout un défi! Je ne m'attends cependant pas à ce que quelqu'un obtienne une précision de 100%; le défi est de monter le plus haut possible. Dans le "qui a dit ça?" défi auquel je suis lié, nous avons tous atteint un pic de précision de ~ 30%. J'ai essayé de définir la limite d'octets afin que 50 à 70% soient possibles ici. J'espère que j'ai trouvé le bon équilibre. Bien sûr, si vous trouvez une excellente solution qui utilise plus d'octets, postez-la! Il ne sera tout simplement pas en compétition (vous pouvez le réduire pour une version concurrente).
Dave
Avez-vous supprimé les polyglottes de l'ensemble de données, ou s'agit-il simplement de "pièges"?
Geobits
9
Ça va être si difficile de différencier les golflangs ...
busukxuan
2
Faits intéressants: les 20 langues les plus utilisées (au moins dans votre ensemble de données) représentent 81% de votre ensemble de données, et les 10 les plus couramment utilisées représentent 61%. La simple détection de différences entre Javascript, Pyth, CJam et Python suffit pour obtenir environ 35%.
helloworld922

Réponses:

17

C, 297 octets, correspondance avec 43,194351% (v2)

Il s'agit du premier défi hors golf auquel j'ai participé. Étonnamment, les langues de golf sont en fait assez faciles à séparer, avec une précision d'appariement d'environ 60% par langue.

Le code nécessite une entrée sous forme de chaîne UTF-8, les résultats sont basés sur la version 2 de l'ensemble de données fourni. Ce code n'a pas besoin <LF>d'être remplacé par de nouvelles lignes.

#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;}

Table de cartographie:

 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

Le pourcentage est basé sur mes hits / calcul total: 3916 hits / 9066 total.

owacoder
la source
C'est parti pour un bon départ; c'était rapide! Quant à «Mon code de test et mon éditeur de texte voient 9068 entrées au lieu de 9065 pour une raison quelconque» - avez-vous sauté les en-têtes et la ligne vierge à la fin? Cela représenterait 2 lignes supplémentaires.
Dave
Désolé; cela ne passe pas la règle # 7 (doit produire la bonne réponse pour son propre code source): en ce moment, il indique 0 qui est Python (je suppose que ce ne serait pas trop de travail de réorganiser les contrôles pour résoudre ce problème)
Dave
Vous pouvez perdre l'espace après define S(x)et le 1 où que vous soyez ?1.
feersum
Merci! Je ne connaissais pas le ?1truc et j'ai oublié l'autre. ;-)
owacoder
Wow, cela s'améliore tranquillement! Vérifié le dernier 43.19% :)
Dave
2

Python 3, 271 278 octets, 25,049636% adapté (v2, non vérifiée)

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

carte:

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

beaucoup mieux joué au golf (probablement toujours pas génial), a finalement franchi la barre des 25%! Les entrées ont été <LF>remplacées par newline ( \n)

helloworld922
la source
J'aime la exectentative. Soit dit en passant, vous êtes autorisé à demander que l'entrée soit <LF>pré-remplacée \n, vous pouvez donc y économiser quelques octets pour éventuellement ajouter des réglages plus fins.
Dave
Enfin réussi à vérifier cela. Je ne vois que 2103 (23,19%) pour une raison quelconque - une idée pourquoi la différence?
Dave
hmmm ... je ne suis pas sûr. Peut-être que cela a à voir avec la façon dont vous donnez votre avis? J'utilise decode('utf-8')pour convertir le tableau d'octets d'entrée brut en une chaîne unicode native Python 3 (utf-16?) Avant de le donner à ma fonction.
helloworld922
Ah ok. Cela pourrait être un problème d'encodage; Je m'appuie simplement sur tout ce que fileinput.input () fait sous le capot. Je vais enquêter.
Dave