Ceci est mon premier défi sur ppcg!
Contribution
Une chaîne composée de deux caractères ASCII différents. Par exemple
ABAABBAAAAAABBAAABAABBAABA
Défi
La tâche consiste à décoder cette chaîne en suivant ces règles:
- Passer les deux premiers personnages
- Diviser le reste de la chaîne en groupes de 8 caractères
- Dans chaque groupe, remplacez chaque caractère par
0
si ce caractère est identique au premier caractère de la chaîne d'origine,1
sinon par - Maintenant, chaque groupe représente un octet. Convertir chaque groupe en caractère à partir du code de caractère octet
- Concaténer tous les personnages
Exemple
Décodons la chaîne ci-dessus.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Notez que A
c'est le premier caractère de la chaîne d'origine et B
le second. Par conséquent, remplacez chaque A
avec 0
et chaque B
avec 1
. Maintenant nous obtenons:
00110000 00110001 00110010
qui est [0x30, 0x31, 0x32]
en binaire. Ces valeurs représentent les caractères ["0", "1", "2"]
respectivement, donc le résultat final devrait être 012
.
Notation
Il s’agit bien sûr de code-golf , ce qui signifie que votre code doit être aussi court que possible. Le score est mesuré en octets.
Contraintes et format IO
Les règles standard s'appliquent. Voici quelques règles supplémentaires:
- Vous pouvez supposer une entrée valide
- La chaîne d'entrée consiste en exactement deux caractères différents
- Les deux premiers personnages sont différents
- La longueur minimale de la chaîne d'entrée est de 2 caractères
- La longueur donnera toujours 2 modulo 8
- Vous pouvez supposer que la chaîne sera toujours composée uniquement de caractères ASCII imprimables.
- À la fois dans l'entrée et dans la chaîne décodée
- Les espaces de début et de fin sont autorisés dans la sortie (tout ce qui correspond
/\s*/
)
Réponses:
brainfuck ,
76 7165 octets-6 octets grâce à Nitrodon!
Essayez-le en ligne!
On se sent bizarre de battre Python ...
la source
Stax ,
15 à11 octetsExécutez-le et déboguez-le sur staxlang.xyz!
Approche rapide 'n' dirty. Travailler à l'améliorer.Je l'ai amélioré!Décompressé (13 octets) et explication
la source
JavaScript (Node.js) , 67 octets
Essayez-le en ligne!
Comment?
Nous utilisons deux syntaxes différentes du
Buffer
constructeur:Buffer([n])
génère un tampon contenant le seul octet n et est contraint au caractère ASCII correspondant. Seuls les 8 bits les moins significatifs de n sont pris en compte.Buffer(n)
génère un tampon de n octets. Par conséquent,Buffer(0)
génère un tampon vide, qui est contraint à une chaîne vide.Remarque: ils sont tous deux obsolètes dans les versions récentes des nœuds.
Buffer.from([n])
etBuffer.alloc(n)
devrait être utilisé à la place.Commenté
la source
bash,
595852 octetsEssayez-le en ligne!
Merci à Cocks Quack pour la sauvegarde de 6 octets.
Ce défi fonctionne remarquablement bien avec une série de coreutils (et
dc
d'effectuer la conversion et la sortie à la fin). Tout d'abord, nous utilisonspour translittérer les deux caractères de l’entrée en zéros et en uns. Le
-t
drapeau tronque le premier argument à la longueur du second, ce qui revient à translittérer les deux premiers caractères de l’entrée to0
et1
, c’est ce que nous souhaitons. Ensuite,supprime les deux premiers caractères, et
affiche 8 caractères par ligne. Enfin, la
sed
commande transforme chaque ligne en undc
extrait qui lit le nombre sous forme binaire et génère cet octet.la source
cut -c
peut être supprimé)Code machine Z80 sur un Amstrad CPC,
32 3130 octetsLe code prend l'instruction de remplacer chaque caractère par
0
si ce caractère est identique au premier caractère de la chaîne d'origine,1
sinon avec littéralement et sans se soucier de vérifier qu'un caractère correspond au deuxième caractère de la chaîne d'entrée. Il vérifie simplement que le caractère est identique au premier caractère et différent du premier.Je courus des registres (le Z80 ne dispose de 7 facilement utilisables registres 8 bits, le besoin de repos plus longues instructions) donc je mets
&01
enH
, avec l' aideL
de construire le caractère ASCII (je viens de réaliser qu'il est inutile d'initialiserL
, sauver un octet ). En cas deH
débordement dans le drapeau Carry, le caractèreL
est prêt à être sorti. Heureusement, il existe un 16 bitsADC
( Ad d avec C arry) qui remplit le rôle d'instruction de décalage à gauche.(DE)
ne peut être luA
que bien que(HL)
peut être lu dans n’importe quel registre de 8 bits, c’était donc un compromis que l’on utilisait. Je ne pouvais pas comparer(DE)
avecC
directement, donc je devais en charger un enA
premier. Les étiquettes ne sont que des mots aléatoires qui commencent parL
(une exigence de l’assembleur).A
l'accumulateur - le seul registre qui peut faire des comparaisonsB
le compteur enregistrepour l'instruction. En réarrangeant le code, j'ai pu faire le travailDJNZ
: D ecrement (B
) et J ump si N sur Z eroDJNZ
avec un octet de moins.C
le premier caractère de la chaîne d'entréeD
,E
commeDE
adresse du caractère saisiH
le déclencheur de retenue (chaque 8ème boucle)L
le caractère de sortie en cours de constructionla source
05AB1E , 10 octets
Essayez-le en ligne!
-3 grâce à emigna.
la source
01‡
place de la boucle. EDIT: ou même mieux:¦¦Sk8ôJCçJ
J,
1713 octets-4 grâce à FrownyFrog
Ancienne version:
Explication:
Exemples:
la source
2}.1{=
économiser 4 octets.[:
au début :)Python 2 , 77 octets
Essayez-le en ligne!
la source
R , 71 octets
Essayez-le en ligne!
Étonnamment golfy!
D'abord, convertit la chaîne en points de code ascii avec
utf8ToInt
, en l'enregistrant sousy
. Supprimer les deux premiers caractères avec indexation négative est plus court que d’utilisertail
.Le tableau
y[-1:-2]==y[2]
est équivalent aux bits lorsque%*%
(multiplication de matrice) est appliqué, mais nous reformulons d'abord ce tableau en unmatrix
avecnrow=8
, en convertissant un tableau linéaire en groupements d'octets. Heureusement, nous pouvons ensuite convertir les points de code ascii en utilisant la multiplication de matrice avec les puissances appropriées de 2,2^(7:0)
puis nous reconvertissons les points de code en chaîne avecintToUtf8
.la source
Python 3 , 77 octets
Essayez-le en ligne!
la source
PHP,
7371 octetsExécuter en pipe
-nR
ou essayer en ligne .golfs:
-6
et pré-incrémenté par8
strtr
ignore les caractères excessifs dans le paramètre long (passubstr
nécessaire)10
, puis inverser, ne nécessite pas de guillemets -> -1 octet~
sert de limite de mot -> -1 octet.la source
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 octets11 octets sauvés grâce à FryAmTheEggman.
Essayez-le ici
Explication
la source
Ruby ,
8279 octetsEssayez-le en ligne!
la source
.join
peut être remplacée par*''
, ets[0..1]
pars[0,2]
.Japt, 11 octets
L'essayer
Explication
la source
s2
raccourci, gentil.Multiple + Précision PHP + GNU,
6361Malheureusement, l’extension GMP n’est pas activée par défaut (mais livrée).
Courez comme ça:
la source
<?=
enregistre 2 octets et éventuellement le jour. ;-)-R
(j'ai essayé).-F
placeHaskell , 75 octets
Essayez-le en ligne!
la source
Java 8,
143142141 octets-1 octet grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Explication:
la source
Python 3 ,
9986 octetsEssayez-le en ligne!
Merci à ASCII-seulement pour l'essentiel vraiment tout
la source
APL + WIN, 30 octets
Origine de l'index 0. Invites pour la saisie d'une chaîne
Explication:
la source
Rouge , 110 octets
Essayez-le en ligne!
Explication:
Une solution simple et directe, pas intégrée.
la source
Google Sheets, 123 octets
L'entrée est dans la cellule
A1
. Google ajoutera automatiquement)))
à la fin de la formule.Explication:
Mid(A1,3+8*(Row(A:A)-1),8)
saisit des morceaux de caractères 8 à la fois, en commençant par le troisième.Substitute(Mid(~),Left(A1),0)
remplace chaque instance du premier caractère par 0.Substitute(Substitute(~),Mid(A1,2,1),1)
remplace le deuxième caractère par 1.Char(Bin2Dec(Substitute(~)))
convertit le bloc en décimal, puis en ASCII.IfError(Char(~,""))
corrige toutes les erreurs qui résultent du fait queRow(A:A)
renvoie beaucoup plus de valeurs que nous, ceBin2Dec
qui nous donne beaucoup de valeurs nulles et desChar
erreurs sur zéro.ArrayFormula(Join("",IfError(~)))
réunit tous lesChar
résultats etArrayFormula
fait en sorte que leRow(A:A)
retour d'un tableau de valeurs au lieu de la première valeur.la source
Ruby ,
6142 octets-19 octets grâce à benj2240
Essayez-le en ligne!
la source
pack
C’est un choix inspiré, mais pour le moment, vous faites un peu le chemin. Il peut faire encore plus de travail pour vous.Perl 5
-lp
, 34 octetsEssayez-le en ligne!
la source
REXX, 41 octets
Essayez-le en ligne!
la source
Python 2 , 88 octets
Essayez-le en ligne!
Pas le plus court - juste un moyen alternatif.
La version suivante imprime la sortie sur une ligne pour 98 octets, bien que les règles stipulent que les espaces de fin sont autorisés:
Essayez-le en ligne!
la source
/\s*/
.C # (compilateur Visual C #) , 158 octets
Essayez-le en ligne!
la source
Perl 5
-p
, 40 octetsEssayez-le en ligne!
la source
Scala , 95 octets
Essayez-le en ligne!
la source
Haskell ,
12410593 octetsEssayez-le en ligne!
f
convertit la chaîne en une liste de bits en comparant chaque caractère au premier, en transformant leBool
s en zéros et en uns avecfromEnum
.g
divise cette liste en groupes de 8, les convertit en décimales et prend la valeur du nombre obtenu en tant queEnum
, ce quiChar
est une instance de.Changements:
map
dans la fonction)take
en zippant avec une liste plus courte)la source
toEnum
remplacerchr
l'importation. Aussi lemap
peut être inclus dansg
. L'espace entre8 s
peut être supprimé.Forth (gforth) , 83 octets
Essayez-le en ligne!
L'entrée est une chaîne Forth standard (adresse et longueur), la sortie est imprimée sur stdout
Explication
la source