Quelle est la ligne de code R la plus laide qui soit encore analysée?


19

L'objectif est de produire une seule ligne de code R qui:

  1. Fait le moins possible
  2. En autant de caractères que possible (max 100 caractères)
  3. Et est aussi laid que possible (où "laid" peut être considéré comme signifiant des stratégies de calcul inefficaces, des caractères étrangers tels qu'un point-virgule de fin, etc.).

Faites de votre pire, mes amis!

Critères objectifs pour gagner

La réponse gagnante sera jugée selon l'échelle de points suivante (la réponse avec le plus de points gagne):

  • Générer une séquence de 0 à 10 ( 100 points)
  • En autant de caractères (N) que possible
    • 0 point si N = 100
    • N-100 points si N <100 (c'est-à-dire perdre un point pour chaque personnage de moins de 100)
    • 2 (100-N) points si N> 100 (c'est-à-dire perdre deux points pour chaque personnage de plus de 100)
  • Utiliser autant d'exemples négatifs du R Inferno que possible
    • 6 points par exemple cité
    • Chaque exemple ne compte qu'une seule fois. Il en est ainsi parce qu'un "hérétique emprisonné dans [une] tombe enflammée" ne peut l'être qu'une seule fois. Ainsi, deux affectations globales dans votre ligne de code ne vous rapportent que 6 points.

Pas un critère de gain objectif. Voir la FAQ.
dmckee

4
FAQ vous @dmckee :) les critères sont assez objectifs
Tomas

J'ai essayé de rendre les critères encore plus explicites. Si le critère 3 n'est toujours pas assez objectif, je pourrais l'éliminer, même si j'aime bien.
Ari B. Friedman

Je ne comprends pas du tout le nouveau système de notation. L'objectif 2 doit être aussi long que possible (sujet à 100 caractères maximum), et vous donnez moins de points pour être plus proche de 100 (et spécifiez des points pour des programmes plus longs que 100 ??!); l'objectif 3 est d'être aussi laid que possible, et vous donnez plus de points pour des programmes plus laids. Les points sont-ils donc censés être bons ou mauvais?!
Peter Taylor

@PeterTaylor Modifié pour souligner que les deux formules de l'objectif n ° 2 produisent des points négatifs. Les points sont bons: "La réponse avec le plus de points gagne".
Ari B. Friedman

Réponses:


25

72 96 caractères.

`c`<-function(...){list(...)[[-1]];}->>`c`;`[`=0;`]`=10;c(c,c)(c,c)(c,invisible)(`[`[]:`]`[])[];

La laideur:

  • Réutilisation d'un nom de fonction standard
  • Utilisation de symboles comme noms de variables
  • Affectation globale
  • Affectation correcte
  • Auto-redéfinition de la fonction
  • Point-virgule de fin inutile
  • Numéros de sous-scriptage inutiles
  • Citation inutile du nom de variable
  • Laisse l'espace de travail dans un état qui interrompra presque certainement toute exécution de code ultérieure

Génère la séquence 0-10 (merci à Andrie pour l'idée de faire ça).

production:

 [1]  0  1  2  3  4  5  6  7  8  9 10

4
C'est vraiment dément. C'est la première fois que j'utilise ce mot comme compliment. D'un autre côté, c'est un excellent travail pour quelqu'un de désobscurcir et d'apprendre d'une critique attentive. Bon travail.
Iterator

Brillant. Du haut de ma tête, les laideurs numéros 3,4,5,8,9 sont dans l'Enfer. C'est donc 96 + 6 * 5 = 126 points selon les critères de notation.
Ari B. Friedman

Solution brillante. Ajout d'une laideur de plus + 100 caractères. Remplacez tous les "par des guillemets simples. Problèmes d'intégration."<-"("c",function(...){list(...)[[-1]];}->>"c");"["=0;"]"=10;c(c,c)(c,c)(c,invisible)("["[]:"]"[])[]
Vlo

7

Générez une séquence de 0 à 10.

100 caractères

{.=0;for(`~1` in c(1,2,3,4,5,6,7,8,9,10)){.=c(., `~1`,recursive=F)};print(unname(.[drop=T]));rm(.)}
 [1]  0  1  2  3  4  5  6  7  8  9 10

5

100 caractères: Générez une séquence de 1 à 10.

Notez que les nombres 2-10 ne sont PAS dans le code ... - Des points bonus? :-)

Notez également qu'il utilise lapplypour des performances maximales :)

unlist(lapply(LETTERS[-(11:26)],function(x) as.integer(charToRaw(x))-as.integer(charToRaw('A'))+1L))
#[1]  1  2  3  4  5  6  7  8  9 10 

2

100 caractères

assign("a",1:10);b<<-paste(c(a),collapse=";");unlist(lapply(strsplit(b,";")[[1]],function(c)c[[1]]))

Je ne sais pas si lapplyon strsplitest un exemple négatif mais ça devrait l'être.

Renvoie sous forme de caractère:

 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

1
I(cumsum(Reduce("sum", replicate(paste0(as.integer(T),as.integer(T)), T), accumulate=1-F) - T >0))

devrait avoir un peu moins de 100 caractères et produire 0:10


1
Je compte 98 via nchar, en comptant les espaces. Bien que sur mon système, je ne replicatepuisse pas prendre un vecteur de caractères comme argument de longueur.
Ari B. Friedman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.