De nombreux utilisateurs de PPCG ont aidé à la création de ce défi, à la fois dans le chat et dans le bac à sable, en particulier Martin Ender , AdmBorkBork , Emigna et user202729
Notre communauté a jugé nécessaire de créer un ensemble de langues spécialement conçues pour le golf, des «langues de golf» comme nous les appelons. De tels langages ont évolué du GolfScript autrefois brillant et désormais maladroit aux langages concis élégants tels que Jelly et Husk . Comme nous pouvons le voir, ces langues sont de plus en plus courtes pour un ensemble de tâches. Donc, en tant qu'experts incontournables ici en ce qui concerne les langues de golf, nous devons concevoir ensemble un langage pour battre toutes les autres langues qui osent rivaliser. Présentation de Bugle!
Bugle: De l'acronyme BuGoL: Bu ilt Go lfing L anguage.
Comment ce défi fonctionnera
Dans le cas où vous n'avez pas compris ce à quoi je fais allusion dans l'introduction, ce défi est un défi de chaînage des réponses où nous contribuons chacun quelque chose à l'interprète d'une nouvelle langue de golf, améliorant ainsi sa capacité à participer au PPCG avec chaque réponse.
Je posterai la première réponse composée de la base de la spécification de langue / interprète, et toutes les autres réponses continueront à partir de là. Les nouvelles soumissions fourniront les éléments suivants:
- Un changement aux spécifications de la langue
- Un interprète à jour, répondant exactement à ce qui est prévu dans les changements
- Le score mis à jour de la langue (plus de détails dans un peu)
Vous pouvez modifier la spécification de trois manières:
- Vous pouvez ajouter une seule commande
- Vous pouvez ajouter deux nouvelles commandes
- Vous pouvez modifier le comportement d'une commande existante
Concernant le nouvel interpréteur, vous devez utiliser la dernière version, écrite en Python. Il n'est pas nécessaire de jouer au golf. Chaque commande précédemment ajoutée doit pouvoir être testée avec le dernier interpréteur, ainsi que la ou les commandes les plus récentes (celle que vous ajoutez). Vous ne devez pas non plus utiliser un langage offensant à tout moment lors de la mise à jour de l'interpréteur, comme dans les commentaires ou les chaînes de caractères, etc.
La ou les commandes ajoutées peuvent faire tout ce que vous souhaitez . Les seules exigences sont:
- Il ne produit pas de sortie offensante
- Ce n'est pas la même chose qu'une autre commande
- Cela n'empêche pas la réalisation d'un des exemples de défis
En dehors de ceux-ci, cela peut être aussi spécifique ou aussi général que vous le souhaitez. Il peut également s'agir de n'importe quel personnage souhaité. Si vous n'êtes pas sûr que votre ajout constitue une «nouvelle commande», n'hésitez pas à demander dans les commentaires.
Le score de la langue
Vous avez peut-être remarqué que vous devez inclure le score de la langue dans toutes les nouvelles soumissions. Son score est ce qui empêche ce défi d'aller indéfiniment, et est défini comme suit:
Le score actuel est la somme des décomptes d'octets nécessaires à la langue pour effectuer les 20 tâches ci-dessous.
Pour chacune des tâches, les règles d'E / S standard s'appliquent , tout comme les failles standard .
Les 20 tâches:
- "Bonjour le monde!" - Sortie de la chaîne
Hello, World!
- 1, 2, Fizz, 4, Buzz - Affiche chaque entier de 1 à 100 (inclus) sur une ligne distincte, les multiples de 3 étant remplacés par
Fizz
, les multiples de 5 étant remplacés parBuzz
et les multiples des deux parFizzBuzz
- Produisez le nombre 2014 sans aucun nombre dans votre code source - Sortez le nombre 2014 sans utiliser aucun des caractères
0123456789
du code source, sans accéder à des variables externes ou des graines aléatoires - Obfuscated Bonjour tout le monde - la chaîne de sortie
Hello, World!
, sans utiliser de caractères dans au moins deux des ensembles suivants:hlwd
,eor01
et27
(insensible à la casse) Chantez Joyeux anniversaire à votre langage de programmation préféré - Dans un langage de votre choix, sortez les éléments suivants:
Happy Birthday to You Happy Birthday to You Happy Birthday Dear [the name of your favourite programming language] Happy Birthday to You
Nous ne sommes pas étrangers au code du golf, vous connaissez les règles, et moi aussi - Générez les paroles complètes de "Never Gonna Give You Up"
- Afficher le signe - Étant donné un nombre, imprimer -1 s'il est négatif, 0 s'il est 0 ou 1 s'il est positif
- Conjecture de Collatz (OEIS A006577) - En partant d'un entier, divisez-le par 2 s'il est pair, ou multipliez-le par 3 et ajoutez 1 s'il est impair, et répétez le processus jusqu'à ce que vous atteigniez 1. La sortie doit être le nombre d'itérations qu'il vous amène à atteindre 1.
- Un tableau de défis # 1: tableaux alternatifs - Étant donné un tableau d'entiers, vérifiez si tous les éléments indexés pairs sont égaux et tous les éléments indexés impairs sont égaux, et affichez une valeur vraie ou fausse en conséquence
- Suis-je un tableau insignifiant?- Étant donné un tableau d'entiers, vérifiez si les différences absolues entre les éléments consécutifs sont toutes inférieures ou égales à 1, et émettez une valeur véridique ou fausse en conséquence
- Est-ce que ce nombre est un nombre premier?- Étant donné un entier positif, écrivez un programme complet pour vérifier s'il est premier et affichez une valeur vraie ou fausse en conséquence
- Je suis un palindrome. Es-tu?- Étant donné une chaîne, vérifiez si elle est palindrome, alors que votre programme / fonction est également palindrome, et affichez deux valeurs distinctes et cohérentes en conséquence
- Additionnez les chiffres sur la norme en - Prenez une série de nombres dans STDIN et sortez leur somme.
- Trouver le factoriel - Étant donné un entier
n
, affichez le produit de tous les entiers entre1
etn
inclus. - Code le plus court pour produire une sortie infinie - Sans aucune entrée, produire une sortie infinie, qui, en théorie, ne cessera jamais de sortir.
- Cuire une tranche de Pi - Sortez ce texte exact:
()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
\::\433832|
\::\79502|
\::\8841|
\::\971|
\::\69|
\::\3|
\__\|
- Trouver le plus petit nombre qui ne divise pas N - Étant donné un entier positif N, sortir le plus petit entier positif qui ne divise pas N.
- Est-ce pair ou impair?- Étant donné un entier N, sortir sa parité en tant que valeurs véridiques / fausses.
- Sortie avec la même longueur que le code - Écrivez le code le plus court dont la sortie a la même longueur que le code, où la sortie n'est pas la même que le code.
- Jouez au golf pour le bien! - Écrivez le quine le plus court dans votre langue.
Pour être valide, une nouvelle soumission doit contenir des soumissions pour au moins 2 des problèmes, par au moins 1 octet pour chacune. Vous pouvez augmenter la longueur des autres soumissions, mais le score total doit diminuer d' au moins 2 par réponse. Veuillez également envisager d'inclure un lien vers les programmes mis à jour. Les solutions mises à jour ne doivent pas fonctionner lorsqu'elles sont exécutées avec une version précédente de l'interpréteur.
Comment obtenir des cookies
J'ai une liste de 5 défis, qui ne sont pas obligatoires pour tenter, et n'ont aucune incidence sur votre score, mais sont simplement des défis supplémentaires pour tester si Bugle est suffisamment capable. N'hésitez pas à inclure une solution à n'importe quel nombre d'entre eux dans votre réponse:
- Créer un auto-interprète
- Créer un quine capable de charge utile
- Covfefify une chaîne
- Hyperprogrammation: N + N, N × N, N ^ N tout en un
- "NŒUD" ou "NON"?
Les descriptions ne sont pas incluses car elles ne sont pas requises pour que tout le monde puisse participer au défi.
Comment gagner
Une fois que le score minimum ( nous pensons être 16, bien que toutes les tentatives de golf vers le bas soient les bienvenues) a été atteint, la chaîne est évidemment terminée car les solutions ne peuvent pas obtenir un meilleur score. Une fois 16 ans atteints, le défi reste vivant pendant 1 mois après, pour donner à chacun une chance de jouer au golf les solutions. Après ce mois, le défi est terminé.
Une fois le défi terminé, je migrerai l'interpréteur sur un référentiel GitHub, et passerai par les machinations habituelles de la libération d'un langage stable. Vous pouvez également commencer à publier des solutions aux défis sur PPCG en ce moment, en utilisant ledit langage, mais veuillez ne pas inonder la première page de réponses. Au lieu de cela, répartissez-les sur une période de temps.
Mise en forme
Afin de faciliter la recherche d'informations dans votre réponse, veuillez les formater comme suit:
# [N]. [Score]
[New command + description]
[Interpreter/link to interpreter]
[Link to programs]
Où [N]
est votre numéro de réponse (1 pour le premier, 2 pour le second, etc.)
Règles
- Vous devez attendre 3 heures entre la publication des réponses
- Vous ne pouvez pas poster deux fois de suite, sauf si aucune réponse n'a été publiée pendant 10 jours (exactement 240 heures)
- Vous ne pouvez pas supprimer les commandes précédentes.
- Votre interprète n'a pas besoin d'être joué au golf, et son nombre d'octets est complètement hors de propos ici.
- Si quelqu'un suggère un golf aux programmes alors que votre réponse est la plus récente, vous devez modifier les golfs et mettre à jour votre score.
- Vous pouvez également le faire lorsque votre réponse est au milieu de la chaîne, tant que votre score ne devient pas inférieur à toutes les réponses ultérieures.
- Veuillez vous abstenir de répondre à tous les défis PPCG existants en utilisant cette langue, au moins jusqu'à ce que le défi soit terminé.
- L'interpréteur est écrit en Python 3 et devrait continuer de cette façon tout au long de la chaîne. Changer la langue est interdit.
- Encore une fois, pour être valide, une nouvelle soumission doit contenir des soumissions pour au moins 2 des problèmes, par au moins 1 octet pour chacune.
Commençons!
la source
Hello, World!
, alors c'est 19 octets. Mais si le comportement du programme vide change, en fonction de l'entrée, il peut être réduitfor
boucles) sont autorisées et encouragées à être ajoutéesRéponses:
3. Score:
293825832532 (-51)Le nouvel interprète est ici .
Principalement dans le but de jouer au quine et de faciliter la sortie, j'ai ajouté la possibilité de dupliquer la pile / deque et également de sortir le modèle entier sous forme de texte rendu plutôt que sous forme d'entiers.
Solutions
1. "Bonjour tout le monde!" - 17 octets (-3)
5. Chantez Joyeux anniversaire à votre langage de programmation préféré - 95 octets (-3)
6. Nous ne sommes pas étrangers au codage du golf, vous connaissez les règles, et moi aussi - 1884 octets (-3)
16. Cuire une tranche de Pi - 149 octets (-3)
20. Jouez au golf pour le bien! - 23 octets (-39)
Fonctionnalités linguistiques ajoutées
a
#"Hello, World!"a
impressionsHello, World!
d
la source
2. Score:
29382583L'interpréteur modifié est ici sur TIO .
Le littéral de chaîne est l'ajout le plus évident au langage, principalement pour lutter contre les défis de complexité kolmogorov .
Solutions
1. "Bonjour tout le monde!" - 20 octets (-28)
Tout défi de complexité kolmogorov peut être complété à l'aide de la structure
#"<string>"[o>]
qui génère la chaîne donnée jusqu'au 0 après que la chaîne est atteinte.2 1, 2, Fizz, 4, Buzz -
41964 octets (-1332)Merci à @ user202729 pour avoir joué au golf à ce sujet.
3 Produisez le numéro 2014 sans aucun nombre dans votre code source - 9 octets (-4)
Utilise les deux caractères 20 et 14 dans les codes codés Bugle.
4. Bonjour le monde obscurci - 19 octets (-153)
Répond aux règles # 1 (non
HLWDhlwd
) et # 3 (non27
).5. Chantez Joyeux anniversaire à votre langage de programmation préféré - 98 octets (-230)
6. Nous ne sommes pas étrangers au codage du golf, vous connaissez les règles, et moi aussi - 1887 octets (-5006)
16. Cuire une tranche de Pi - 149 octets (-290)
20. Jouez au golf pour le bien! - 62 octets (-12)
Fonction de langue ajoutée
"..."
: Chaîne littérale.\n
est géré comme les autres caractères."
(34) dans la mémoire à l'aide de cette commande. Ce n'est pas un problème trop important, du moins pour l'instant, car tous les défis de complexité kolmogorov répertoriés ici n'ont pas"
dans la sortie.Tout autre golf est toujours le bienvenu, en particulier pour "Never Gonna Give You" et la quine. Plus précisément, le quine ci-dessus est le premier quine non trivial que j'ai jamais fait, donc je crois fermement que quelqu'un peut en proposer un plus court.
la source
1. Résultat: 9638
L'interprète de base peut être trouvé ici , et les soumissions ici . C'est assez long, donc je l'ai inclus sur GitHub, plutôt que de reprendre la majeure partie du message.
Solutions
Toutes ces solutions sont des programmes Unicode, exécutés avec l'
-u
indicateur de ligne de commande, mais les scores sont comptés comme s'ils étaient encodés avec la page de codes de Bugle.1. "Bonjour tout le monde!" - 48 octets
Appuyez simplement sur puis sortez le code de caractère de chaque caractère de la chaîne.
2. 1, 2, Fizz, 4, Buzz - 1396 octets
Même technique que le Hello, World! Exemple
3. Produisez le numéro 2014 sans aucun nombre dans votre code source - 13 octets
#
utilise la bande,+
incrémente la cellule,O
sort comme un entier et-
décrémente4. Hello World obscurci - 172 octets
Utilise sa similitude inhérente au brainfuck. Répond aux règles # 1 et # 3
5. Chantez Joyeux anniversaire à votre langage de programmation préféré - 328 octets
Tous les défis de complexité kolmogorov ont ce type de structure, pour le moment.
6. Nous ne sommes pas étrangers au codage du golf, vous connaissez les règles, et moi aussi - 6893 octets
7. Afficher le signe - 18 octets
Vérifie si l'entrée est supérieure à zéro, inférieure à zéro (modifiée pour donner
-1
au lieu de1
) et égale à zéro, avant de prendre leur somme.8. Conjecture de Collatz (OEIS A006577) - 36 octets
Cela effectue le bouclage sur la pile, mais bascule sur la bande pour incrémenter le nombre à chaque itération.
9. Un tableau de défis # 1: tableaux alternatifs - 35 octets
Ceci est une légère modification de la réponse de Mitch Schwartz au défi existant, votez pour!
10. Suis-je un tableau insignifiant? - 46 octets
Tout le crédit va à Emigna pour faire ce
11. Ce nombre est-il un nombre premier? - 31 octets
Utilise le théorème de Wilson et calcule
(n-1)!² % n
12. Je suis un palindrome. Es-tu? - 13 octets
La première moitié du programme, jusqu'à
O
, définit la pile comme[x, x]
oùx
estTrue
ouFalse
.O
affiche la valeur supérieure et la génère. Le reste du programme s'assure simplement qu'aucune erreur n'est produite. Heureusement, lorsque?
rencontre la fin du fichier, il pousse simplement''
(la chaîne vide).13. Additionnez les nombres sur la norme en - 19 octets
Cela peut être divisé en deux parties:
?:[?:];
etL0s[+L1s-]
. La première partie collecte toutes les entrées de la pile. La deuxième partie pousse la somme des deux éléments supérieurs, tandis que la longueur est supérieure à 1.14. Trouvez le factoriel - 25 octets
Il a une structure similaire au programme de somme, mais au lieu de pousser plusieurs entrées, le
[:1s-:];
pousse la plage de1 .. n
la pile et[×L1s-]
prend le produit.15. Code le plus court pour produire une sortie infinie - 5 octets
Utilisez une boucle while, avec le
1
continuellement sous le pointeur. Sorties1
pour toujours.16. Cuire une tranche de Pi - 439 octets
17. Trouvez le plus petit nombre qui ne divise pas N
Cela utilise la division d'essai, se terminant lorsque le résultat du modulo n'est pas égal
0
.18. Est-ce pair ou impair? - 5 octets
Modulo simple par 2
19. Sortie avec la même longueur que le code - 16 octets
Sort les 16 premiers caractères ASCII imprimables à l'envers:
0/.-,+*)('&%$#"!
20. Jouez au golf pour le bien!
Le crédit va à user202729 pour faire ce
Spécification de la langue
Appel
bugle.py
prend actuellement une série de drapeaux, puis le nom / code du fichier à exécuter. Pour l'instant, il dispose de 4 drapeaux de ligne de commande:-f
/--file
spécifie que le code doit être lu à partir d'un fichier-c
/--cmd
/--cmdline
spécifie que le code est fourni via la ligne de commande.-c
et-f
ne peut pas être utilisé dans le même appel-u
/--unicode
indique à l'interpréteur de lire le code avec l'encodage Unicode. La valeur par défaut est d'utiliser l'encodage de Bugle ci-dessous-l
/--length
affiche la longueur du fichier, en octets, vers STDERR après exécutionL'appel suivant a été utilisé pour tester les soumissions ci-dessus
Page de code
Bugle utilise 512 caractères dans sa page de codes. Le
0xFF
caractère ne doit pas être utilisé pour une commande , car il est utilisé pour indiquer que la prochaine valeur hexadécimale à indexer dans la seconde moitié de la page de code. Les caractères utilisés sont:Ou voyez-le sous forme de tableau . Notez que
\t
et\n
représentent respectivement tab et newline. Notez également que la 16e ligne se termine par un caractère non imprimable:,et peut ne pas s'afficher sur tous les navigateurs.
Mémoire
L'interpréteur dispose actuellement de 5 modèles de mémoire. Chaque modèle de mémoire nécessite un caractère pour dire à l'interpréteur de commencer à utiliser ce modèle:
$
): une pile standard, qui prend en charge les valeurs poussées, sautées, etc.#
): Une bande, à la brainfuck, qui au départ n'est0
art.G
): une grille 2D, infinie dans les deux sens, contenant uniquement0
sD
): Un deque , tel qu'implémenté par lecollections
module.S
): une valeur unique, qui peut être utilisée pour stocker une valeur.La grille a également une valeur unique enregistrée dans son pointeur qui peut être écrite ou écrite dans des cellules.
De plus, les tailles de bande et de grille et le comportement de wrapping peuvent être modifiés à l'aide d'une commande d'invocation différente. Ces différentes commandes prennent un nombre donné de valeurs du modèle de mémoire actuel comme paramètres de personnalisation:
À
): prend deux valeurs - size (int
) et wrapping (bool
)Á
): prend une valeur - taille (int
). Enveloppe à la fin de la bandeÂ
): prend une valeur - taille (int
). Ne s'enroule pas à la finǴ
): prend 4 valeurs - x size (int
), y size (int
), x wrap (bool
) et y wrap (bool
)Le type de mémoire utilisé peut changer pendant un programme à l'aide de
₀₁₂₃₄₅₆₇₈₉
, qui accède aun
type de mémoire utilisé indexé 0 (₀
est le premier,₁
est le deuxième, etc.), mais, actuellement, les valeurs ne peuvent pas être échangées entre différents types de mémoire.Ramification
Jusqu'à présent, Bugle a deux commandes de branchement, toutes deux terminées par un
]
caractère:Tandis que (
[
): boucles while de style brainfuck. Ces pop une valeur de la pile / deque si elle est utilisée, ou accéder à la cellule sous le pointeur dans la bande / grille.Exemple:
#?[-O]
compte de l'entrée jusqu'à0
Si / sinon (
{
et}
). Exécution unique en boucle. Si la valeur sautée est fausse, la clause if est ignorée, passant à la clause else, séparée par}
. Ils se comportent de la même manière que les boucles while concernant l'accès à la mémoire.Exemple:
{0}1]
est une porte NOT logiqueFonctions intégrées
Les séries de chiffres sont interprétées comme des entiers, et sont simplement poussées / écrites telles quelles dans le modèle de mémoire actuel.
Évidemment, j'ai équipé Bugle de quelques fonctions intégrées de base, aussi peu que possible, pour permettre aux autres d'en ajouter plus à mesure que la chaîne progresse. Les commandes de base sont les suivantes:
+
-
%
:
;
<
=
>
?
L
O
R
Z
^
h
o
r
n
temps de deque , oùn
est la valeur maximales
…
×
÷
la source