Bowling à code réarrangable


14

Défi Code-Bowling

Écrivez un programme ou une fonction qui produit la même sortie, peu importe la façon dont vous réorganisez le code source. (La sortie ne peut pas être une erreur)


Pangram Scoring

  • Votre score est le nombre de caractères uniques dans votre code source.

    Un programme avec le code source AJBaurait un score de 3
    Un programme avec le code source AAJaurait un score de 2
    Un programme avec le code source 111aurait un score de1

  • Il s'agit d'une variante de . Le programme avec le score le plus élevé gagne!

(Pour votre commodité, un outil de notation automatisé a été créé ici )


Règles du défi

  1. Entrée
    Le programme / fonction peut prendre une entrée, ce qui est tout à fait facultatif cependant.

  2. Sortie
    Cette sortie peut être tout ce que vous voulez, mais elle doit être non nulle, non nulle, non vide et sans erreur. (La sortie doit donc être d'au moins 1 octet)

  3. Réarrangement
    Peu importe la façon dont le code source est réorganisé, la sortie doit être la même.

    Exemple:
       programme: ABJsorties hello world, tout comme les programmes: [ AJB, JAB, JBA, etc.]

Il s'agit d'une variante de . Le programme avec le plus grand nombre de personnages gagne!


1
Sans tâche spécifique à accomplir, ce défi est trop vaste à mon avis.
Dennis

2
Que signifie non nul?
Dennis

2
Bien que votre score pangram soit une tentative de faire fonctionner le bowling de code, je ne suis pas sûr que ces défis devraient vraiment être étiquetés bowling de code . Le mécanisme de notation est assez différent de ce que le bowling de code est censé être, donc je dirais soit utiliser le challenge de code ou créer une nouvelle balise.
Martin Ender

1
Je dois être d'accord avec Martin. Par exemple, ce défi n'est pas un code-golf. Dès que vous marquez autre chose que le nombre total de caractères (ou octets), ce n'est plus un défi de bowling de code
Nathan Merrill

3
Le programme / la fonction doit-il prendre fin? (par exemple, puis-je imprimer 0pour toujours?)
MildlyMilquetoast

Réponses:


18

Lenguage, 1.112.064 points si UTF-8

Mon programme se compose de tous les caractères UTF-8 possibles. Il imprime "Bonjour tout le monde" et utilise 1,75 * 1076 yottaoctets d'espace.

(Pour générer le programme, vous devez simplement créer un fichier avec 17498005810995570277424757300680353162371620393379153004301136096632219477184361459647073663110750484 caractères, en vous assurant que chaque caractère UTF-8 possible se trouve dans le fichier)


2
Vous, monsieur, êtes un génie. Et attendez, pourquoi mon ordinateur tombe en panne? : 'P
HyperNeutrino

Je pensais que Unicode avait 1114112 caractères?
MilkyWay90

14

Plusieurs langues, 2 points

0.

Produit 0.0comme 0.ou.0 . Nécessite une analyse des nombres libérale qui est OK avec un point décimal au début ou à la fin, en supposant 0 pour la partie intégrale ou décimale manquante.0000000.donnerait le même score.

Cela fonctionne également dans les langues suivantes (dans certains cas avec une sortie différente, comme indiqué):

  • Python REPL
  • Javascript REPL
  • MATLAB (produit ans = 0 )
  • Octave (produit ans = 0 )
  • MATL (produit 0 )
  • CJam
  • Rétine (produit 0)
  • Empilé (produit 0)

Pour Python, je pense que c'est le seul moyen d'obtenir un score supérieur à 1, car les possibilités peuvent être épuisées.

  • Tout opérateur binaire ou unaire échouera comme dernier caractère
  • N'importe quel [](){} nécessite un match et échouera si celui de clôture vient en premier
  • Un onglet ou un espace ne peut pas commencer une ligne. Les sauts de ligne ne peuvent pas être utilisés dans REPL.
  • Un , ne peut pas être le premier personnage
  • Un #premier placé commenterait tout et ne produirait pas de sortie
  • Un début \est une continuation de ligne invalide
  • Les backticks (Python 2) doivent être appariés, et les entourer de rien est une erreur
  • $, !, ?Et @ne peut être utilisé sans d' autres caractères inutilisables

Ce lettres feuilles, chiffres, _, .et citations.

  • Avec des guillemets, toute non-chaîne en dehors d'eux donne une erreur.
  • Lettres avec des chiffres possibles et _fait des noms de variables, dont une certaine permutation n'existe toujours pas.

Les chiffres des feuilles et .. Permuter des chiffres différents donne un numéro différent à moins que tous les chiffres ne le soient 0. Donc, je pense que les zéros et .c'est le seul moyen d'obtenir un score au-dessus 1. Mais, je ne connais pas bien le lexer Python, donc je pourrais manquer quelque chose.


11

CJam , score 15

T U
V	LMOQR[]0q

Essayez-le en ligne!

Imprime toujours 0000:

  • 0 pousse juste un zéro.
  • T, U, VSont des variables qui sont pré-initialisé à zéro.
  • L, M, O, Q, RSont des variables qui sont pré-initialisés à une liste vide, donc ils ne se présentent pas dans la sortie.
  • [et ]peut ou non envelopper les choses dans une liste, mais il n'est pas nécessaire de les faire correspondre correctement et la sortie est aplatie pour l'impression de toute façon.
  • q lit l'entrée qui est vide et n'apparaît donc pas non plus dans la sortie.
  • le saut de ligne, l'espace et la tabulation sont ignorés par l'analyseur.

C'est une excellente réponse pour une langue comme CJam! Nice
Albert Renshaw

Un minuscule pourrait-il rêtre ajouté pour accomplir quelque chose de similaire au minuscule q?
Albert Renshaw

1
@AlbertRenshaw, vous ne pouvez pas les avoir tous les deux, car l'un se trompe sur EOF.
Martin Ender

9

MATL , 3 5 6 points

L'idée d'ajouter des espaces a été tirée de la réponse de Bijan .

lv
 T1

Le code, ou toute permutation de celui-ci, génère trois codes séparés par des retours à la ligne.

Essayez-le en ligne!

Explication

  • La fonction lpar défaut pousse le numéro un à la pile.
  • Literal 1fait de même.
  • Littérales Tpousse true, qui est affiché comme numéro un.
  • L'espace et la nouvelle ligne sont des séparateurs, et ici ne font rien.
  • vconcatène jusqu'à présent la pile entière dans un vecteur de colonne. Ainsi, par exemple, vaprès Tconcaténerait les deux premiers nombres dans une colonne (puis le nombre suivant serait poussé). Une initiale vproduirait un tableau vide.

À la fin du code, la pile est implicitement affichée, avec les règles suivantes:

  • Chaque élément ou tableau de la pile est affiché sur une ligne différente.
  • Les vecteurs de colonne sont affichés avec chaque élément sur une ligne différente.
  • Le tableau vide ne provoque aucune sortie.

Ainsi, toute permutation des caractères d'entrée produit 1trois fois sur des lignes différentes.


Explication? Je suis curieux de savoir comment cela fonctionne.
Camarade SparklePony

@Sparkle Ajout d'une explication
Luis Mendo

Agréable! Je voulais également noter que j'avais ce texte dans le défi Removing any part of the source code however should cause that specific output to not be produced.au moment où vous avez posté, je ne voulais pas l'ajouter et il a été supprimé. Peut-être que cela vous aidera à augmenter le score un peu peut
Albert Renshaw

1
@AlbertRenshaw Merci pour l'avertissement! Deux autres points
Luis Mendo

Je t'accuse d'avoir volé mon idée. Ce n'est pas un problème cependant.
Bijan

6

Jelly , le score 53 101

¶ ¤$¥&+ABDFHNPQSUVX^_aborv|®²×ȧȯḄḅḌḞḢḤḷṀṂṚṛṠṢṪẠạị«»()kquƁƇƊƑƘⱮƝƤƬƲȤɓɗƒɦƙɱɲƥʠɼʂƭʋȥẸẈẒẎŻẹḥḳṇọụṿẉỵẓḋėġṅẏ

Utiliser uniquement des caractères qui font partie de la page de codes de Jelly .

Jelly a une entrée implicite 0et la première moitié (jusqu'à et y compris ạị«») de la chaîne de code ci-dessus se compose principalement d'atomes monadiques (majuscules) et dyadiques (minuscules et symboles) qui, lorsqu'ils reçoivent un zéro ou une liste contenant un seul zéro ( ou deux de ces entrées dans le cas des dyades) renvoient un zéro ou une liste contenant un seul zéro.

Les exceptions sont:

  • L'espace: il est ignoré (même s'il est dans la page de code).

  • Le pilcrow, sépare les liens (comme le fait un saut de ligne - mais c'est vraiment le même octet), mais aucun autre octet ne référencera le code avant lui de toute façon.

  • le scarabée ¤,, demande à l'analyseur de tout traiter pour qu'il reste à partir d'une nilade (ou constante) comme constante (et fonctionne comme un premier atome).

  • le dollar $,, demandez à l'analyseur de traiter les deux liens vers celui-ci comme une monade (et, ce qui est assez surprenant, fonctionne comme un premier atome)

  • le Yen ¥,, ordonne également à l'analyseur de traiter les deux liens vers celui-ci comme une dyade.

  • Le recommandé, ®rappelle la valeur du registre, initialement 0(c'est le droit d'auteur de contrepartie ©, se casse lorsqu'il est utilisé comme le tout premier atome car il est trouvé à partir de l'arité du lien vers sa gauche, qui n'est pas encore définie).

Le code entre parenthèses, (et )ainsi de suite, sont actuellement des points de code inutilisés, ils sont tous analysés et chacun provoque une nouvelle chaîne (un peu comme une nouvelle ligne, bien qu'ils n'aient pas pour effet de créer des liens appelables comme une nouvelle ligne, mais ce n'est pas un problème ici car rien ne tente de le faire).


1
Vous pouvez ajouter gratuitement tous les caractères en dehors de la page de codes, car l'interprète les supprime avant de traiter le code. Je ne sais toujours pas ce que signifie non nul.
Dennis

1
Je pense que l'esprit du défi est probablement que les personnages devraient être sur la page. J'ai demandé non-nil et la réponse a été de spécifier une sortie minimale de 1 octet.
Jonathan Allan

@ Dennis une idée de la terminologie correcte pour ce qui se passe avec l'analyse syntaxique entre parenthèses?
Jonathan Allan

Tous les caractères inutilisés commencent un nouveau lien, tout comme une nouvelle ligne.
Dennis

1
Appelons-les comportement indéfini. : P
Dennis

4

TI-Basic (série 83), 93 points (99 sur une TI-84 Plus)

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZθnπeiAnsrandgetKeyZXsclZYsclXsclYsclXminXmaxYminYmaxTminTmaxθminθmaxZXminZXmaxZYminZYmaxZθminZθmaxZTminZTmaxTblStartPlotStartZPlotStartnMaxZnMaxnMinZnMinΔTblTstepθstepZTstepZθstepΔXΔYXFactYFactTblInputNI%PVPMTFVP/YC/YPlotStepZPlotStepXresZXresTraceStep

Tous les chiffres, toutes les variables à un octet (y compris θ et n , les variables indépendantes pour les graphiques polaires et séquentiels), les constantes π, e et i , certaines variables pas tout à fait (Ans , randet getKey), et 59 différents variables de fenêtre (toutes celles dont la définition est garantie).

La multiplication implicite garantit que le résultat sera 0 lorsque nous prenons cela dans n'importe quel ordre. Si cela fonctionne sur une nouvelle calculatrice, toutes les variables seront à 0; même si ce n'est pas le cas, getKeysera 0 car il n'y a pas de temps pour appuyer sur une touche avant que le programme retourne une valeur.

Sur une TI-84 Plus ou plus, nous pouvons obtenir 6 points en ajoutant les jetons getDate, getTime, startTmr, getDtFmt, getTmFmt, isClockOn. Le résultat sera désormais toujours{0 0 0} car getDateet getTimeretournera des listes de longueur 3 et la multiplication implicite sera distribuée sur les éléments.

Je pense que ce sont tous les jetons possibles à utiliser: toutes les commandes réelles sont préfixes, infixes ou postfixes (ce qui signifie qu'elles ne fonctionneront pas au début ou à la fin du programme) et toutes les autres variables peuvent être indéfinies (et provoquer une erreur lorsque utilisé).


C'est intelligent. Pas particulièrement impressionnant haha, mais intelligent en effet! +1
Albert Renshaw

3

(non concurrent) Brainf-ck, 63 octets

Eh bien, je ne sais pas si cela est considéré comme de la triche, mais ...

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Le point imprime le caractère actuel (0x00) et les autres caractères ne font rien. Techniquement, cela pourrait être étendu à l'infini, alors faites-moi savoir si cela est considéré comme de la triche.


Je considérerais une sortie nulle
Albert Renshaw

Oh, dois-je alors supprimer ma réponse ou la marquer comme non concurrente?
brianush1

1
Il y a 97 caractères typables, dont 7 vous ne pouvez pas utiliser (8-1), donc je dirais 90.
Bijan

@ brianush1, vous pouvez le laisser comme non concurrent afin que les autres puissent le voir. Je vais modifier la question un peu plus loin pour expliquer que la sortie doit être d'au moins 1 octet
Albert Renshaw

15
@AlbertRenshaw (désolé pour tous ces commentaires) Si la sortie doit être de 1 octet, alors le caractère NULL devrait compter, car il s'agit d'un octet, bien que celui ayant une valeur de 0.
brianush1

3

Haskell, 3 points

+ 1

Peu importe comment réarrangé ce code retourne toujours une fonction qui incrémente l'entrée. Exemples d'utilisation en repl:

>(+ 1) 1
2
>(1+ ) 1  
2
>( +1) 1
2

2

√ å ı ¥ ® Ï Ø ¿ , 128 234 (?) Points

Je suis arrivé à 128 234 avec l'aide de @DestructibleLemon. Ce programme utilise tous les caractères Unicode (128 237) sauf o, Oetł . Curieusement, deux d'entre elles sont des commandes de sortie.

Certes, cependant, aucune langue ne pourrait utiliser tous ces caractères, non? Eh bien, ce langage ignore simplement les commandes qu'il ne reconnaît pas. Problème résolu.

Cette langue affichera par défaut les éléments suivants:

===== OUTPUT =====



==================

qui est non nul, non nul, non vide et sans erreur.

Remarque: si cela viole une règle non écrite, prévenez-moi dans les commentaires et je changerai cela. Si vous connaissez mon score (en supposant que cela soit autorisé), postez également dans les commentaires.


Quel jeu de caractères utilise-t-il? utf 8? utf-16? Utilise-t-il tout unicode?
Lemon destructible

@DestructibleLemon En regardant sur la page github, il semble utiliser "CP-1252" pour l'encodage.
brianush1

@DestructibleLemon Les commandes sont toutes dans CP-1252 (Windows-1252) mais il acceptera tout caractère Unicode comme syntaxe valide
caird coinheringaahing

Apparemment, il y a 128 237 caractères Unicode, donc vous en auriez 128 234? en.wikipedia.org/wiki/Unicode#cite_note-24
Destructible Lemon

Selon d'autres réponses, il y a apparemment 1 112 064 Unicode, donc je ne suis plus vraiment sûr
Destructible Lemon

1

J, 3 octets

 1

Les caractères 1, l'espace et la nouvelle ligne afficheront toujours 1.



1

Points , 1 114 111 caractères (si vous utilisez unicode).

<87 dots here> Every Unicode character except NUL and . here

Explication:

1                                           leading binary number
1010                                        010 increments the value under the pointer
1010111                                     111 prints out chr(1)

Donc, la chaîne binaire résultante est 1010111, qui est convertie en décimale est 87, nous avons donc besoin de 87 points.

Chaque autre caractère est un commentaire, nous utilisons donc tous les caractères sauf un NUL, car Python3 arrête alors la lecture du fichier, et un point, car les points ne sont pas des commentaires.


0

Prélude , score 1.112.051

(Lorsque l'on considère uniquement l'ASCII imprimable [\t\n -~], le score est de 84. Si l'on considère tous les points de code Unicode , le score est de 1 112 051. )

!
" #$    %&'+,-./0:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(puis ajoutez tous les caractères [\u{7f}-\u{10ffff}]après.)

Imprimez toujours 0.


Prelude est un langage basé sur une pile parallèle, où la pile est pré-remplie avec un nombre infini de 0.

  • +: Pop deux valeurs (toujours 0), ajoutez-les (0) et appuyez pour empiler.
  • -: Pop deux valeurs (toujours 0), soustrayez-les (0) et appuyez pour empiler.
  • #: Ajoutez une valeur et supprimez-la.
  • !: Pop une valeur et sortie sous forme de nombre (toujours 0) (spécification dit "caractère" mais l'interprète dit "nombre"; dans les deux cas, un octet est imprimé)
  • 0: Pousse 0.
  • ^, v,V : Pousse la valeur supérieure du précédent / suivant des programmes parallèles ( les « voix »), mais les piles de toutes les « voix » sont remplis de 0, donc ils poussent toujours 0.
  • autres personnages: no-op.

Il ne faut donc éviter que 13 caractères:

  • (, ): Une parenthèse non appariée provoquera une erreur
  • 1- 9: Nous voulons seulement sortir 0.
  • ?: Nous ne voulons rien saisir.
  • *: Provoque une vérification de cohérence très compliquée pour le code avant et après une ligne composée d'un seul *. Nous devons donc supprimer la nouvelle ligne ou supprimer le *. L'implémentation de référence utilise Python 2 .readline()que pourrait signifier une "nouvelle ligne" \rou \n. Il est donc préférable de simplement supprimer le *.

0

Deadfish , score 86

o.ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghjklmnpqrtuvwxyz?!|[]_-();'"*&^$#@!1234567890+=<>,/\:

Si c'est illégal, il y a aussi

o

(score 1)

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.