J'ai récemment créé un nouveau langage appelé ;#
(prononcé "Semicolon Hash") qui n'a que deux commandes:
;
ajouter un à l'accumulateur
#
modulez l'accumulateur par 127, convertissez-le en caractère ASCII et sortez-le sans nouvelle ligne. Après cela, réinitialisez l'accumulateur à 0. Oui, 127 est correct.
Tout autre caractère est ignoré. Cela n'a aucun effet sur l'accumulateur et ne devrait rien faire.
Votre tâche est de créer un interprète pour ce langage puissant!
Ce doit être soit un programme complet, soit une fonction qui prend un ;#
programme en entrée et produit le résultat correct.
Exemples
Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o
Output: Fizz Buzz output
Program: link below
Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
code-golf
interpreter
caird coinheringaahing
la source
la source
Réponses:
Python 3 ,
6968 octets-1 octet grâce à @WheatWizard
Essayez-le en ligne!
la source
if
. Essayez-le en ligne!JavaScript (ES6),
768280 octetsDémo
Afficher l'extrait de code
Version récursive,
8277 octets5 octets sauvés grâce à Neil
Celui-ci est susceptible de planter pour des entrées de grande taille telles que l'exemple Fizz Buzz.
la source
f(s,a+(c==';'))
pourrait supprimer trois octets de votre version récursive.Retina ,
336636765666259 octetsEssayez-le en ligne!
Version lisible utilisant une syntaxe d'échappement hypothétique :
N'imprime pas les octets NUL, car TIO ne les autorise pas dans le code source.
Imprime également une nouvelle ligne à la fin, mais je suppose que cela ne peut pas être fait autrement.Le retour à la ligne est supprimé grâce à @Leo .-273 (!) Octets grâce à @ETHproductions .
-2 octets grâce à @ovs .
-3 octets grâce à @Neil . Découvrez leur merveilleuse solution à 34 octets .
la source
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
? (y compris les caractères non imprimables en caractères simples, bien sûr)#
dans l'entrée. Vous pouvez résoudre ce problème en changeant votre deuxième étape en(;{127}|;+$)
T`;#\x01-ÿ`\x80\x7F_
\x80+$
(ligne vide)\+T`\x7Fo`\x01-\x80_`\x80[^\x80]
(en utilisant des échappements hexadécimaux pour représenter des éléments non imprimables). Sorties \ x7F au lieu de NULL.Java 8, 100 octets
Essayez-le en ligne!
la source
Consumer<char[]>
:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Japt , 18 octets
Il y a un caractère \ x7f non imprimable après
%#
. Testez-le en ligne!Comment ça fonctionne
la source
q'# ®è'; u# dì¯J
fonctionne également pour le même score.Python , 65 octets
Ceci est un golf de cette réponse précédente.
Essayez-le en ligne! Python2
Essayez-le en ligne! Python3
Explication
C’est une réponse assez simple: nous déterminons le nombre de
;
s entre chaque#
impression et imprimons lechr
mod 127. La seule chose qui pourrait être un peu étrange est le[:-1]
. Nous devons supprimer le dernier groupe car il n'y aura pas de#
suite.Par exemple
Sera divisé en
Mais nous ne voulons pas le dernier
;;;
car il n’ya pas d’#
après pour imprimer la valeur.la source
t
etx
.> <> , 35 octets
Essayez-le en ligne! Remplacez
␡
par 0x7F,^?
ou "supprimer".Boucle principale
Cela prend un caractère de input (
i
), vérifie si sa valeur est inférieure à zéro, c'est-à-dire EOF (:0(
) et termine le programme s'il est (?;
). Sinon, vérifiez si l'entrée est égale à#
(:'#'=
). Si c'est le cas, relâchez la boucle et redémarrez la boucle (?v
...^ ... <
).Contre-logique
Vérifiez si l'entrée est égale à
;
(';'=
). Si c'est le cas, appuyez sur a0
. Sinon, ne faites rien. Cela redémarre la boucle principale.Logique d'impression
Lorsque le caractère saisi est
#
, supprimez-le de la pile (~
), obtenez le nombre de membres de la pile (l
), appuyez sur 127 ('␡'
) et prenez le module (%
). Ensuite, affichez-le sous forme de caractère (o
) et démarrez une nouvelle pile ([0
). Ceci "zéros" sur le comptoir. Ensuite, la boucle redémarre.la source
:0(
:(Python 3, 69 octets
Amélioré, grâce à @Wheat Wizard, @Uriel
la source
:
s.';'==c
économiser un espace, mais ne pas utiliser lesif
déclarations serait encore plus court.Röda ,
443938 octets5 octets sauvegardés grâce à @fergusq
Essayez-le en ligne!
Fonction anonyme qui prend l'entrée du flux.
Si les autres personnages ne doivent pas être ignorés, j'obtiens ceci:
Röda , 20 octets
la source
Ruby,
413534 caractères(
403433 caractères code + option de ligne de commande de 1 caractère)Grâce à:
putc
ne pas utiliser de conversion explicite avec.chr
(6 caractères)Échantillon échantillon:
Essayez-le en ligne!
la source
putc()
. Merci, @Jordan05AB1E ,
161514 octetsCode:
Explication:
Utilise le codage 05AB1E . Essayez-le en ligne!
la source
Gelée , 13 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
semicola
n'existe pas c'estsemicolons
.Code machine x86 sous MS-DOS - 29 octets
Assemblée commentée:
la source
05AB1E ,
252119 octets-2 octets grâce à Adnan
Explication:
Essayez-le en ligne!
la source
i>}
par+
.Retina , 34 octets
Essayez-le en ligne! Comprend un cas de test. Edit: 2 octets enregistrés avec l’aide de @MartinEnder. Remarque: Le code inclut les articles non imprimables et l'utilisation de
&#x;
codes génère des résultats incorrects car le navigateur utilise Windows-1252 au lieu de ISO-8859-1. Explication: La première ligne nettoie l'entrée:;
est changé\x80
,#
à\x7F
( en raison des limitations TIO) et tout le reste est supprimé. Ensuite, chaque fois que nous voyons un élément différent d'un\x80
autre\x80
, nous le supprimons et incrémentons de manière cyclique le code de tout caractère suivant. Ceci est itéré jusqu'à ce qu'il ne reste plus de\x80
caractères. Le code original qui prend en charge les octets nuls soustrait fondamentalement 1 des octets non imprimables, sauf dans la première ligne où\xFF
est inchangé et\x7F
devient\x00
. Avec échappées pour plus de lisibilité:la source
\x80([^\x80]|$)
la dernière étape.\s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?
ne sauve qu’un octet.[^\x80]|\x80$
sauve deux octets, je pense.s
c'est ennuyeux.R,
97908684 octetsUne fonction:
Lorsque R commence,
F
est défini commeFALSE
(numérique0
).Ungolfed:
la source
pryr
s'agit d'un package R, il s'agit toujours du code R.import
alors que dans R, vous pouvez utiliser::
pour accéder directement aux fonctions dans les packages. Vous pouvez souvent voir l'utilisation de packages supplémentaires ici (par exemple, pour Python et Java). Cependant, j'ai changé mon ancien poste parce que je ne voulais pas discuter.Python, 82 octets
la source
Plain TeX, 156 octets
Lisible
la source
C (gcc) , 58 octets
Essayez-le en ligne! (Indice: cliquez sur ▼ Pied de page pour le réduire.)
la source
Perl, 25 octets
Run with
perl -043pe
(compte comme 4 octets, carperl -e
est standard).Explanation:
-043
définit le terminateur de ligne sur#
(ASCII 043).-p
itère sur les «lignes» d'entrée (en fait # chaînes délimitées, maintenant).y%;%%
compte le nombre de;
dans chaque "ligne".x/#/
s'assure que nous n'imprimons pas de caractère supplémentaire pour les programmes qui ne se terminent pas par # (comme le troisième cas de test).%127
devrait être assez évident.$_=
est le passe-partout habituel.la source
;;#;;;
il affiche le numéro 5 au lieu du numéro 2.echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxd
sorties correctement00000000: 02
sur ma machine. Si vous avez omis la043
, ou utilisez une page de codes où#
n'est pas ASCII 043, cela pourrait expliquer votre résultat.CJam, 27 octets
Explication:
Solution alternative, 18 octets
Explication:
la source
;
de supprimer l'accumulateur?F #,
799193 octetsUngolfed
Essayez-le en ligne!
Edit: traitait tout autre caractère que ';' comme '#'. Changé pour ignorer les caractères invalides.
Alternative
F #,
107104 octetsL'utilisation de la cellule de référence enregistre 3 octets
Ungolfed
Essayez-le en ligne
la source
Processing.js (version de Khanacademy), 118 octets
Essayez-le en ligne!
Comme la version de traitement utilisée ne comporte aucune méthode de saisie, l'entrée est placée dans n.
la source
keyTyped=function(){ ... }
: PLabyrinthe ,
61 à47 octetsEssayez-le en ligne!
Explication
L'exécution du code commence dans le coin supérieur gauche et le premier point-virgule supprime un zéro implicite de la pile et continue vers la droite.
Orange
_36
pousse 36 sur la pile. Ceci est pour comparer l'entrée avec#
}
déplace le haut de la pile vers la pile secondaire,
pousse la valeur entière du caractère sur la pile)
incrémente la pile (si c'est la fin de l'entrée, cela fera la pile 0 et le déroulement du programme ira à la@
sortie){
déplace le haut de la pile secondaire vers le haut de la pile principale-
pop y, pop x, appuyez sur x - y. C'est pour comparer l'entrée avec#
(35 en ascii). Si l'entrée était#
le code continuera à la section violette (parce que le haut de la pile est 0, l'adresse IP continue dans la direction dans laquelle elle se déplaçait auparavant), sinon elle passera à la section verte.Violet
127
poussez 127 à la pile%
pop x, pop y, pousse x% y.
faire apparaître le haut de la pile (l'accumulateur) et le sortir sous forme de caractèreDe là, le code gris nous amène dans le coin supérieur gauche du programme avec rien sur la pile.
vert
_24
poussez 24 sur la pile-
pop x, pop y, appuyez sur xy. 24 est la différence entre#
et;
donc ceci vérifie si l'entrée a été;
. Si c'était;
le code continue tout droit vers le)
. Sinon, il se tournera vers le#
qui pousse la hauteur de la pile (toujours un nombre positif, obligeant le programme à tourner à droite à la prochaine intersection et à manquer le code qui incrémente l'accumulateur);
jeter le haut de la pile)
incrémenter le haut de la pile qui est soit un zéro implicite, soit un zéro précédemment incrémenté servant d’accumulateur pour la sortieDe là, le code gris nous mène dans le coin supérieur gauche du programme avec la pile contenant uniquement l'accumulateur.
gris
Les guillemets ne sont pas des opérations,
_
poussent un 0 sur la pile et;
rejettent le haut de la pile. Tout ceci n’est que du code pour forcer le flux de contrôle de la bonne manière et éliminer tout élément supplémentaire du haut de la pile.la source
MATL , 29 octets
L'entrée est une chaîne entre guillemets simples.
Essayez-le en ligne!
Le programme FizzBuzz est trop long pour les interprètes en ligne. le voir travailler hors ligne dans ce gif:
Explication
La valeur de l'accumulateur est implémentée en tant que nombre d'éléments dans la pile. Cela rend le programme plus lent que si la valeur de l'accumulateur était un nombre unique dans la pile, il enregistre quelques octets.
la source
Alice , 22 octets
Essayez-le en ligne!
Explication
Nous ne conservons sur la pile qu'un seul compteur du nombre que
;
nous avons rencontré. Lorsque la pile est vide (par exemple au début du programme), il s'agit implicitement d'un 0.Une version plus courte mais non-terminante de ce programme est disponible ici .
la source
~h
.JS (ES6),
9792 octetsJ'ai essayé d'adopter une approche différente de celle de Shaggy . Tant pis.
la source
; # + , 59 octets, sans compétition
La langue a été faite après ce défi.
Essayez-le en ligne! L'entrée se termine par un octet nul.
Explication
La génération est la même que celle de ma réponse Generate; # code . La seule différence ici est l'itération.
Itération
la source
Bash + coreutils,
4639 octetsEssayez-le en ligne!
Explication
(Merci Cocks Quack pour -7 octets!)
La
tr
partie supprime tous les caractères superflus (je pourrais mettre cela danssed
exactement le même décompte, mais elle ne gérera pas le caractère de saut de ligne correctement, car lessed
laisse dedans et n'atteintdc
que le premier saut de ligne avec?
)sed
prend le reste et construit undc
programme:Les chaînes de
;
deviennent des chaînes de1
(un long littéral)#
devient.ZC7%P
(si cela suit une chaîne de1
, le.
est un point décimal pour un non-op. Mais si c'est au début du programme, ou après un autre#
, c'est un littéral0
. Ensuite, il prend la longueur du nombre, le modifie, et imprime l’ASCII correspondant.)la source
;
intérieur'...'
et pouvez simplement changerdc -ez?
pourdc
. En plus de cela, au lieu d’;
ajouter 1 à la pile, vous pouvez les regrouper et obtenir leur longueur en utilisantZ
pour atteindre ce tio.run/##S0oszvj/… .dc -ez?
était une conséquence de la nécessité d'un zéro supplémentaire pour démarrer le programme) Mais votre programme ajoute une sortie supplémentairestderr
dans les cas consécutifs#
ou des entrées ne se terminant pas par#
(dans les deux cas, je veux dire après la suppression des caractères superflus) . Je ne sais pas s’il existe un consensus, mais j’ai le sentiment que la production supplémentaire invalide la solution. J'ai cependant adapté votre idée et je me suis retrouvé à un octet de plus que votre suggestion sansdc
générer d'erreurs!#
s consécutifs à causeZ
de0
is1
, elle génère donc 0x01 au lieu de 0x00 (je suis également tombé dans le même piège, mais mon navigateur affiche les fichiers non imprimables sous forme de codes hexadécimaux, donc j’ai attrapé cela).C
65 6460 octets(-2 grâce à ceilingcat)
la source
c
à zéro pour rendre la fonction réutilisable .c=0
, et je ne voudrais pas tricher en copiant la réponse de Dennis.