En tant que programmeur, vous avez probablement entendu parler de barres obliques et de barres obliques inversées. Mais avez-vous entendu parler de slashs? C'est à ce moment-là que vous prenez une série de barres obliques, connectez leurs extrémités et dessinez-les en descendant.
Pour le défi d'aujourd'hui, vous devez écrire un programme ou une fonction qui prend une chaîne composée uniquement de barres obliques et qui les affiche toutes en une ligne. Ce sera beaucoup plus clair si vous voyez un exemple. Étant donné la chaîne \\\//\/\\
, vous devriez générer:
\
\
\
/
/
\
/
\
\
Voici quelques clarifications:
Il doit y avoir une barre oblique par ligne.
La première ligne aura 0 espaces de début.
Pour chaque paire de barres obliques:
S'ils sont différents les uns des autres, ils seront dessinés dans la même colonne. Par exemple,
\/
donnera:\ /
S'ils sont identiques, le caractère inférieur est orienté dans la direction indiquée , c'est-à-dire qu'il se déplace vers la droite pour une barre oblique inverse et vers la gauche pour une barre oblique. Donc
\\//
va donner\ \ / /
Chaque ligne peut avoir des espaces de fin supplémentaires, à condition que cela ne modifie pas l'apparence visuelle de la sortie. Il est également possible d’acquérir jusqu’à une nouvelle ligne précédente et suivante. Les espaces supplémentaires ne sont pas autorisés !
Afin de garder cela plus simple, vous pouvez supposer que la chaîne ne contiendra jamais trop de barres obliques. En d'autres termes, aucun préfixe de l'entrée ne contiendra plus de barres obliques que de barres obliques inverses. Une entrée telle que \\////
ou //
ne sera jamais donnée. Cela signifie également que chaque entrée commencera par une barre oblique inverse.
Si votre entrée est considérée comme un littéral de chaîne, vous pouvez échapper les barres obliques inverses si cela est nécessaire. En outre, vous ne devrez jamais gérer une entrée vide ou contenant des caractères autres qu'une barre oblique.
Vous pouvez sortir par n'importe quel format raisonnable .
Comme d’habitude, il s’agit d’un défi de code-golf . Essayez donc de trouver la solution la plus courte possible, même si vous choisissez une langue qui est assez difficile. Des points bonus pour expliquer toutes les techniques intéressantes que vous utilisiez pour enlever des octets!
Exemples
#Input
\\\\\\\\\\\
#Output
\
\
\
\
\
\
\
\
\
\
\
#Input
\\\//\\/\//\\///
#Output
\
\
\
/
/
\
\
/
\
/
/
\
\
/
/
/
#Input
\/\/\/
#Output
\
/
\
/
\
/
Réponses:
GNU Sed, 20
Notez que
^L
et^H
sont des caractères littéraux d’alimentation et de retour arrière (0x12 et 0x8).Cette réponse fonctionne en déplaçant le curseur en utilisant des caractères de retour arrière et de saut de page. Les barres obliques / barres obliques inverses ne sont pas complétées par des espaces - Une incertitude à ce sujet disqualifie cette réponse. Cela ne fonctionne pas dans TIO, mais cela a l'air bien sous les terminaux courants tels que
xterm
etgnome-terminal
.Recréez ce script sed comme suit:
Exécutez-le comme suit:
Explication:
la source
Charbon de bois ,
131211 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Soutient extra
//
s. Explication:la source
↓¶
= "Déplacer à gauche" dans la description n'est pas correct.\n/
vers le bas"print \n/ down
parce que j'estimais qu'il était plus utile de décrire l'effet du code plutôt que sa traduction littérale.MyCode - Do the spec
). Je comprends maintenant si l’effet est de bouger à gauche; Cela peut valoir la peine de dire "Déplacer à gauche (en imprimant une nouvelle ligne avec une direction d’impression vers le bas)".Python 2 ,
5554515753 octets-3 octets (et un correctif) grâce à Felipe Nardi Batista
Essayez-le en ligne!
la source
/// , 119 octets
/// n'a pas de commande d'entrée, l'entrée doit donc être intégrée au programme. Pour celui-ci, la chaîne d'entrée est simplement ajoutée, sans échappement nécessaire.
-d
option (état du programme indiqué entre parenthèses avant l'exécution de chaque commande).Comment ça fonctionne
\\/\//
sera ajoutée au programme pour démonstration.
est utilisé pour représenter les nouvelles lignes dans le code en ligne.Les abréviations
Le début
/=/\/\///M/|%%=N/%|||=C/BA=
du programme contient des substitutions aux abréviations de golf.=
se développe vers//
,M
vers|%%
,N
vers%|||
etC
versBA
.Après cela, le programme actuel devient
Recodage des entrées
L'étape suivante transforme la chaîne d'entrée ajoutée en une forme plus utilisable. Comme il est entièrement composé de deux caractères de commande ///, cela évite de modifier le programme de base.
/\/\\/\/BA\\/
, remplace la chaîne/\
par/BA\
./\
à ce moment, donc cette substitution ne l'affecte pas.\
s suivies de séquences de/
s, qui, combinéesABA
au bout du programme de base, permettent de le parcourir avec les substitutions suivantes.ABA
préfixe avant, l'exemple de chaîne d'entrée devientABA\\/BA\//
./BA\\/BAbBA/
, remplaceBA\
parBAbBA
.\
s de la chaîne d'entrée, qui devient désormais préfixe.ABAbBAbBA/BAbBA//
/B\A\//BAfBA/
modifications apportéesBA/
àBAfBA
, itérant à travers le par/
.\
dans cette substitution est nécessaire car sinon elle serait mutilée par la précédente.ABAbBAbBAfBABAbBAfBAfBA
./AB//
supprime certaines parties superflues de l'encodage, le transformant enAbBAbBAfBAbBAfBAfBA
.AB
de la/|/AB\\/
substitution plus tard dans le programme, ce qui était nécessaire pour la protéger de ce qui précède la/\
manipulation.\
chaîne d'entrée d'origine est devenueAbB
et chaque chose/
est devenueAfB
. (b
etf
se tenir pour aller et retour.) Il y a un vagabondA
à la fin.A
s etB
s par des fragments de programme à exécuter dans la dernière étape. Dans les chaînes de remplacement,%
s et|
s codent ce qui deviendra respectivement/
s et\
s. Cela a deux avantages:/
et\
, les%
s et|
s n'ont pas besoin de s'échapper pour être copiés./\
, qui aurait autrement été endommagée par les manipulations précédentes./|/\\/
(anciennement/|/AB\\/
) décode maintenant le|
s, après quoi le suivant/%/|//
est devenu/%/\//
et décode le%
s.Structure du programme au stade final
À ce stade, le programme de base a exécuté toutes ses substitutions et il ne reste que l'encodage par programme de la chaîne d'entrée.
Chaque caractère saisi est devenu un sous-programme
(nouvelle ligne), où
*
représente soitf
un original/
, soitb
un original\
./\//xy
à la fin du programme, qui n'aura d'effet que sur la nécessité de fournir une/
substitution nécessaire au sous-programme précédent.Sous-chaîne partagée
Avant le début de l'itération finale à travers les sous-programmes, une sous-chaîne traverse la limite après le sous-programme de chaque caractère du formulaire
\//
./
, qui ancre les substitutions) sera exécutée pour imprimer la ligne correspondante. personnage./
, qui est la "ligne précédente" imaginaire appropriée pour imprimer le premier caractère saisi au début de sa ligne.\\
ou d'\/
une nouvelle ligne et d'un texte suivant/
.Exécuter un sous-programme de personnage
Plusieurs des substitutions suivantes contiennent des éléments supplémentaires à l'
\
intérieur pour les empêcher d'être appariés et mutilés (y compris d'autres copies dans d'autres sous-programmes). La réalisation de c'est aussi la raison pour laquelle les deuxx
ety
sont nécessaires./\//xyf\z/
ou/\//xyb\z/
, entraîne la/
fin de la sous-chaîne partagéexyfz
ouxybz
, immédiatement après le\/
ou\\
./\\\\x\y/ /
remplace\\xy
par un espace, et la substitution/\\\/x\y//
remplace\/xy
par rien.\
ou/
.\
suivant, suivi defz
oubz
./ \fz/\\\/\//
remplace fz
par\//
et/b\z/\\\\\//
remplacebz
par\\/
./
ou\
, respectivement./
correctement.///
une boucle qui est une boucle infinie./
à la fin de la sous-chaîne partagée.Une fois que le dernier sous-programme a été exécuté, il ne reste que le programme
/\//xy
. Comme il s’agit d’une substitution incomplète avec une finale manquante/
, le programme la saute et s’arrête normalement.la source
Gelée , 14 octets
Un programme complet imprimant le résultat.
Essayez-le en ligne!
Comment?
la source
Haskell , 49 octets
Essayez-le en ligne!
la source
Perl 5 , 44 octets
42 octets de code + 2 pour le
-F
drapeauEssayez-le en ligne!
la source
JavaScript (ES8),
665963 octets7 octets enregistrés grâce à Justin Mariner
+4 octets à corriger
/\\/\\/
(remarqué par Neil )Essayez-le en ligne!
la source
MATL ,
231918 octets1 octet sur grâce à @Sanchises
L'entrée est une chaîne entre guillemets simples.
Essayez-le en ligne! Ou vérifiez les cas de test: 1 , 2 , 3 .
Explication
Considérez l'entrée
'\\\//\/\\'
comme un exemple.la source
C # (.NET Core) ,
748882787776 + 18 octets-1 octet grâce à Kevin Cruijssen
Sort une collection de chaînes, une pour chaque ligne. Le nombre d'octets comprend également:
Essayez-le en ligne!
Explication de la réponse sur 77 octets:
la source
/\\/\\/
.s.Take(i).Sum(y=>y<92?-1:1)+(x-s[0])/45+1
pour(x-s[0])/45-~s.Take(i).Sum(y=>y<92?-1:1)
05AB1E , 14 octets
Essayez-le en ligne!
Explication
la source
/\\/\\/
.Ç¥.¥0<.SηOv¹Nèy<ú,
sanglotant en binaireR ,
122121 octets-1 octet grâce à Giuseppe
Essayez-le en ligne!
Avec des espaces supplémentaires:
Explication: Cette réponse est basée sur l'observation que le nombre d'espaces en tête change de chaque ligne de -1, plus le nombre d'espaces
/
des lignes précédentes et actuelles.Si nous avons N barres, la variable
y
est un vecteur de longueur N, avec 1 pour chaque position avec\
, sinon 0. Par conséquent, nous calculons pour obtenir le changement du nombre d'espaces en tête par ligney[1:(N-1)] + y[2:N] - 1
. La fonctiondiffinv
convertit ces différences en une séquence commençant par 0. Le reste consiste simplement à assembler chaque ligne en tant que nombre requis d'espaces de fin, suivie de la barre oblique appropriée et d'un retour à la ligne.la source
diffinv
;) Vous pouvez également définiry=x>")"
pour -1 octetstrsplit
ce qui est toujours un tueur. Vous pouvez également utiliser le célèbrediffinv
!library(methods)
dans l'en-tête (ce qui devrait être OK sans pénalité puisque ce paquetage fait partie de la base R), vous pouvez l'utiliserel
. En outre,diffinv
s'est avéré être aussi long quecumsum
! :)*S
fout les choses.Brain-Flak , 175 octets (174 caractères + 1 drapeau)
Courir avec un
-c
drapeau.Essayez-le en ligne!
Explication
la source
Ruby ,
8076 octets-4 octets grâce à manatwork
Essayez-le en ligne!
Explication:
la source
.each_cons(2){…}
. Dans le changement, vous pouvez enregistrer en remplaçant.each_char
→.chars
.i+=
au début de l'expression ternaire imbriquée et en la terminant par-1:1:0
.Java 8,
121118110109102 octets-7 octets grâce à la magie au niveau des bits de @ Nevay . :)
Explication:
Essayez ici.
la source
a->{String r="";int s=0,p=0,i;for(char c:a){for(i=s+=p+(p=c-63)>>5;i-->0;r+=" ");r+=c+"\n";}return r;}
>>
/>>>
/<<
... Je n'avais vérifié que certaines choses avec&
/|
/~
/^
..>.C (GCC),
13713497 octetsEssayez-le en ligne!
• 3 octets merci ATaco
• 37 octets grâce à Digital Trauma & ThePirateBay
Rien de bien plus qu'une simple fonction récursive qui prend une chaîne et affiche les barres obliques; notez que l'entrée doit d'abord échapper aux barres obliques inverses.
Usage
Ungolfed
Ceci est pour l’ancienne réponse, consultez le lien d’essai en ligne pour la mise à jour!
Sortie
la source
c=='\0'
par!c
pour le même effet.printf("%*s%c", n, "", c)
pour imprimer le caractère c avec n espaces de début?(c!=n)
avecc-n
et en réarrangeant les expressions ternaires. Même avec(c=='/')
. En outre, vous pouvez remplacer'/'
par un nombre littéral47
. Je pense que c'est 7 octets au total.C, 60 octets
Essayez-le en ligne!
la source
Retina , 47 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Ajoutez un espace au début et à la fin de chaque ligne
\
.Considérons les deux premiers caractères de la chaîne. Si le premier est un,
/
le retrait doit être décrémenté; ceci est réalisé en incluant l'espace précédent dans la capture (qui existe toujours car le premier étage l'a ajouté); si le second est un,\\
il doit être incrémenté; ceci est réalisé en incluant l'espace que la première étape a ajouté dans la capture. Après avoir donné le deuxième tiret correct, la scène est répétée pour les deuxième et troisième caractères, etc.Supprimer le retrait supplémentaire.
J'ai écrit une version de 94 octets qui (comme ma réponse Charcoal) autorise toute combinaison de barres obliques: essayez-le en ligne! Explication:
Faites rouler la balle en prenant la dernière barre oblique et indentez-la à la même position sur sa propre ligne.
Préfixez les espaces à toutes les barres obliques afin qu'elles puissent être capturées.
Prenez à plusieurs reprises la dernière barre oblique de l'entrée et alignez-la sur sa propre ligne avec la barre oblique de la ligne ci-dessous.
Supprimez tout retrait laissé.
Supprimez l'entrée maintenant vide.
la source
Lua , 96 octets
Essayez-le en ligne!
Le plus court que j'ai pu trouver à Lua. La saisie est effectuée à partir de la ligne de commande.
Cela utilise quelques astuces:
(...):gmatch(
Cela devrait être la forme la plus courte pour obtenir une seule chaîne dans un programme Lua à partir de la ligne de commande. L'
...
expression en Lua capture tout paramètre en excès dans une fonction non spécifiée dans la déclaration de fonction et est utilisé pour les variables. Puisque le corps principal d'un programme Lua est appelé comme une fonction avec les arguments de la ligne de commande comme paramètres, les arguments de la ligne de commande se retrouveront dans...
.Les parenthèses qui l'entourent transforment l'
...
expression potentiellement à valeurs multiples en une expression à valeur unique. Considérez cet exemple (quelque peu surprenant):and
/or
pour "si x alors valeur1 sinon valeur2" logique.L'
and
opérateur de Lua retourne son premier argument s'il s'agit de fausseté; sinon, il retourne son deuxième argument. L'or
opérateur retourne son premier argument s'il s'agit de la vérité; sinon, le deuxième argument.p
n'a pas besoin d'initialisation.p==s
doit toujours être faux lors de la première exécution de la boucle, quelle que soit l'entrée. Si vous ne définissezp
aucune valeur avant d'entrer dans la boucle (en la quittantnil
), cela sera possible et vous économiserez des octets.Quelqu'un peut-il jouer au golf (à Lua)?
la source
c=0(...):gsub(".",function(s)c=c+(p==s and(s=="/"and-1or 1)or 0)p=s print((" "):rep(c)..s)end)
gmatch(".")
degmatch"."
comme vous l'avez fait dans votre prochaine réponse.Pyth , 28 octets
Essayez-le en ligne!
la source
Q
place:j.u+?qeNY?>Y\/+PNdPPNPNYtQh
.R , 119 octets
Essayez-le en ligne!
Cela diffère quelque peu de la réponse de user2390246 . Ils parcourent chacun la chaîne en imprimant un certain nombre de caractères d'espace, puis le
/\
caractère approprié .Cependant, j’évitais de scinder la chaîne, préférant remplacer les caractères par leur valeur de codage UTF-8, ce qui me permettait alors de calculer directement les nombres, ce qui ne me permettait d’économiser que quelques octets.
la source
diffinv
cela ne fonctionnera certainement pas ici.C # (.NET Core) , 60/65 octets
J'ai essayé la version C # plus courte
comme il a été dit: "Cela signifie également que chaque entrée commencera par une barre oblique inverse." Ou un peu plus longtemps qui résolvent de commencer "/"
Essayez-le en ligne!
la source
Lua ,
8884 octetsVersion améliorée (-4 octets grâce à QuertyKeyboard)
Essayez-le en ligne!
Version originale (88 octets)
Une autre tentative à Lua, cette fois avec une approche complètement différente en utilisant la manipulation de chaîne au lieu d'une variable de compteur.
Ungolfed:
Il y a une chose intéressante dans le code:
(...):gmatch"."
cela utilise quelques bizarreries dans l'analyseur Lua. Lorsque Lua rencontre un morceau de code dans le formulaire
func "string"
, il le convertit enfunc("string")
. Cela permet d'écrireprint "string"
pour imprimer une chaîne constante et cela ne fonctionne qu'avec un seul littéral de chaîne après la fonction. Tout le reste donnera une erreur de syntaxe. Cependant, ce sucre syntaxique fonctionne également avec les appels de fonction au milieu d'une expression, et plus surprenant, il fonctionne parfaitement avec l':
appel de méthode sucre syntaxique. Donc à la fin, Lua interprétera le code comme suit:Si quelqu'un peut trouver un moyen de supprimer l'un des trois appels gsub, dites-le-moi.la source
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Pyth - 33 octets
Première tentative, va jouer au golf.
Essayez-le en ligne ici .
la source
Perl, 40 + 2 octets
Vous avez besoin du
-F
drapeau.la source
Perl,
3438 + 1 octetsgérer les deux cas
être couru avec
-p
optionEDIT: le commentaire suivant ne fonctionne pas quand le premier caractère est
/
cependant, la sortie sera décalée d’un caractère à droite si le premier caractère est
\
la source
/\\/\\/
.34
solution d' origine est maintenant parfaitement valideVBA (Excel), 181 octets
la source
[...]
notation: je l'ai réduit à 128 octetsSub q
For x=1To[Len(A1)]
c=Mid([A1],x,1)
If c="\"Then Debug.?b;c:b=b+" "
If c="/"Then b=Left(b,Len(b)-1):Debug.?b;c
Next
End Sub
Pyth ,
2421 octetsPort de la réponse de Rod .
Essayez-le en ligne!
la source
\
. BTW où est votre code?SOGL V0.12 ,
1613 octetsEssayez-le ici! - attend des entrées sur la pile, donc pour plus de facilité d'utilisation
,
est ajoutéla source
Dyalog APL, 31 octets
Essayez-le ici!
la source
{↑⍵↑¨⍨a-1-+\¯1*a←⍵='\'}