Dessinez une chaîne en S


27

Contexte

Quand j'étais plus jeune, on m'a enseigné une méthode pour dessiner une étrange forme de "S", que j'ai (avec mes camarades de classe) trouvé fascinante. Aujourd'hui, je l'ai redécouvert, et en raison de son approche formelle pour le dessiner, j'ai pensé que cela pourrait conduire à un défi intéressant: P

Dessiner le "S"

Le S peut être dessiné en suivant ces étapes simples:

Tout d'abord, dessinez 2 rangées de trois lignes verticales comme ceci

| | |

| | |

Ensuite, connectez la ligne en haut à gauche avec la ligne du milieu en bas et le milieu en haut avec la ligne en bas à droite pour produire

| | |
 \ \
| | |

Enfin, dessinez un haut et un bas sur l'image actuellement dessinée afin qu'elle finisse par ressembler à

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

Comme vous pouvez le voir, cela se traduit par une forme en "S". Cependant, lorsqu'il est étendu (en le dessinant avec plus de 2 lignes), il produit un motif très intéressant. Votre tâche est de reproduire ce modèle intéressant.

Tâche

Étant donné un entier où n >= 2, sortez le S avec des nlignes à en faire. La sortie peut être renvoyée par une fonction et l'entrée peut être prise selon des méthodes standard. Les espaces de fin / de début pour l'image globale, ainsi que pour chaque ligne, conviennent parfaitement. Cependant, les espaces de ligne de tête doivent être cohérents afin que le «ne soit pas rompu.

Cas de test

input
output
---

2

  ^
 / \
| | |
 \ \
| | |
 \ /
  v

---

8
  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

---

10

  ^
 / \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ \
| | |
 \ /
  v

C'est un donc le code le plus court gagne! Bonne chance,


13
Wikipédia appelle Sle froid S , et appelle une version infinie du unS Chain
Stephen

Pouvons-nous produire une liste de lignes?
M. Xcoder

@ Mr.Xcoder vous pouvez
caird coinheringaahing

@Stephen 10 minutes googler et cela ne s'est pas produit. Je vais modifier le nom de la question
caird coinheringaahing

@cairdcoinheringaahing J'ai recherché des images, ça aurait pu être ça: P
Stephen

Réponses:



10

C # (.NET Core) , 73 69 66 64 62 octets

Deux octets de moins et une apparence de type perl grâce à Barodus. Vous n'avez pas pensé à utiliser int? pour null.

n=>$@"  ^
 / {string.Join(@"\
| | |
 \ ",new int?[++n])}/
  v"

Essayez-le en ligne!


1
Si c'était un golf de la réponse C # existante, je n'aurais jamais pu le dire. Bravo :-)
ETHproductions

Pouvez-vous expliquer ce que cela new string[n+1]fait? Je ne l'ai jamais vu auparavant.
Ian H.

Crée un tableau de chaînes vides AFAIK. J'ai utilisé un hack avec string.Join, aka join {"", "", "", ""} with separator "\ \ n | | | \ n \"
mon pronom est monicareinstate

@quelqu'un Woah, je n'avais jamais reconnu cette astuce avant. Vraiment cool! (Aussi ma mauvaise, je pensais que new string[n+1]c'était une sorte de constructeur de chaînes délicat et pas une déclaration de tableau -.-)
Ian H.


6

05AB1E , 27 26 octets

…^
/ð"\
| | |
\ "I×…/
vJ.c

Essayez-le en ligne!

Version alternative de 27 octets

'^…/ \©IF…| |û…\ \}\®R'v».c

Essayez-le en ligne!

Explication

'^                             # push "^"
  …/ \©                        # push "/ \" and store a copy in register
       IF                      # input times do:
         …| |û                 # push "| | |"
              …\ \             # push "\ \"
                  }            # end loop
                   \           # discard top of stack (the extra "\ \")
                    ®R         # push "/ \" reversed = "\ /"
                      'v       # push "v"
                        »      # join stack on newlines
                         .c    # center each row

5
Votre code me ressemble un peu à un éléphant :)
Wojowu

C'est littéralement effrayant à quel point ma réponse était proche de la vôtre: '^…/ \©IF„| ûû„\ û}\®R'v).Csans regarder.
Magic Octopus Urn

6

Japt , 34 25 23 octets

" ^ /{ç'\²i|³1}/ v"¬¸ò5

Testez-le en ligne! Sorties sous forme de tableau de lignes; -Rdrapeau ajouté pour rejoindre les nouvelles lignes. (Merci @Shaggy)

Première Deuxième tentative, pourrait être améliorable ...

Comment ça marche

" ^ /{ ç'\²  i |³  1}/ v"¬ ¸  ò5
" ^ /{Uç'\p2 i'|p3 1}/ v"q qS ò5   Ungolfed
                                   Implicit: U = input number
        '\p2                       Repeat a backslash twice, giving "\\".
             i     1               Insert at index 1
              '|p3                   3 vertical bars. This gives "\|||\".
      Uç                           Make U copies of this string. U = 2: "\|||\\|||\"
" ^ /{              }/ v"          Insert this into this string.    " ^ /\|||\\|||\/ v"
                         q qS      Split into chars; join on spaces."  ^   / \ | | | \ \ | | | \ /   v"
                              ò5   Split into rows of length 5.    ["  ^  "," / \ ","| | |"," \ \ ","| | |"," \ / ","  v"]
                                   Joining on newlines gives "  ^  
                                                               / \ 
                                                              | | |
                                                               \ \
                                                              | | |
                                                               \ /
                                                                v"

Battre le charbon de bois et attacher SOGL? Excellent travail!
Shaggy

Soit dit en passant, vous pouvez sortir un tableau de lignes, vous pouvez donc abandonner les 2 derniers caractères.
Shaggy

@Shaggy C'est super, maintenant nous gagnons!
ETHproductions

Nous nous en sortons bien ces derniers temps :)
Shaggy

6

SOGL V0.12 , 26 25 18 octets

°I-‘*"∑ūCƨΩ)¹‘@∑5n

Essayez-le ici!

Utilise la même stratégie que la réponse Japt d'ETHproductions

Explication:

..‘           push "\|||\"
   *          repeat input times
    "..‘      push " ^ /ŗ/ v ", with ŗ replaced with POP. The reason why there's a trailing
              space is because otherwise it didn't have enough repeating characters to compress
        @∑    join with spaces
          5n  split to line lengths of 5

2
push "|" and " "qu'est-ce que c'est que ça
Steven H.

1
@StevenHewitt, ce sont en fait deux éléments intégrés, mais je les ai réunis (comme je le fais avec d'autres choses) parce que je ne pense pas qu'il ne soit pas nécessaire de séparer les choses qui
seront

5

JavaScript (ES6), 60 octets

n=>`  ^
 / \\
${`| | |
 \\ \\
`.repeat(n-1)}| | |
 \\ /
  v`

Extrait de test


1
57: n=>' ^\n /${' \\ \\\n| | |\n'.repeat(n).slice(2)} \\ /\n v'(en utilisant des backticks et des retours à la ligne littéraux)
edc65

5

Fusain , 27 26 25 octets

-1 octet merci à Carlos Alejo. -1 octet grâce à ASCII uniquement.

  ^⸿ / ×\⸿| | |⸿ \ N/⸿  v

Essayez-le en ligne! Le lien est vers la version détaillée. # charcoal-verbose-obfucation


1
Vous pouvez enregistrer 1 octet en appelant simplement Print (au lieu d'ajouter les chaînes) et en utilisant \r: `^ ⸿ / × \ ⸿ | | | ⸿ \ Iθ / ⸿ v`. Version verbeuse .
Charlie

Ah ... je vais devoir me souvenir \rcomme le moyen d'obtenir des nouvelles lignes de la manière saine. Merci!
2017 totalement humain


@ ASCII uniquement: P -
2017 totalement humain à 12h54

4

Perl 5 , 39 37 octets

say"  ^
 / ".'\
| | |
 \ 'x<>."/
  v"

Essayez-le en ligne!

Rasé deux octets avec la suggestion de @DomHastings


Si vous utilisez des guillemets simples, vous n'avez pas besoin d'échapper aux barres obliques inverses pour -2! :)
Dom Hastings

3

En fait , 49 octets

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"

Essayez-le en ligne!

Explication:

"| | |"@α;lD" \ \"@α@Z♂ii"  v"" \ /"))" / \""  ^"
"| | |"@α                                          push a list containing n copies of the vertical lines
         ;lD" \ \"@α                               push a list containing n-1 copies of the diagonal connections
                    @Z♂i                           interleave
                        i                          flatten
                         "  v"" \ /"))             make the bottom
                                      " / \""  ^"  make the top

3

05AB1E , 38 octets

…| |ûU"  ^
 / \"XI<F„ \2×X}" \ /
  v"»

Essayez-le en ligne!

…| |                         # Push "| |"
    û                        # Palindromize
     U                       # Store in X
      "..."X                 # Push the top three rows
            I<F      }       # One less than input times do:
               „ \           #   Push " \"
                  2×         #   Concatenate that with itself
                    X        #   Push "| | |"
                      "..."  # Push the last two rows
                           » # Join stack with newlines


3

C # (.NET Core) , 101 77 73 octets

24 octets enregistrés grâce à i cri everytim !
4 octets enregistrés grâce à Kevin Cruijssen !

n=>{var s="  ^\n / ";for(;n-->0;s+="\\\n| | |\n \\ ");return s+"/\n  v";}

Essayez-le en ligne!

Comme d'habitude, la répétition de chaîne en C # est une douleur.



@icrieverytim Ahhh, bien sûr, c'est bien mieux.
Ian H.

Vous pouvez changer --n>=0à n-->0et s+="/\n v";return s;pour return s+"/\n v";sauver quelques octets.
Kevin Cruijssen

1
@KevinCruijssen Merci, corrigé!
Ian H.

3

Rétine , 38 octets

.+
$*
1
¶|||¶x\\
^
 ^¶x/\
.$
/¶ v
x?
 

Essayez-le en ligne!

Imprime une colonne d'espaces de début et d'espace de fin sur chaque ligne.

Explication

Les principales économies d'octets proviennent de l'omission des espaces dans toutes les parties littérales et de leur insertion à la fin. La figure est structurée de manière à ce qu'il n'y ait jamais deux non-espaces côte à côte, donc si nous les supprimons tous, nous pouvons presque corriger la forme en insérant un espace à chaque position à la fin:

^
/\
|||
\\
|||
\/
v

devient:

 ^ 
 / \ 
 | | | 
 \ \ 
 | | | 
 \ / 
 v 

C'est presque correct, sauf pour l'indentation. Les ^et vmanquent deux espaces. C'est en fait plus facile à corriger, car si nous insérons simplement un espace explicite devant chacun d'eux, cela se traduira par deux espaces supplémentaires à la fin. Les lignes avec les barres obliques sont plus délicates car elles nécessitent un seul espace supplémentaire. Pour résoudre ce problème, nous y insérons un caractère d'espace réservé ( x). Lorsque nous insérons les espaces à la fin, nous ne les insérons pas uniquement pour chaque correspondance vide, mais nous faisons éventuellement correspondre cela x. Cela signifie qu'au lieu d'insérer un espace devant le x, le xlui - même est remplacé. Et puis il y aura toujours un match vide juste après le x. Cela signifie que chaquexajoute exactement un espace sans rien changer d'autre. Donc, ce que nous voulons mettre en place, c'est ceci:

 ^
x/\
|||
x\\
|||
x\/
 v

ce qui nous donnera le résultat souhaité. Voici donc le code:

.+
$*

Convertissez l'entrée en unaire.

1
¶|||¶x\\

Convertissez chacune 1en deux lignes avec |||et x\\(et un saut de ligne de tête).

^
 ^¶x/\

Insérez les deux premières lignes avec ^et x/\.

.$
/¶ v

Fixez la finale x\\en transformant la dernière \en /et en ajoutant une ligne avec le v.

x?
 

Remplacez chaque correspondance xou vide par un espace.


Approche soignée. J'essayais de trouver un moyen d'utiliser la jointure sur des espaces pour ma solution Pip, mais cela ne fonctionnait pas tout à fait en raison du nombre différent d'espaces de tête sur différentes lignes.
DLosc


2

Pyth, 40 octets

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v

Assez similaire à Steven Hewitt, mais développé indépendamment.

Essayez-le en ligne

Explication

K" / \ ""  ^"Kj+b+*2+d\\b*Q]*3"| "_K"  v
K" / \ ""                                 Set K = " / \ "
        "  ^"                       "  v  Draw the end points.
             K                    _K      Draw the slants.
                         *Q]*3"| "        Draw the vertical bars...
              j+b+*2+d\\b                 ... interspersed with slants.


2

Rétine , 45 octets

Ceci est une solution assez simple.

.+
$*
^1
  ^¶ /x
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

Essayez-le en ligne

Si l'art pouvait être indexé à la place, il serait un peu plus court (44 octets):

.+
  ^¶ /x$0$*1
$
 \ /¶  v
1
 \x
x
 \¶| | |¶

2

Pip , 45 42 33 octets

"  ^
 / "."\
| | |
 \ "Xa."/
  v"

Essayez-le en ligne!

Explication

Le code est vraiment simple, bien que les nouvelles lignes le rendent plus difficile à lire. Voici une meilleure façon de voir la structure:

"prefix" . "repeated" X a . "suffix"

L'élément répété dans la chaîne S est

   \
| | |
 \

Prenez cela comme une chaîne littérale et répétez-le afois (où aest le premier argument de ligne de commande). Ajoutez ensuite le préfixe:

  ^
 /

et ajoutez le suffixe:

   /
  v

et imprimer.

(J'aime comment cela a fini par ressembler à un programme> <>.)


Cela ressemble à Lumpy Space Princess de Adventure Time :)
YSC



1

Excel, 60 octets

="  ^
 / \
"&REPT("| | |
 \ \
",A1-1)&"| | |
 \ /
  v"

Vous devriez envisager de vérifier s'il s'agit d'un polyglotte avec Google Sheets
Taylor Scott

1

PowerShell , 83 , 57 octets

"  ^
 / \"
1..--$args[0]|%{"| | |
 \ \"}
"| | |
 \ /
  v"

Essayez-le en ligne!

Selon les suggestions de @ AdmBorkBork,

  • Simplifié foren utilisant une plage de nombres.
  • Chaînes remplacées ;et combinées.
  • Suppression d'une définition de variable inutile.

Vous pouvez jouer forbeaucoup à votre boucle en utilisant 1..--$args[0]|%{ }.
AdmBorkBork

En outre, vous pouvez utiliser des sauts de ligne littéraux entre les chaînes adjacentes pour économiser ";"et il est moins coûteux de s'en débarrasser $sentièrement. 57 octets
AdmBorkBork

Nappe. J'aime la sauvegarde de la nouvelle ligne. C'est drôle que j'ai raté l' 1..$argsoccasion. Je ne sais pas quelle est la bonne étiquette sur ce site. Dois-je apporter des modifications à ma réponse et vous créditer, ou affichez-vous votre solution en tant que réponse distincte?
root

Modifier les modifications et attribuer un crédit est la bonne étiquette. Bienvenue chez PPCG.
AdmBorkBork


1

Gelée , 32 octets

Port ennuyeux de la solution Python de Lynn .

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”

Essayez-le en ligne!

Explication:

“\¶| | |¶ \ ”ẋṭ“  ^¶ / ”;“/¶  v”    Example input: 5
“\¶| | |¶ \ ”                       Literal string "\¶| | |¶ \ " (¶ = newline). Result: "\¶| | |¶ \ "
             ẋ                      Repeat as many times as the (implicit) input. Result: "\¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
              ṭ                     Tack that on the end of...
               “  ^¶ / ”            ...the string "  ^¶ / ". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ "
                        ;           Append...
                         “/¶  v”    The string "/¶  v". Result: "  ^¶ / \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ \¶| | |¶ \ /¶  v"
                                    Implicit print

1

En fait , 30 octets

Cela fonctionne sur le même principe que la réponse Japt d'ETHproductions , où des espaces supplémentaires sont ajoutés plus tard, et la chaîne entière est divisée en lignes de 5 pour une impression implicite. Essayez-le en ligne!

"\|||\"*" ^ /"+"/ v"@+#' j5@╪i

Ungolfing

            Implicit input.
"\|||\"*    Add the middle portion and multiply that by the input.
" ^ /"+     Append the top.
"/ v"@+     Append the bottom.
#           Convert into a list of strings
' j         Join with spaces.
5@╪         Split into a list of length-5 strings.
i           Flatten list onto the stack for implicit printing with newlines.

Beau travail surpassant Mego dans sa propre langue!
caird coinheringaahing

1

Gelée , 25 23 octets

Cela fonctionne sur le même principe que la réponse Japt d'ETHproductions , où des espaces supplémentaires sont ajoutés plus tard, et la chaîne entière est divisée en chaînes de longueur 5 avant l'impression. Essayez-le en ligne!

Edit: je savais qu'il y avait un moyen de joindre le haut et le bas de la chaîne S de manière golfique. Merci à Erik l'Outgolfer pour -2 octets.

“\|||\”ẋ“ ^ /“/ v”jKs5Y

Ungolfing

                Left argument: n
“\|||\”ẋ        Repeat the middle portion n times.
“ ^ /“/ v”j     Append the top and bottom.
K               Join with spaces.
s5              Split into a list of length-5 strings.
Y               Print the strings with linefeeds.

“\|||\”ẋ“ ^ /“/ v”jKs5Y
Erik the Outgolfer

1

Fusain , 25 octets

↘^\¶/¶G→⁵↓⊕⊗N←⁵|¶ \↗¶\¶v/

Essayez-le en ligne! Le lien est vers la version détaillée du code.


C'est amusant de voir comment l' autre réponse Charcoal est le même nombre d'octets en utilisant une approche complètement différente. Mais j'aime mieux le vôtre. L'autre est presque codé en dur, mais le vôtre utilise en fait la force de Charcoal.
Kevin Cruijssen

@KevinCruijssen Vous dites force, mais cela devrait vraiment être imprimé en diagonale; malheureusement, le mieux que j'ai pu faire était de 29 octets:↘^\|¶/|\|¶|F⊖N↘\|\|¶|↘\|/¶|\v
Neil


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.