Introductions
Une matrice booléenne 2 × n peut être représentée par une chaîne de quatre caractères . ':
. La chaîne a une "rangée supérieure" et une "rangée inférieure", avec des points représentant les 1 et des espaces vides représentant les 0. Par exemple, la matrice 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
peut être représenté comme ' '. :
. Votre tâche consiste à prendre une matrice sous cette "forme comprimée" et à faire pivoter ses entrées d'un pas dans le sens des aiguilles d'une montre, à la manière d'un tapis roulant.
Contribution
Votre entrée est une chaîne unique sur les caractères . ':
. Sa longueur est garantie d'être d'au moins 2.
Sortie
Votre sortie doit être la chaîne d'entrée, mais avec chaque point tourné d'un pas dans le sens des aiguilles d'une montre. Plus explicitement, les points de la rangée supérieure se trouvent à un endroit à droite, sauf le plus à droite, qui se déplace vers le bas. Les points de la rangée inférieure se déplacent d'un pas vers la gauche, sauf le plus à gauche qui monte. En particulier, la chaîne de sortie doit avoir la même longueur que l'original et les espaces sont significatifs.
Exemple
Considérons la chaîne d'entrée :..:'.
, qui correspond à la matrice 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
La version tournée de cette matrice est
1 1 0 0 1 1
1 1 1 0 1 0
qui correspond à la chaîne ::. :'
.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus faible gagne et les failles standard sont interdites. Vous pouvez décider si l’entrée et la sortie sont entre guillemets, et une nouvelle ligne est également acceptable dans les deux cas.
Cas de test
Ces cas de test sont entre guillemets.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(retourner 2 parties afin que je puisse augmenter je, moins regexp et plus simple test, enregistrer prev c dans q)Perl,
706964636160 octetsComprend +2 pour
-lp
Exécuter avec la chaîne d'entrée sur STDIN, par exemple
rotatedots.pl
:Explication
L'espace
n'est pas converti dans le code ci-dessus. Pour les calculs
/2
et*2
il se comportera comme et deviendra0
. Dans les autres positions, il fera partie du "ou", mais les 1 bits de l’espace sont un sous-ensemble des 1 bits de0
et auront le même effet que0
s’ils étaient marqués avec un des chiffres. Ce n'est que si le personnage avec lequel il est écrit est un espace qu'il restera un espace au lieu de devenir un0
. Mais ce n'est pas grave, car de toute façon0
, nous aurions été reconvertis dans l'espace.la source
Rétine , 66
Explication
En commençant par l'entrée:
Les 4 premières étapes construisent la matrice, en utilisant respectivement
1
/e
pour true et0
/f
pour false pour les lignes du haut et du bas. Les rangées supérieure et inférieure sont entrelacées. Cela donnerait une chaîne comme:Cependant, ces 4 étapes déplacent également efficacement la rangée inférieure 1 vers la gauche, simplement en inversant l'ordre des lettres et des chiffres:
L'
T
étape de ré-écriture inverse les chiffres hexadécimaux pour les premier et dernier caractères uniquement, c'est-à-dire remplace0-9a-f
parf-a9-0
. Cela a pour effet de déplacer le caractère en bas à gauche jusqu'à la rangée supérieure et le personnage en haut à droite vers la rangée inférieure:L'étape suivante remplace ensuite chaque paire de lettres et de chiffres, déplaçant ainsi la rangée supérieure 1 vers la droite. Auparavant
(\D)(\d)
, c'était(.)(\d)
suffisant , mais il s'avère que cela est suffisant car les substitutions se font toujours de gauche à droite et les deux derniers chiffres ne seront donc pas identiques, car l'avant dernier caractère aura déjà été substitué. La matrice a maintenant été entièrement pivotée selon les besoins:Les 4 dernières étapes sont ensuite traduites au format original:
Essayez-le en ligne.
Tous les cas de test, un par ligne , sont
m
ajoutés à laT
ligne pour permettre un traitement séparé de chaque ligne d'entrée.la source
Jelly,
323029 octetsNotez l'espace de fuite. Essayez-le en ligne! ou vérifier tous les cas de test .
Contexte
Nous commençons par considérer la chaîne d'entrée (par exemple,
:..:'.
) et son inverse.Pour chaque caractère de la rangée du haut, nous vérifions s'il appartient à
':
, et pour chaque caractère de la rangée du bas s'il appartient.:
. Cela donne le tableau 2D de booléensqui est la matrice de la question, avec la ligne inférieure inversée.
Nous supprimons le dernier booléen de chaque ligne, inversons l'ordre des lignes, ajoutons des booléens dans leur ordre d'origine et, enfin, inversons la ligne du haut.
Cela donne la matrice tournée de la question.
Enfin, nous considérons chaque colonne de booléens comme un nombre binaire et un index
'.:
pour obtenir les caractères appropriés.Comment ça fonctionne
la source
Pyth,
38362 octets grâce à Jakube!
Essayez-le ici ou lancez la suite de tests .
Explication:
la source
L,hb_eb
est plus court d'un octet et.DR2T
crée également le produit cartésien et quelques paires supplémentaires, mais pas dans un chiffre et permet d'économiser de l'espace..D
astuce est vraiment cool!Python 3,
145141130 octetsExplication
La solution golfée utilise la propriété suivante de zip: peut
zip('ABCD', 'xy') --> Ax By
donczip(a[:l],a[l:])
être remplacée parzip(a,a[l:])
et permet de supprimer la définition del
Résultats
la source
Pyth, 66 octets
Essayez-le ici!
Explication
Cela peut être décomposé en 3 parties:
Convertir une entrée
C'est assez trivial. Chaque caractère est mappé de la manière suivante:
Le premier est un espace blanc.
Nous obtenons une liste de 2-tuples que nous transposons pour obtenir les 2 lignes de la matrice qui est ensuite aplatie.
Code
Tourner
Nous avons la matrice sous forme de tableau à plat dans
J
et la largeur de la matrice dansK
. La rotation peut être décrite comme suit:Code
Le reconvertir
la source
Python 3,
166154153150146138137135132127 octetsEdit: J'ai emprunté l'utilisation de la réponse Python
zip
d' Erwan à la fin de la fonction.et leur idée d'utiliser desEn fin de compte, les renversements n'étaient pas une bonne idée pour ma fonction. J'ai changé mon utilisation[::-1]
inversions, bien que je mette ma propre tournure.format
pour continuer à jouer au golf. Déplacéa
etb
directement danszip
pour jouer au golf (le non-golf reste inchangé car la séparation dea
etb
il est utile pour éviter l'encombrement dans mon explication)Edit: emprunté
(some number)>>(n)&(2**something-1)
à cette réponse par xnor pour le challenge Music Interval Solver . Le fouillis qui se trouvezip(*[divmod(et cetera, 2) for i in input()])
peut probablement être mieux joué au golf, bien que j'aime bien l'opportunité qu'il procure d'utiliser deux nt
- uplets etv
.Ungolfed:
la source
Rubis,
166163 octetsBeurk ...
transpose
c'est trop long.Astuces utilisées ici:
sprintf('%02b',x)
à convertir"0"
,"1"
,"2"
,"3"
en"00"
,"01"
,"10"
et"11"
respectivement. Étonnamment, le deuxième argument ne pas nécessaire de convertir en un entier.La rotation se fait via
a[1].push a[0].pop;a[0].unshift a[1].shift;
, ce qui me paraissait au moins un peu malin (sinon trop bavard en Ruby). La symétrie est esthétique quand même: Pla source
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 octets
Je mappe chaque caractère à un équivalent binaire à deux chiffres
et je pense à eux comme étant l'un sur l'autre
Je garde ça pour n
Pour chaque caractère (0-3) de n, je vérifie ses voisins, en ajoutant le bit de plus haut ordre du voisin de gauche au bit de plus bas ordre du voisin de droite. si i == 0 (premier caractère), j'utilise son propre bit d'ordre inférieur au lieu du bit d'ordre supérieur du voisin de gauche.
Si n [i + 1]> - 1, cela signifie que nous avons 0,1,2,3. Lorsque c'est faux, nous passons au dernier élément.
Lorsque cela se produit, j'utilise le bit le plus élevé du personnage au lieu du bit inférieur du voisin de droite
carte qui retourne à la
.':
terre et rejoindre ce tableau en arrière ensemblela source
MATL ,
4039 octetsEssayez-le en ligne! La version liée a été
v
remplacée par&v
, en raison de changements de langue après la publication de cette réponse .la source
JavaScript, 311 octets
Peut probablement être amélioré beaucoup:
la source
s[i-1]
? Cela pourrait économiser des octets.s[i+1]
.<
au lieu de vous==
pourrait peut - être vous faire économiser pas mal d’octets. Vous voudrez peut-être aussi passer à la caisse. Astuces pour jouer au<
au lieu de==
JavaScript (ES6),
237210204188182178 octetsCrédit à @Downgoat pour la sauvegarde de 16 octets dans la révision de 188 octets
Mise à jour: j'ai eu une onde cérébrale et j'ai réduit la première opération
s
à un seulmap
appel au lieu de deux appels séparésJolie impression et explication
la source
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
marche?Perl,
144142137131 octetsOctet ajouté pour le
-n
drapeau.À peu près le même algorithme que ma réponse Ruby , juste plus court, parce que ... Perl.
Obnoxieusement,
@a=(shift@b,@a)
c'est plus court queunshift@a,shift@b
.Hélas, ils ont la même longueur:
Merci à Ton Hospel pour 5 octets et à msh210 pour un octet!
la source
..@a
au lieu de..$#a
? (Peut-êtreoct
meurt ou renvoie 0 ou quelque chose. Je ne l'ai pas essayé.)//g
sprintf
tellement long.map$_%2,/./g
etmap$_/2|0,//g
presque doit être plus courte (non testée)Python 3,
294287283 octetsWaaayyyyyy trop longtemps, mais je vais essayer de jouer au golf de quelques octets:
la source
Lua, 139 octets
Usage:
la source