Surmonter la taille de la grappe

37

Fatigué de la fiabilité du stockage flash, vous avez décidé de stocker tous vos programmes sur l’une de ces vieilles vieilles disquettes de 1 440 Ko. Cependant, après avoir copié pas même 3 000 programmes, le disque était plein. Comment est-ce possible? Habile dans l'art du code-golf tel que vous l'êtes, la plupart de vos programmes ne mesurent même pas 100 octets; il devrait donc rester beaucoup de place ...

Après avoir posé votre question sur Super User, vous découvrez que la taille du cluster du système de fichiers vous a causé du tort , un complot pervers des concepteurs de FAT12 qui laisse une partie importante de votre disquette inutilisée et vous oblige à acheter plus que ce dont vous avez réellement besoin.

Acheter plus de disquettes? Jamais! La taille du cluster sera moins un problème si nous sauvegardons simplement plusieurs programmes dans un seul fichier, ce qui est possible car différents compilateurs / interprètes se comporteront différemment pour le même code source.

Tâche

Ecrivez un polyglotte qui s'intègre dans un seul cluster (512 octets ou moins) et résout le plus grand nombre possible des tâches suivantes.

  1. Lire toutes les entrées et les imprimer.

  2. Imprimer Bonjour le monde! .

  3. Lire une ligne / argument ( nom ) comme entrée et imprimer joyeux anniversaire, [nom]! .

  4. Lire toutes les entrées et imprimer J'aime les onglets! s'il contient un ou plusieurs tabulateurs (0x09) et que je déteste les espaces! si ce n'est pas le cas.

  5. Lisez deux lignes / arguments et imprimez une valeur de vérité si la seconde est une sous-chaîne de la première et une valeur de faux si ce n’est pas le cas.

  6. Lire une ligne / un argument et imprimer une valeur de vérité si ses caractères sont dans un ordre strictement croissant et une valeur de faux si ce n’est pas le cas.

  7. Lire une ligne / un argument et un caractère et imprimer les index de toutes les occurrences de ce caractère.

  8. Lire une ligne / un argument et imprimer l'un des caractères avec le plus grand nombre d'occurrences.

  1. Lire deux nombres entiers compris entre 0 et 255 et imprimer leur somme.

  2. Lire un seul entier compris entre 0 et 255 et imprimer le quotient et le résidu de sa division par 7 .

  3. Lire un seul entier compris entre 1 et 255 et imprimer une valeur de vérité s'il s'agit d'un nombre composé (ni 1 ni premier) et une valeur de faux si ce n'est pas le cas.

  4. Lire un seul entier compris entre 1 et 255 et imprimer une valeur de vérité s'il s'agit d'une puissance de 2 et une valeur de faux sinon.

  5. Lire deux nombres entiers compris entre 0 et 255 et imprimer le plus grand.

  6. Lire un entier décimal compris entre 0 et 255 affiche sa représentation hexadécimale.

  7. Lit un seul entier compris entre 0 et 255 et affiche son poids de Hamming (nombre de 1 bits).

  8. Lire un entier n entre 1 et 13 et imprimer la F n , la n ième nombre de Fibonacci .

    Par exemple, pour l’entrée 13, imprimez 233.

  1. Lire une ligne / argument d'entrée et le cadrer.

    Par exemple, pour l'entrée Programming Puzzles & Code Golf, imprimez ceci:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Lisez un bloc rectangulaire de caractères et faites-le pivoter d'un quart de tour dans le sens des aiguilles d'une montre.

    Par exemple, pour l'entrée

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    imprimer ceci:

    This  text
    is  simply
    unreadable
    
  3. Lire un entier compris entre 1 et 40 et imprimer un losange de la longueur de ce côté.

    Par exemple, pour l'entrée 3, imprimez ceci:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Imprimer ceci:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

Notation

La réponse qui parvient à incorporer le plus grand nombre de programmes dans un seul fichier qui s'inscrit dans un seul cluster gagne 512 octets. Les liens sont décomposés par le nombre d'octets (plus bas est le meilleur).

Règles supplémentaires

  • Pour chaque tâche que vous réclamez pour votre partition, le même fichier (octet par octet) doit constituer un programme complet - dans la langue de votre choix - permettant de résoudre cette tâche particulière.

  • Chaque tâche doit être résolue dans une langue différente.

    Les langues sont considérées différentes s'il ne s'agit pas de versions différentes de la même langue. Par exemple, il n'y a qu'un seul JavaScript, un Python et un TI-BASIC, mais C, C ++, Octave et MATLAB sont quatre langages différents.

  • Le langage sélectionné pour chaque tâche doit satisfaire à notre définition habituelle du langage de programmation .

    De plus, la langue doit avoir été publiée et mise en œuvre avant le 9 septembre 2015.

  • Votre compilateur / interprète peut ne nécessiter aucun indicateur non standard pour produire le comportement attendu.

    Les exceptions à cette règle incluent les indicateurs requis pour spécifier une langue particulière, pour lire le programme à partir d'un fichier (unique) ou pour supprimer une bannière.

  • L'entrée de chaque tâche comprendra des caractères ASCII imprimables (0x20 à 0x7E) et des sauts de ligne (0x0A) sans dépasser 255 octets de longueur.

  • Tous les nombres entiers peuvent être lus en décimal ou unaire, sauf indication contraire dans la tâche.

  • Le comportement pour une entrée non valide n'est pas défini.

  • Vous pouvez lire les entrées de STDIN (ou de son alternative la plus proche) ou sous forme d'arguments de ligne de commande.

    Si une tâche nécessite la lecture de deux entrées, vous pouvez les lire - dans n'importe quel ordre - séparées par un séparateur d'un octet de votre choix, en tant qu'arguments de ligne de commande distincts ou l'un de STDIN et l'autre en tant qu'argument de ligne de commande.

    Si l'une des pièces d'entrée est une ligne, le seul séparateur possible est un saut de ligne.

  • Imprimez la sortie sur STDOUT (ou l’alternative la plus proche). Toutes les sorties sur STDERR seront ignorées.

  • Les règles standard de s'appliquent à chaque tâche .

    Cela inclut notamment les échappatoires interdites par défaut , à l'exception du codage en dur de la sortie , qui est explicitement autorisée pour ce défi.

Dennis
la source
1
JavaScript et CoffeeScript sont-ils suffisamment différents pour être considérés comme des langues différentes?
Downgoat
Oui, ceux-ci comptent comme différents.
Dennis
17
votre défi # 4 n'a aucun sens> :(
Poignée de porte
Quote: Toutes les sorties sur STDERR seront ignorées. Est-ce que cela signifie que lorsque nous appelons le script / programme avec 2>/dev/nullet obtenons la sortie correcte sur stdout, tout va bien? Juste pour être sûr.
Cabbie407
2
@ Cabbie407 précisément. Par consensus sur les méta , cette règle s’applique par défaut à tous les défis. Je voulais juste m'assurer que tout le monde était au courant.
Dennis

Réponses:

17

12 langues, 418 octets

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

C'est un défi amusant. Il devient difficile d'insérer plus de langues, mais avec tous ces octets restants, je pourrais probablement en faire une de plus.

Utilise gratuitement les langages 2D. Notez que le caractère entre les [ ]sur la @-[ ]e<ligne est un onglet. De plus, cela nécessite des \nfins de ligne pour que TRANSCRIPT fonctionne.

Prélude (Tâche 1 / Chat)

( 
      )?(!?)

?(!?)est juste une traduction directe de ,[.,]en BF. Les ()boucles Prelude agissent comme des []boucles BF , de sorte que tout, de la (colonne la plus à gauche à l' )avant du programme principal, n'est pas exécuté.

Les règles de syntaxe de Prelude signifient que les parenthèses doivent être mises en correspondance (lecture de colonne à gauche), et qu'il ne peut y avoir qu'une seule parenthèse par colonne. Autre que cela, c'est un langage assez facile à intégrer.

Assurez - vous NUMERIC_OUTPUTest fixé à Falsesi vous utilisez l'interpréteur Python.

TRANSCRIPTION (tâche 2 / Bonjour tout le monde)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT est un esolang thématique basé sur la fiction interactive. Les lignes non reconnues par TRANSCRIPT sont ignorées, ce qui facilite leur intégration.

Tr is here.déclare une Trvariable chaîne et la deuxième ligne définit le contenu de la variable sur Hello, World!. X Tr( Xpour examiner) renvoie ensuite la chaîne.

Bien que TRANSCRIPT soit très facile à intégrer, c’est un langage assez verbeux, j’ai donc fait en sorte que le défi soit le plus facile.

Fission (tâche 3 / message d'anniversaire)

R"Happy Birthday, "[?S"!"*
                   \!/

qui imprime la première partie, lit l’entrée avec une petite boucle 2D, puis sort le point d’exclamation final. Le Rsignifie qu'un atome commence ici en se dirigeant vers la droite, ce qui est utile car ce programme peut être déplacé n'importe où.

Rail (tâche 4 / onglets)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Comme la fission, le rail est un langage 2D qui présente l’avantage de pouvoir être déplacé n’importe où. L'exécution commence à partir $de la mainfonction en direction du sud-est.

Nous commençons par descendre le \s, tourner à gauche à -, frapper [<tab>]qui pousse un onglet. e<puis branches basées sur EOF - si EOF, nous baissons et imprimons "I hate spaces!"avant de nous arrêter, sinon nous remontons. Si nous nous dirigeons vers le haut, nous lisons le caractère suivant et le comparons à l'onglet, une fois encore, branche - si onglet, montez et imprimez "I love tabs!"avant de vous arrêter, sinon tournez vers le bas et continuez la boucle de saisie.

Ce programme est assez coûteux, mais depuis que TRANSCRIPT a pris Hello World, il était difficile de choisir une tâche appropriée pour Rail.

> <> (Tâche 6 / entrée croissante)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Imprime 1si strictement ascendant, 0sinon.

> <> est un autre langage 2D, et l’exécution commence en haut à gauche. "..."est le mode chaîne, poussant les caractères internes un par un. Après la première chaîne que nous avons frappée #, qui reflète l’adresse IP vers la gauche, poussant plus de chaînes et enveloppant (> <> est toroïdal) avant de frapper \, un miroir qui nous renvoie vers le haut.

Au bas du programme se trouve .91< téléporteur (9, 1)où se trouve le programme de base. Après que cela 0[supprime toute la malbouffe des chaînes, 0pousse un zéro pour représenter le dernier caractère lu, et après cela, il ne fait que lire les caractères un par un, en s'assurant que nous sommes toujours en train d'augmenter.

Il est probablement préférable de réduire le programme principal plutôt que de se téléporter, mais je traiterai de cela plus tard si nécessaire.

Befunge (tâche 9 / ajout)

"1\"# &&+.@

Testé avec l'interprète trouvé ici . Ceci est un programme assez simple, avec le début en poussant une chaîne inutile et# sautant par dessus l'espace. Après cela, c'est juste le programme de base &&+.@.

Labyrinth (Task 10 / Divmod by 7)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Commodément, 'et" sont PON à labyrinthe qui agissent comme un chemin praticable dans le labyrinthe. Je vais sauter la navigation en désordre, mais fondamentalement, il y a beaucoup de retournement et d'errance avant que nous ne ?commencions, le début du programme de base.

Le programme n’est pas tout à fait à gauche pour tenir compte de Prelude (par exemple ? lit l'entrée dans Prelude).

Python 2 (tâche 14 / hexadécimal)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

Les xxxs représentent des parties non pertinentes commentées par des chaînes ou des commentaires multilignes. Entre les deux print hex(input()), le programme principal. Cette sortie avec un leader0x , mais je suppose que ça va (sinon, c'est une solution facile quand même).

La première ligne est une chaîne "1\"# &&+.@\""suivie de deux" " lettres s. Ces trois chaînes sont concaténées par l'analyseur et laissées inutilisées (cette première ligne fonctionne de la même manière pour Ruby et Julia plus tard).

GolfScript (tâche 15 / poids de Hamming)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

La première ligne pousse trois chaînes et la deuxième ligne est un commentaire. ''''pousse deux autres chaînes, puis <<fait deux comparaisons ( sest ignoré). Enfin, ""'("'pousse deux autres chaînes.

Tout cela est éliminé en l'enveloppant dans un tableau et en obtenant le premier élément ( ]0=), qui est l'entrée initialement sur la pile. Nous évaluons ensuite l’entrée avec ~, transformons-la en binaire avec 2baseensuite sommeons les bits avec {+}*. La prochaine }est inégalée et super commente le reste du programme.

Julia (tâche 16, Fibonacci)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=commence un commentaire multiligne et =#termine un commentaire multiligne. Le programme principal utilise l’exponentiation matricielle pour calculer les nombres de Fibonacci (extraits de Rosetta ).

Ruby (cadre Task 17 / ASCII)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Ce programme suppose que l’entrée ne se termine pas par une nouvelle ligne.

Nous avons une chaîne inutile, un commentaire, une autre chaîne inutile, puis un hérédoc qui commente la majeure partie du programme. Après cela est le programme de base, suivi d'un #commentaire d' une seule ligne .

CJam (tâche 19 / diamant)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

Les deux chaînes d'espace à la fin de la première ligne doivent satisfaire CJam, puisqu'il #=s'agit de deux opérateurs binaires. Je n’entrerai pas dans les détails avec celui-ci, mais au fond, c’est un gâchis, le programme de base étant la simple

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

entre.

La différence entre GolfScript et CJam réside dans le fait que, dans CJam, un guillemet simple 'ne commence ni ne termine les chaînes, mais place le caractère suivant dans la pile. Cela signifie que dans CJam

'("'

pousse a (puis commence une chaîne avec "(dont le premier caractère est' ), alors que ce qui précède est juste une chaîne simple droite dans GolfScript.

Essayez-le en ligne . 1>est utilisé à la place de (pour rendre compte de Prelude.


Voici 12 langues, 373 octets . Certaines tâches ont été déplacées, TRANSCRIPT a été supprimé (cela a rendu Rail trop cher) et Scheme (poulet) a été ajouté. Ceci est juste mon terrain de golf pour les mises à jour à venir, car la mise à jour de la publication principale prend une éternité.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Je pourrais économiser quelques octets pour Julia car les commentaires multilignes non terminés génèrent une erreur dans STDERR.

Sp3000
la source
Super truc. Quelle est la tâche de TRANSCRIPT?
Cabbie407
@ Cabbie407 J'essaie toujours d'optimiser la langue pour quelle tâche, mais TRANSCRIPT prend actuellement Hello World et Rail a changé pour la tâche des onglets.
Sp3000
Ah, maintenant je peux le voir, ;)je vais tergiverser et je ne change rien dans ma réponse, à cause de la longue description. lol
Cabbie407
26

7 8 9 10 langues, 398 431 447 507 octets

C’est probablement le maximum que je puisse intégrer dans la solution actuelle.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

La dernière ligne contient du code Whitespace codé pour que SE ne le mange pas. Pour exécuter le code, remplacez-les tous Spar des espaces, Tdes tabulations et Ndes nouvelles lignes.

C89, tâche 16

Voici ce que voit le compilateur:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Tout le reste est dépouillé sous forme de commentaires ou dans le #if 0.

C ++, tâche 14

J'ai utilisé une astuce volée d' ici pour faire la différence entre C89 et C ++.

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Lua, tâche 2

Voici la structure de base.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Brainfuck, tâche 1

Je devais juste m'assurer qu'aucune boucle infinie ni aucun parasite ne .,soient trouvés. Les commentaires multilignes de Lua font également double emploi avec les commentaires de BF. En dehors des 2 premiers caractères, tout est une grande boucle NOP.

++,+-[.,][[,+++.+<--[[<,--[[+<>.++<<.>>+>,,,,,>..--->,+,]]--]]+++-+[++,.]]]

Python, tâche 6

Encore une fois, j'utilise des fonctionnalités spécifiques à une langue pour NOP ou commenter l'autre code.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pyth, tâche 17

Pyth est bien pour cette chose. Il prend le premier #comme une while True:boucle qui se ferme silencieusement en cas d'erreur . Donc, je fais juste du code une chaîne (pour éviter de ;mettre fin à la boucle plus tôt), puis finissez juste la boucle, quittez-en une autre créée par le commentaire Python et faites la tâche. Voici le avec toutes les chaînes non vides remplacées par " string ", cela reste fonctionnellement équivalent:

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, tâche 3

Celui-ci est très intéressant. L'exécution rebondit dans le code, en utilisant des sauts si nécessaire pour contourner les obstacles. Les parties pertinentes:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Étoilé , tâche 9

Ici, je devais commencer à entrer dans les langues "éliminer tous les caractères sauf". Tout ce qui a été enlevé, ça ressemble à:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

Le code saute la majeure partie de la ponctuation d'un saut pour éviter les moments difficiles, en utilisant simplement le début et la fin du code. Le code est fonctionnellement équivalent à

      + +*,  + + +,*.*

Befunge-98, tâche 10

Fonctionne de la même manière que le> <> un. Heureusement, #est un miroir dans> <> et un saut dans Befunge, afin que nous puissions mettre en œuvre un comportement différent. Aussi 0/0 == 0.

#if      + 0+0/*^
                >&:7/.7%.@

Espace blanc , tâche 13

C’était la dernière chose à laquelle j’ai eu ma place. Les premières lignes ne font que placer des zéros sur la pile, car ils ne contiennent que des espaces et des nouvelles lignes à partir du code "normal". Le code est codé. remplacez tout Spar un espace, Tdes onglets et Ndes nouvelles lignes.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N
PurkkaKoodari
la source
9

17 versions différentes de Pip, 383 octets (invalide)

Alors que cette question était posée dans un bac à sable, j'ai passé au peigne fin toutes les révisions de mon langage, Pip. et trouvé un polyglotte en utilisant 17. Malheureusement, les règles de défi interdisent les versions du même langage, mais avec la permission de Dennis et un avertissement, je publie mon travail de toute façon.

Le code brut

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

La stratégie

Dans Pip, les lettres minuscules sont des variables. Les lettres majuscules sont plus compliquées: elles sont divisées en deux ou trois caractères au maximum, qui peuvent être des opérateurs ou des variables. Si un jeton en majuscule n'est pas spécifiquement défini en tant que variable ou opérateur, il est supposé être une variable non définie, dont la valeur est égale à zéro.

Donc, pour distinguer deux versions de Pip, il me suffit de trouver un opérateur variable ou alphabétique ajouté dans la plus récente des deux. Dans l'ancien, ce sera nul à la place. Le code v:uIN[...]constitue une grande liste contenant l'une de ces vérifications pour chaque version que je veux tester, recherche le nombre de nils présents dans cette liste (la uvariable est explicitement initialisée sur nil) et stocke le nombre dans v(pour "version"). .

Après d’autres calculs, une autre grande liste calcule les résultats de 17 tâches du défi et en utilise une vpour en choisir une version.

Versions et tâches

0.15.09.04

Diagnostic: (oTM0,0i)(correction d'un bug avec l' opérateur Tri Moù le rognage de 0 caractères à chaque extrémité d'une chaîne donnait la chaîne vide à la place; l'indexation dans une chaîne vide donnait nil)

Tâche 18: Iv<2W##YqlPBy(configuration: lisez toutes les lignes de stdin si vest inférieur à 2) suivies de ((J_M ZRVl)|0)Jn(liste inversée de lignes, transposée et jointe dans une chaîne)

0.15.08.06

Diagnostic: EN1(ajout d' ENun opérateur)

Tâche 1: Iv<2W##YqlPBy(même code d’installation que ci-dessus) suivi de l?lJnl(rejoindre les nouvelles lignes)

0.15.08.03

Diagnostic: 1N1(ajouté en Ntant que version abrégée de l' INopérateur)

Tâche 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(configuration: générer une liste contenant les moitiés supérieure et inférieure de l’échiquier et la stocker dans c) suivie de cJn(rejoindre sur la nouvelle ligne)

0.15.08.01

Diagnostic: Y1(ajouté Yopérateur ank)

Tâche 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(configuration: si v3, construire la moitié supérieure du losange dans d) suivie de d.n.RVd(inverser pour la moitié inférieure et rejoindre sur une nouvelle ligne)

0.15.06.19

Diagnostic: RCk(ajouté RAndom Copérateur hoix)

Tâche 17: m:'+.'-X#a+2.'+.n."| "(configuration: construire une +----+\n| chaîne dans m) suivie de m.a.RVm(insérer les entrées met les inverser dans m)

0.15.06.12

Diagnostic: k( kvariable initialisée à ", "; auparavant, elle était indéfinie et donc nulle)

Tâche 16: Iv=5La{i+:oSio}(si v5, indiquez le nombre de Fibonacci dans i) suivi dei

0.15.06.08 (note: le numéro de version n'a pas été changé avant la validation suivante)

Diagnostic: w( wvariable initialisée à `\s+`)

Tâche 15: h:$+TBa(convertir l’entrée en chiffres binaires et en somme; enregistrer le résultat hpour la tâche 12 ultérieurement)

0.15.05.29

Diagnostique: (hR`1.+0``&2o`)@>3@AB0

Cette version a été ajoutée &comme motif de remplacement pour toute la chaîne correspondante dans un remplacement de regex (inspiré de sed). Le code ci-dessus prend h( 100) et le remplace par `&2o`(c'est- "1002o"à- dire dans les versions les plus récentes mais simplement "&2o"dans les versions plus anciennes). Il coupe ensuite tous les caractères après le troisième ( "2o"dans les versions plus récentes, ""dans les versions plus anciennes) et tente d'indexer dans cette chaîne. L'indexation dans une chaîne vide donne nil.

Tâche 7: j:ak:b(setup: copie les vars locaux a, ben vars globaux j, kafin qu’ils soient disponibles dans une fonction) suivi de ({j@aEQk}FI0,#a).s(filtre pour les index dans alesquels le caractère correspondant est égal à b, et rejoindre l’espace)

0.15.05.26

Diagnostic: `u`(type de motif ajouté; dans les versions précédentes, les backticks étaient ignorés en tant que caractères non reconnus et l'expression évaluée était égale à uzéro)

Tâche 14: aTB16(converti To Base 16)

0.15.05.24

Diagnostic: rZ4( rvariable spéciale créée qui renvoie une valeur aléatoire entre 0 et 1 chaque fois qu'elle est référencée; auparavant, elle était indéfinie et donc l'expression évaluée à nil)

Tâche 13: a>b?ab(expression ternaire)

0.15.05.12

Diagnostic: rZ4( Zopérateur IP ajouté )

Tâche 12: h=1(la somme des bits de la tâche 15 doit être égale à 1)

0.15.05.11

Diagnostic: AB6( ABopérateur de valeur de soluté ajouté )

Tâche 11: Pv=11?a>1&0INa%(2,a)[...]@v(si vest 1égal à 11, sortie si entrée supérieure à 1 et divisée exactement 0par un nombre inférieur, sinon; si vrien d'autre, utilisez-la vcomme un index de la liste pour décider du contenu à afficher)

0.15.05.02

Diagnostic: ({a}V7)( Vopérateur ajouté ; quand Vétait indéfini, ceci envoyait les arguments nil et 7 à une fonction {a}qui retourne son premier argument)

Tâche 10: a//7.s.a%7(entrée int divisée par 7 et mod 7, séparée par des espaces)

0.15.04.26

Diagnostic: BN8(ajouté Bitwise Nopérateur egation)

Tâche 9: a+b

0.15.04.23

Diagnostic: AZ( AZvariable initialisée en alphabet majuscule)

Tâche 5: bINa( INdonne le nombre d’occurrences)

0.15.04.20

Diagnostic: m@0:0suivi de9@m

La mvariable est préinitialisée à 1000. Dans cette validation, l' @opérateur était corrigé pour renvoyer des valeurs. auparavant, assigner à m@0donnait un avertissement et ne faisait rien. Ainsi, après la correction de bugs, la première instruction définit msur 0000, qui est un index légal pour 9; pré-bugfix, mséjours 1000, ce qui est un index juridique. (Les indices n'étaient pas encore cycliques.)

Tâche 3: "Happy Birthday, ".a.'!

0.15.04.18

Tous les diagnostics précédents entraînent l'ajout de zéro à la liste de diagnostics.

Tâche 2: "Hello, World!"


La plupart des autres codes sont des modifications que j'ai dû faire pour éviter des erreurs dans diverses versions. Ce message est déjà beaucoup trop long, donc si vous voulez savoir quelque chose que je n'ai pas expliqué, passons à la discussion sur le forum des langues ésotériques .

DLosc
la source
4

6 langues, 226 octets (229 selon l' \x1bacceptation!)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Donc, je ne pense pas avoir fait le meilleur choix de langues et j'imagine que ce n'est pas particulièrement compétitif, mais j'ai néanmoins trouvé le défi intéressant! Globalement, peu de défis sont complets, mais je pourrais probablement faire un défi dans les espaces ou quelque chose de similaire, mais voici ce que j’ai eu jusqu’à présent:


1. Brainfuck

[+.]>>+[>,]<[<]>>[.>]>[<.[],[][,],,[],[].]

Testé sur http://copy.sh/brainfuck/ et http://brainfuck.tk/ .

Après avoir supprimé tous les caractères ignorés, le programme ci-dessus est tout ce qui nous reste, à savoir l'exemple de programme cat avec quelques boucles vides supplémentaires pour contourner l'utilisation des symboles dans d'autres langues.

2. rubis

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Usage:

ruby cluster

Ce qui précède est le code une fois tous les commentaires supprimés. La première ligne est tout à fait inutile dans Ruby que nous définissons quelques expressions régulières pour contenir le Befunge-93 et le code brainfuck, nous créons un tableau pour contenir Helloet Worldet l' imprimer en utilisant printf(pour ajouter le ,et !).

3. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Usage:

perl cluster <name>

Très similaire à Ruby, sauf que puisque nous stockons une référence de tableau dans $a, lorsque nous essayons d'accéder à $a[0]celle-ci, elle est vide, nous pouvons donc la remplacer par le texte du défi 3, Happy Birthdayet pop(qui montre le dernier argument du programme de ligne de commande ).

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Utilisation: coller dans la console du navigateur et exécuter.

Comme Ruby et Perl, la première ligne crée essentiellement des RegExpobjets inutiles . Nous stockons ensuite un tableau inutile $aet instancions deux chaînes inutiles, l'une contenant le code Ruby / Perl et l'autre contenant un retour à la ligne et un #, puis nous prompt()en saisissons alert()le résultat attendu. par la plupart des humains pour le défi 4. Nous finissons avec un autre RegExpobjet inutile pour fermer la boucle de brainfuck.

9. Befunge-93

/&&#[+.#]@

Testé sur http://www.quirkster.com/iano/js/befunge.html .

Si je comprends bien, /divise la pile et affiche le résultat qui n’a pas d’effet pervers sauf si on appuie NaNsur le site ci-dessus, &demande l’entrée d’un nombre entier pour que nous puissions lire les deux nombres requis par le défi 9 dans la pile, #ce qui nous permet d’éviter le [qui est là pour brainfuck, +puis ajoute les deux premiers nombres sur la pile, les .sort, #]pour brainfuck encore et @sort.

13. PHP (en cours d'exécution dans Bash)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Usage:

php cluster <x> <y>

En PHP, tout ce qui n’est pas inclus dans les <?balises est sorti textuellement, ce qui donne le code Befunge-93 et ​​le code brainfuck. Nous avons donc die()immédiatement dans le code, généré un écran clair ( \x1bc) puis le max()des deux premiers arguments.

Dom Hastings
la source
Vous pouvez mettre le caractère ESCape littéral dans le littéral chaîne, ajoutez simplement une note indiquant qu'il est là ( the first character in the first string literal is the byte ASCII 27); Votre score est 226.
Cat
@cat Ouais, je pense que tu as raison, j'ai laissé tel quel pour le moment, mais j'ai mis 226 dans le titre. J'ai oublié à quel point j'ai apprécié ce défi, je pourrais probablement en faire un peu plus maintenant et en utilisant ES6, j'aurais pu .match'\x09'(où sont les "sont") peut-être que je verrai si je peux en ajouter plus à un moment donné!
Dom Hastings
4

6 langues, 450 404 octets

bash, brainfuck, C, gawk4, JavaScript et Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Mise à jour: Golfé un peu. Vous ne savez toujours pas quoi ajouter, et je ne sais pas comment les membres en concurrence penseraient à mon utilisation de leur langue pour différentes tâches. Essayer d'expliquer l'algorithme de brainfuck.

Eh bien, c’est / était ma première expérience polyglotte, j’ai donc dû tout apprendre à partir de rien. Commencer par awk n’était pas l’idée la plus intelligente à mon avis, car c’est relativement impitoyable. Comme le nombre de tâches terminées est pertinent, j'ai commencé par les tâches les plus faciles. Je ne sais pas si c'était un geste intelligent. Ce n’est pas vraiment une question de golf, car j’avais assez de mal à faire travailler ces six personnes ensemble, mais j’ai fait tout ce que je pouvais pour rester bref.

Voici les langues et ce qu'elles font dans l'ordre alphabétique. Je vais montrer un moyen facile de les tester tous plus bas. Certains de ces éléments pouvant être spécifiques à une version, je vous donnerai les numéros de version des outils que j'ai utilisés.

bash, tâche 3

Eh bien, il est évident que j'ai utilisé sed. J'ai essayé de mettre un script sed dans ceci, mais je ne pouvais pas le faire fonctionner, alors je suis parti sur la voie bash. La façon dont je l'ai dit, c'est dans un commentaire C et awk l'évalue False.

sed --version donne sed (GNU sed) 4.2.2

bash --version donne GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Donc, la partie sed se résume à

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Il regroupe l'entrée, la colle dans une nouvelle chaîne et imprime le résultat. Trucs assez communs.

brainfuck, tâche 20

Eh bien, il est toujours facile de se cacher, je suppose. Une ligne commençant par#// est ignorée par C et awk. Ou au moins ils peuvent vivre avec des ordures derrière cela.

bf donne bf - a Brainfuck interpreter version 20041219

C'est le code condensé. La première ligne n'est que la corbeille des autres langues.

[,+.-<>.+.++.<>.,,,,[][][++]++<[--][]]
++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<
[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Je vais essayer d'expliquer comment ça marche

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

cela arrange la bande et le pointeur sur cette

0 8 10 46 64 C2 C1
  ^

la cellule contenant 8 est le compteur global de la boucle suivante
, le nombre de fois que 3 lignes identiques sont imprimées

[>>>>>+++

définit C1à 3, le nombre de lignes identiques

    [<++++

définit C2à 4 le nombre de " ....@@@@" dans une ligne (au début)

        [<<....>....>-]<<<.>>>
    >-]

imprime une ligne complète décrémentant C2dans le processus
quand C2est égal à zéro, il affiche une nouvelle ligne et décrémenteC1 .

si C1est zéro la magie se produit

    <<<[>>+<<-]
    <[[>+<-]<]

le 46 est déplacé derrière le 64
le 10 et le compteur global sont déplacés un vers la droite

>>-]

alors le compteur global est décrémenté
s'il est zéro, le programme quitte

C, tâche 2

J'épuise chaque dernière capacité de C ici en imprimant "Hello, World!". Eh bien, quelqu'un devait faire le travail ...

gcc --version donne gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

Le code C actuel

#define func
func main(){puts("Hello, World!");}
#

Le #define funcest de faire awk d'accord avec cela. Il pense que c'est une fonction awk. L'abréviation de func est une fonctionnalité gawk.

gawk4, tâche 18

Depuis que j’ai utilisé awk pour à peu près tout ici, j’ai décidé qu’il devait en être ainsi.

awk --version donne GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

awk voit ça

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

Les modèles de recherche, y compris \tévaluer à false. J'ai choisi l'onglet ici, parce que je pense que ça ne peut pas être dans l'entrée. sedévalue à false. "the string"&&0évalue à faux. La fonction est d'accord. Le programme est exécuté si un motif vide correspond, quelle que soit l'entrée.

Ça fait ça

Contribution

elaic
parli
ucfit
srigs

Sortie

supe
rcal
Ifra
gili
stic

Vous devez vous assurer que toutes les lignes d'entrée ont la même longueur. Utilisez des espaces pour les remplir.

JavaScript, tâche 9

Je ne sais pas si c'est légitime, parce que c'était trop facile. Si vous attribuez au fichier de programme une fin HTML et que vous l'ouvrez dans un navigateur (j'ai utilisé Firefox 40.0.3 et chrome 45.0.2454.85), il vous invite à saisir une information. Vous devez entrer deux nombres séparés par un espace et cela alertera la somme de ceux-ci.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Minimal-2D , tâche 1

C'était assez facile à intégrer dans les lignes de commentaires. J'ai utilisé l'interprète , qui s'exécute en python, pour tester cela. Il imprime l'entrée dans la sortie. Le programme ressemble à ceci

R,+/D
UL.-L

RUDL sont à droite, en haut, en bas et à gauche. Alors ça commence à aller droit, lit un caractère de stdin en mémoire et en ajoute un. La barre oblique ignore la commande suivante si la mémoire a la valeur 0. Ceci met fin à cela. Si un caractère de valeur -1 est lu, la saisie est terminée. Donc, si -1 est lu, il saute le D et se termine. Si quelque chose d’autre est lu, il descendra à gauche, ajoutera le 1 dans la mémoire et imprimera le caractère sur la sortie standard. Ensuite, il monte à gauche et recommence.

Essai

Déni de responsabilité: je ne prendrai aucune responsabilité pour les dommages que vous causeriez à votre système avec cela.

En supposant que vous ayez bash & co, gawk (au moins la version 4, car elle utilise des tableaux multidimensionnels), gcc, python, bf en tant qu’interprète cérébral et que Firefox est installé.

Pour simplifier, copiez la source du programme dans un fichier nommé cluster.html. Rendre ce fichier exécutable pour la tâche bash. Copiez et collez l' interpréteur de Minimal-2d dans un fichier nommé minimal2D.pydans le même répertoire. Ensuite, copiez et collez le script suivant dans un fichier de script et placez-le dans le même répertoire, rendez-le exécutable et exécutez-le. Si vous lisez ceci, vous n'aurez probablement pas besoin de beaucoup d'explications et vous pourrez le faire fonctionner de toute façon.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Vous y trouverez également la commande permettant d'exécuter les tests individuellement.

S'amuser!

Cabbie407
la source
Le brainfuck a un problème; le code a des crochets non équilibrés et ne fonctionnera pas correctement (vous devez exécuter le fichier entier, pas seulement la partie pertinente). En outre, les carrés du damier sont en réalité 4x3 au lieu de 4x4 pour avoir une apparence plus carrée dans le texte.
PurkkaKoodari
Merci pour l'allusion. Eh bien, ça fonctionne bien ici. Je cours toujours le fichier entier comme vous pouvez le voir dans mon script. Pas sûr si l'interprète doit vérifier les crochets avant de lancer. Le mien ne me dérange pas. Mais j'ai négligé ce nombre de lignes. Je dois changer ça.
Cabbie407
Eh bien, j’ai réexaminé la question et j’espère avoir résolu le problème.
Cabbie407