Dans ce défi, vous allez écrire un interprète pour un langage simple que j'ai composé. La langue est basée sur un seul accumulateur A, qui a exactement une longueur d'un octet. Au début d'un programme, A = 0. Voici les instructions relatives aux langues:
!
: Inversion
Cette instruction inverse simplement chaque bit de l'accumulateur. Chaque zéro devient un et chaque devient un zéro. Simple!
>
: Décaler à droite
Cette instruction déplace chaque bit dans A un endroit vers la droite. Le bit le plus à gauche devient un zéro et le bit le plus à droite est supprimé.
<
: Décalage à gauche
Cette instruction décale chaque bit dans A un endroit à gauche. Le bit le plus à droite devient un zéro et le bit le plus à gauche est supprimé.
@
: Echangez des Nybbles
Cette instruction permute les quatre bits supérieurs de A avec les quatre bits inférieurs. Par exemple, si A est 01101010
et que vous exécutez @
, A sera 10100110
:
____________________
| |
0110 1010 1010 0110
|_______|
C'est toutes les instructions! Simple, non?
Règles
- Votre programme doit accepter une entrée au début. Ce sera une ligne de code. Ce n'est pas un interprète interactif! Vous ne pouvez accepter qu'une entrée et vous n'avez pas besoin de revenir au début une fois que cette ligne a été exécutée.
- Votre programme doit évaluer ladite entrée. Tout caractère non mentionné ci-dessus est ignoré.
- Votre programme devrait alors imprimer la valeur finale de l'accumulateur, en décimal.
- Les règles habituelles pour les langages de programmation valides s'appliquent.
- Les failles standard sont interdites.
- C'est le code-golf , le plus petit nombre d'octets gagne.
Voici quelques petits programmes pour tester vos soumissions. Avant la flèche est le code, après c'est le résultat attendu:
!
->255
!>>
->63
!<@
->239
!nop!&6*!
->255
Prendre plaisir!
la source
! -> 255
qu'à partir de cela, nous devrions utiliser 8 bits par octet ici? La question n'est pas explicite.Réponses:
Pyth,
3635 octetsHarnais de test
La représentation interne de l'accumulateur est un entier. Ce nombre entier est modifié par 256 à chaque itération, comme vous le souhaitez. Les opérations effectuées sont
-G-1
,G/2
,G*2
etG
converties en base 16, inversée, et à l' arrière converti en base 10, oùG
est l'accumulateur.J'ai raté la ligne à propos d'ignorer tout le reste. Ceci a été corrigé. Merci, Dennis.
la source
-G-1
est plus court qu'en~G
Pyth? J'en doute un peu.t_G
, où_
est la négation ett
est-1
. En Pyth,~
signifie quelque chose de totalement différent.~
(bitwise PAS)C, 96
En supposant que l’entrée ASCII (ou compatible):
Tidier:
Fondamentalement, il s'agit simplement d'une collection d'expressions ternaires imbriquées. J'incrémente la valeur obtenue à partir de
getchar()
sorte qu'un EOF (-1) donne une valeur de zéro et que le programme se termine.(lien ideone)
la source
!<>
devrait entraîner127
et non255
). Définissez votre ena
tant quechar
, ou utilisez la lignea&=255
(et utilisez%u
) pour obtenir le bon effet. Aussi, vous pouvez raccourcir votre négationa^255
à~a
.a>>4&15
est également plus courte que votre(a&240)/16
.%u
au lieu de%hhu
a/16|a*16
place dea/16|(a&15)*16
. Les quelques bits en haut sont enlevés par le&255
.a*257/16
est un octet plus court quea/16|a*16
.Python 3, 133 octets
Utilise un dictionnaire pour compenser un manque de syntaxe de casse en Python. Voir plus ici .
L'accumulateur est une chaîne qui est convertie en un nombre de base 10 à la fin.
Exemple I / O:
la source
for i in sys.stdin:
:)Javascript (ES6),
809190 octetsÀ peu près aussi court que possible. Définit une fonction anonyme qui prend le programme en entrée.
!
, prendx XOR 255
, comme JS~
envisageraitx
un nombre 32 bits.<
, multipliex
par 2 et prend le résultat mod 256.>
, décale vraiment les bits dex
1 bit vers la droite.@
, les solsx/16
et les ajoutex%16*16
.Merci à @vihan pour avoir suggéré d'utiliser
reduce
pour sauvegarder un octet.la source
<
pour économiser environ 4 octets. Réduire peut également économiser des octets<
à la place de==
? Si tel est le cas, cela ne fonctionnerait pas, car les caractères non-op ne procéderaient pas correctement à une opération. Je l'ai utilisé dans ma précédente solution de 80 octets.CJam, 37 octets
Essayez-le en ligne dans l' interprète CJam .
Comment ça marche
la source
Java (8),
514483411366359239224229198194187186184182181180177 caractèresWow, cela a été beaucoup joué au golf! Merci à tous ceux qui m'ont fait des suggestions! Je l'apprécie énormément!
Golfé 31 (!) Octets en optimisant l'échange de nibble avec des opérations au niveau des bits, par opposition à des
Integer.???
méthodes longues .Golfé 72 caractères (!!!!) en supprimant la chaîne inutile créée pour permuter les petits bouts. Beaucoup mieux qu'avant !?
Golfé 45 (!!) caractères en supprimant l'utilisation
java.util.Scanner
et la lecture deSystem.in
directement. Notez que maintenant que l'expression lambda a disparu, Java 8 n'est plus requis! Tout simplement Java 1 ferait!Golfé 7 caractères en faisant classe
(default)
(public
mot-clé supprimé ), grâce à @bmarksGolfé 120 (!!!!!!!) personnages en tournant toutes ces
Integer
opérations de classe longues dans le bit basculant vers255 - a
. Maintenant c'est beaucoup plus court!Golfé 15 (!) Caractères en convertissant les décalages en multiplication et division, en supprimant les accolades de la déclaration while et en rendant
a
local lamain
méthode.Ungolfed 9 = (caractères à cause d'un problème avec le décalage gauche ne supprimant pas l'octet le plus à gauche. Par conséquent, je le fais maintenant
mod (256)
. Le décalage droit réduira le bit numéro un plus court qu'avant, il n'est donc pas nécessaire d'utilisermod
le décalage droit. Mon truc interchangeable échangera les 4 derniers bits et l'avant-dernier nibble, etand (&)
tronquera tous les autres bits. Mon programme d'inversion ne pose aucun problème si le nombre d'origine est inférieur à 256.Golfé
3135 caractères grâce à @Geobits en convertissant uneswitch
déclaration en plusieurs déclarations ternaires et en convertissant des caractères en entiers, raccourcissant les littéraux.Golfé 7 caractères en supprimant inutile
&240
dans le swap de swap ((a&240)>>4
àa>>4
et convertir(a&15)<<4
ena<<4&240
. Le dernier changement a joué au golf cependant un personnage.Golfé 1 caractère en supprimant inutile
=
dansa /= 2
, cara = a /= 2
est équivalent àa = a / 2
.Golfé 2 personnages en se tournant
println
versprint
.Golfé 2 caractères en supprimant accidentelle
a=
dansa=255-a
(a=a=255-a
est équivalent àa=255-a
)Golfé 1 caractère en se transformant
a<<4&240
ena%16<<4
.Golfé 1 caractère en ajoutant des parenthèses à l'extérieur de la déclaration ternaire et en faisant
%256
. De cette façon, le%16
n'est pas nécessaire dans la partie gauche du swap. Les crochets ajoutent 2 caractères et les%16
enregistre 3 caractères.3 caractères golfed en changeant
class
deinterface
et la suppression enpublic
utilisant la fonction de la méthode d'interface statique Java 8. Merci à @TheNumberOne (pas de commentaire, mais trouvez sa réponse sur "Astuces pour jouer au golf en Java"la source
Integer
les méthodes de classe.switch
jouer au golf. Lescase
/break
sont trop long. Vous devriez être capable de sauver beaucoup de monde en faisant de l’ensemble un ternaire; quelque chose commea=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;
Rouille,
121 à115 octetsÉchantillon échantillon:
Ungolfed:
Étonnamment court pour Rust. Rien d’autre vraiment intéressant à part le fait que j’ai appris plus de règles de préséance aujourd’hui - qui savait
(a>>b)|c
c’est la même chosea>>b|c
?Rasé un octet en changeant
n>>=1
àn/=2
; Cependant, on ne peut pas faire la même chose avec la multiplication, car un dépassement arithmétique est une panique (un crash) dans Rust.la source
>>
est sorte de comme la division et|
est sorte de comme l' addition.HP 41C / CV / CX (? Octets, 42 étapes)
Purement pour rire, le voici pour la calculatrice HP 41C / CV / CX. (Nécessite le module Extended Functions ou un module 41CX pour la fonction ATOX.) Malheureusement, la calculatrice ne signale pas la taille des programmes en octets.
Mettez votre programme dans le registre Alpha, ce qui est un peu délicat, car il n'y a aucun moyen d'entrer! ou @ directement à partir du clavier (utilisez XTOA avec les codes ASCII 33 et 64, respectivement, pour les ajouter).
Les étapes 08 et 10 permettent d’ignorer les codes non valides; supprimez-les pour enregistrer 2 étapes, mais le programme se bloquera sur une entrée non valide.
la source
Python 2, 79 octets
J'ai réalisé que j'avais déjà fait quelque chose de très similaire à cela en Python. Ceci n’est qu’un portage de ma réponse Ruby , mais c’est d'ailleurs la réponse la plus courte en Python: D
La différence avec la version de Ruby est que celle-ci n'ignore pas les instructions non valides lors d'une itération sur l'entrée. Au lieu de cela, je profite du fait que Python a tendance à renvoyer
-1
au lieu denil
quand il n'y a pas de correspondance - La valeur actuelle dea
est ajoutée à l'arrière du tableau de résultats, de sorte que toutes les instructions non valides correspondent à la même valeur inchangée.la source
Python 3,
1249493 octets"!" est identique à soustraire de 255.
"<" équivaut à multiplier par 2. Mais le registre à 8 bits signifie mod 256.
">" est identique à la division entière par 2.
"@" signifie décaler les 4 derniers bits (
a%16
) de 4 bits (*16
) et en ajoutant les quatre premiers bits (a/16
).EDIT (lire copie sans vergogne)
Vu l'autre réponse en python (par Beta decay). Il utilise un moyen très efficace pour simuler des cas de commutation en utilisant un dictionnaire. En utilisant ça on peut écrire
Merci, Beta Decay.
la source
256
non? Alors pourquoi ne pas le faire à la fin:a={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256
. Cela vous évite immédiatement un octet (parce que vous le fereza*2
au lieu dea<<1
) ... mais la réponse de @daniero montre également que si vous le faites de cette façon, il(a%16)<<4
est possible de le raccourcira<<4
, car tout bit de 16 ou plus sera éliminé une fois multiplié. par 16 et le réduire mod 256. Nice! En outre, vous pouvez maintenant remplacer255-a
par-1-a
... ou mieux, simplement~a
. Au total, ces suggestions devraient vous faire économiser 9 octets.Haskell, 89 octets
Exemple d'utilisation:
f "!>>"
->63
la source
Rouille, 111 octets
Plus d'un commentaire sur la réponse de @ Doorknob, mais je n'ai aucun représentant pour les commentaires, car je viens de créer un compte.
On peut raser 10 octets de sa solution Rust avec ce qui suit:
la source
Python 3, 127 octets
Edit: court-circuit, merci @ Jakube
Edit2: corrige, merci @Anachor
la source
!<
510
254
Ceylan,
297290Formaté:
#f
et#f0
sont des nombres hexadécimaux pour les quartets,.byte
convertit un entier en octet. J'ai de la chance que Byte.string
attribut utilise déjà la représentation non signée d'un octet. Ceylan comporte également une instruction switch sans basculement, et une chaîne de caractères est une liste de caractères pouvant être itérés.J'ai également essayé de réduire ces noms de méthode de décalage long en utilisant une importation de repliement de spectre, mais cela devient en réalité 7 octets plus longs:
Formaté:
Cela pourrait être utile si nous avons besoin de ces méthodes un peu plus souvent.
la source
Rubis,
8173 octetsTellement plus simple - pas d'eval! Pour chaque caractère valide de l'entrée, il évalue chaque instruction et recherche l'instruction appropriée à l'aide de l'index de
$&
(le caractère actuel de l'entrée).la source
STATA, 197 octets
Ungolfed
Ne fonctionne pas avec l'interpréteur en ligne et requiert l'interpréteur par défaut non libre. Ce serait un peu plus facile avec les opérations au niveau des bits, mais je ne pense pas qu'elles soient trop utiles pour la plupart des utilisations courantes de STATA.
la source
JavaScript, 104
Les opérateurs ternaires imbriqués mappent les instructions.
BITWISE AND est utilisé pour contraindre notre type Number à un seul octet.
la source
Julia,
117948673 octetsC'est une fonction anonyme qui accepte une chaîne et renvoie un entier. Pour l'appeler, assignez-le à une variable.
Ungolfed:
Sauvegardé 8 octets grâce à Sp3000 et 13 grâce à Dennis!
la source
JavaScript (ES6), 76
81En tant que fonction non nommée renvoyant la valeur de l'accumulateur
Ceci est un portage des réponses super intelligentes de @daniero (qui ont trop peu de votes positifs)
Bonus: vous pouvez passer une valeur initiale de l'accumulateur. Si non passé, la valeur de départ est 0 comme spécifique.
Testez l'exécution de l'extrait ci-dessous dans n'importe quel navigateur EcmaScript 6 (j'ai testé dans Firefox)
la source
Crystal, 139 octets
la source
C # 193
la source
using System;
ou quelque chose comme ça pour accéderConsole.ReadLine
etConsole.Write
sans leSystem.
préfixe?byte
pour chaque opération, mais je peux me tromper.Lua, 344 car.
Inspiré par l'utilisation par @Beta Decay d'un accumulateur de chaîne, vu que lua n'a aucun type d'octet. Pourrait probablement être joué davantage en utilisant moins de fonctions.
la source
R, 194 octets
non-golfé
la source
<-
peut être remplacé par=
ici, réduisant ainsi le code de 7 octets. De plus, vous pourrez peut-être remplacer la série deif
déclarations par un appel àswitch
(comme dansA=switch(r,"!"=(A+1)%%2, ...)
)b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))
est 167 octets.RPL, 170,5 octets
L'entrée doit être entrée sous forme de chaîne au niveau 1.
la source
K, 57 octets
C'est un début:
testé avec Kona:
Je pourrais peut-être faire mieux en k5, mais c'est une série complexe de compromis - par exemple, convertir du binaire en décimal est aussi facile que
2/
, mais le comportement de?
rend plus difficile la gestion d'un cas par défaut pour la recherche d'instruction.la source
PHP, 189 octets
Ce n'est pas que ça va battre beaucoup de réponses, c'est seulement pour la pratique
la source
HPPPL ,
302294 octetsUngolfed:
Cette réponse garantit que le HP Prime utilise des entiers 8 bits non signés, même si le mode est défini sur 64 bits par exemple par l'utilisateur. Si la calculatrice est configurée manuellement pour utiliser des entiers décimaux à 8 bits non signés, la
pragma
commande peut être omise. Si la sortie n'a pas à suivre strictement le format,a*1
la fin peut simplement l'êtrea
. En multipliant le résultat par 1, on s'assure simplement que la sortie ne suit pas la sortie interne pour les valeurs entières. Laprint
commande de la ligne 4 peut également être omise si le terminal n'a pas besoin d'être effacé avant l'impression du résultat. Si le passage du programme en tant qu’argument de chaîne est autorisé, alors leINPUT
commande peut également être omise.C'est la version la plus courte avec entrée et sortie correcte, sans l'argument pragma (si la calculatrice est définie sur Uint8 par défaut:
243 octets:
la source
Perl 6,
9689 octetsAncienne solution:
la source
C #, 119 octets
Les autres versions que j'ai essayées, mais qui nécessitent plus d'octets:
la source
Python 2.7.3, 104 octets
Avoir du code dans les chaînes à évaluer est plutôt sale, mais ça marche: D
Voici la sortie (et l'entrée en fait ..)
Et oui, ça marche vraiment sur un RaspberryPi :)
la source