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?
Réponses:
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.Table de cartographie:
Le pourcentage est basé sur mes hits / calcul total: 3916 hits / 9066 total.
la source
define S(x)
et le 1 où que vous soyez?1
.?1
truc et j'ai oublié l'autre. ;-)Python 3,
271278 octets, 25,049636% adapté (v2, non vérifiée)carte:
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
)la source
exec
tentative. 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.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.