Dessinez une échelle et faites glisser

24

Votre tâche consiste à créer un programme ou une fonction qui prend en entrée un nombre naturel ( n) compris entre 1 et 25 (inclus) et imprime une représentation isométrique d'une diapositive et d'une échelle avec un nnombre de barreaux.

Spécifications d'échelle et de toboggan

L'échelle est toujours orientée à gauche et la glissière à droite. Nous le regardons du côté de l'échelle, donc une partie de la diapositive est masquée aux trois niveaux supérieurs. Les barreaux sont représentés par quatre tirets ( ----) et les côtés de l'échelle et glissent par des barres obliques ( /et \). Ce qui suit est un diagramme pour représenter les modèles d'espaces nécessaires pour une diapositive à cinq échelons.

Slide              Blank space count
    /----/\        1234/----/\ 
   /----/  \       123/----/12\ 
  /----/    \      12/----/1234\ 
 /----/ \    \     1/----/1\1234\ 
/----/   \    \    /----/123\1234\

Exemples

>>1
/----/\

>>3
  /----/\ 
 /----/  \ 
/----/    \ 

>>4
   /----/\ 
  /----/  \ 
 /----/    \ 
/----/ \    \ 

>>10
         /----/\ 
        /----/  \ 
       /----/    \ 
      /----/ \    \ 
     /----/   \    \ 
    /----/     \    \ 
   /----/       \    \ 
  /----/         \    \ 
 /----/           \    \ 
/----/             \    \ 

Il s'agit de code-golf, donc la réponse avec le nombre d'octets le plus bas l'emporte.

Remarque: l'espace blanc de fin est acceptable dans la sortie, tant qu'il ne dépasse pas la longueur de la ligne.

atlasologue
la source
14
Vous vous casseriez les jambes à la fin de cette diapositive!
Fatalize
13
@Fatalize ce serait ... Fatal.
Ven
7
@Fatalize points bonus pour vous si vous dessinez une piscine au fond;)
atlasologist
8
@ atlasologist Une mare de sang?
Neil
Toutes mes excuses s'il s'agit d'une question stupide, mais quelques-unes des réponses ci-dessous (Python, JavaScript) définissent une fonction qui renvoie une chaîne plutôt que de l'imprimer. C'est casher?
Jordan

Réponses:

17

Rétine , 81 72 52 octets

Le nombre d'octets suppose un codage ISO 8859-1.

.+
$* /\    \
^.

+` /(.+)$
$&¶$%`/  $1
/.{5}
/----/

Essayez-le en ligne!

Explication

Le programme se compose de quatre étapes, qui sont toutes des substitutions d'expression régulière (avec quelques fonctionnalités spécifiques à la rétine). Je vais utiliser l'entrée 5comme exemple pour l'explication.

Étape 1

.+
$* /\    \

Cela transforme l'entrée nen nespaces suivis /\ \qui deviendront le haut de l'échelle / diapositive:

     /\    \

Pour l'instant, nous allons simplement montrer la diapositive dans son intégralité et représenter l'échelle uniquement par sa main gauche /.

Étape 2

^.

Malheureusement, les nespaces sont un de plus que nécessaire, nous supprimons donc à nouveau le premier caractère. Nous avons maintenant:

    /\    \

Étape 3

+` /(.+)$
$&¶$%`/  $1

Il est temps d'élargir la structure complète. Savoir où se trouve le sommet est suffisant pour construire le tout, car nous pouvons simplement l'étendre une ligne à la fois, en écartant l'échelle et la glissière de deux espaces.

Le +dit à Retina de répéter cette étape en boucle jusqu'à ce que la sortie cesse de changer (dans ce cas, car l'expression régulière cesse de correspondre). En ce qui concerne l'expression régulière elle-même, nous faisons simplement correspondre la /sur la dernière ligne et tout ce qui la suit et nous faisons également correspondre un espace devant elle, ce qui signifie qu'elle ne peut plus correspondre une fois qu'elle /a atteint la première colonne.

Voici ce que nous remplaçons par:

 $&    The match itself. We don't want to remove the line we already have.
 ¶     A linefeed, because we want to append a new line.
 $%`   This is a very recent addition to Retina: it's like the normal $` but
      is bounded by linefeeds. That means this inserts everything in front
      of the match which is on the same line. In particular this one space
      less than the indentation of the matched line, hence we are shifting
      the / one column left.
 /     A literal /, representing the left edge of the ladder.
>  <   Two spaces, so that we can shift the slide one column right.
 $1    Capturing group 1 which contains the slide and its separation from
      the ladder.

Donc, à chaque itération, cela ajoute une ligne à la chaîne, jusqu'à ce que nous nous retrouvions avec ceci:

    /\    \
   /  \    \
  /    \    \
 /      \    \
/        \    \

Étape 4

/.{5}
/----/

Il ne reste plus qu'à redresser l'échelle. C'est vraiment simple, nous faisons simplement correspondre les 5 /et les 5 caractères suivants et insérons la représentation en échelle correcte, remplaçant ainsi la diapositive ou les espaces qui sont déjà là:

    /----/\
   /----/  \
  /----/    \
 /----/ \    \
/----/   \    \
Martin Ender
la source
9

V , 38, 37, 36, 34, 33, 32, 31, 30 29 octets

Àé r\2é/4é-òhYpX$2P^ò3GEòjlr\

Essayez-le en ligne!

Je pourrais rattraper Osabie. Un octet de moins que Osabie. \o/À égalité avec 2sable! Un octet plus court!

Dans d'autres nouvelles, c'est certainement la plus longue en-tête barrée que j'ai jamais faite.

Explication:

Àé              "Insert 'arg1' spaces
   r\           "Turn the last one into a '\'
     2é/        "Insert 2 '/'
        4é-     "Insert 4 '-'

ò        ò      "Recursivly:
 h              "  Move one to the left
  Yp            "  Duplicate this line
    X           "  Delete one space from the left
     $2P        "  Paste two spaces at the end of this line
        ^       "  Move back to the beginning of this line.

Cela fonctionnera jusqu'à ce qu'une erreur se produise qui, grâce à la commande "déplacer à gauche" ('h'), sera multipliée par 'arg1'.

Maintenant, nous avons juste besoin d'ajouter la jambe intérieure

3GE             "Move to the second slash of line 3
   ò    ò       "Recursively: (The second 'ò' is implicit)
    jl          "  Move down and to the right
      r\        "  And replace the character under the cursor with a '\'

Version non concurrente (28 octets)

DJMcMayhem
la source
8

Pyth, 39 35 octets

VQ++*dt-QN"/----/">+*+ddN"\    \\"5

Explication:

VQ                                  # Interate over 0 -> Q-1 (Q is the input)
  +                                 # Concatenate the 2 halfs of the slide
   +                                # Concatenate the whitespace block and the ladder
    *d                              # Multiply d (whitespace) by this number \/
      t-QN                          # Calculate the amount of spaces before : input - step of the iterarion -1
          "/----/"                  # Ladder
                  >               5 # Remove the first 5 chars  from the string generated in the following lines 
                   +                # Concatenate the whitespace block and the slide
                    *+ddN           # Multiply "+dd" (2 whitespace) by the step of the iterarion to generate the space between the ladder and the slide
                         "\    \\"  # Slide

Testez ici

Barre
la source
8

2sable , 40 36 32 30 octets

Hmmm, V se rapproche terriblement ...

F¹N-<ð×…/--«ðð«N×…\  ««5F¦}¶

Utilise l' encodage CP-1252 . Essayez une version compatible 05AB1E! .

Adnan
la source
Et la bataille fait rage: codegolf.stackexchange.com/a/85985/31716 :P
DJMcMayhem
@DrGreenEggsandIronMan Hmmm !!?!?!
Adnan
Il y en a un de plus, et un de plus une fois rentré chez moi. De plus, je ne change pas de langue. : P
DJMcMayhem
7

PowerShell v2 +, 99 90 82 octets

param($n)1..$n|%{" "*($n-$_)+"/----/"+-join(" "*($_+$i++)+"\    \")[6..(6+$_+$i)]}

Prend entrée $n, démarre une boucle de 1à $navec |%{...}. À chaque itération, nous construisons une chaîne. Nous commençons par le nombre approprié d'espaces " "*($n-$_)et l'échelle"/----/" .

Pour cela, nous ajoutons une autre chaîne qui a été découpée [...]et -joinéditée ensemble. La deuxième chaîne est la diapositive, et nous supposons que la diapositive entière est toujours visible. C'est le nombre d'espaces avant le début de la diapositive " "*($_+$i++), suivi de la diapositive elle-même "\ \". Ceci est découpé en tranches par une plage calculée pour être la partie des "espaces plus toboggan" qui est partiellement cachée par l'échelle.

Exemples

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 7
      /----/\
     /----/  \
    /----/    \
   /----/ \    \
  /----/   \    \
 /----/     \    \
/----/       \    \

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15
              /----/\
             /----/  \
            /----/    \
           /----/ \    \
          /----/   \    \
         /----/     \    \
        /----/       \    \
       /----/         \    \
      /----/           \    \
     /----/             \    \
    /----/               \    \
   /----/                 \    \
  /----/                   \    \
 /----/                     \    \
/----/                       \    \
AdmBorkBork
la source
7
+1 car les barres obliques de votre répertoire correspondent aux barres obliques de la sortie de test. :D
DJMcMayhem
Votre \golfingdossier doit être très organisé._.
Conor O'Brien
6

Python 2-79 76 75 octets

x=input()
for i in range(x):print(x-i)*' '+'/----/'+(i*'  '+'\\    \\')[5:]

Merci à Hubert Grzeskowiak de m'avoir "disqualifié" depuis que mon impression de programme a en fait économisé 3 octets! Merci également à Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ pour avoir économisé 1 octet de plus!

Cowabunghole
la source
Agréable! Soit dit en passant, lambda allait bien, je pense, car à proprement parler, c'est une sorte de fonction. En utilisant lambda, vous pouvez enregistrer une nouvelle ligne et un espace :-)
Hubert Grzeskowiak
Attendez, je l'ai essayé avec lambda et je n'ai pas pu le faire fonctionner. C'est avant tout de l'impression, je suppose?
Hubert Grzeskowiak
@HubertGrzeskowiak Eh bien, cela dépend des spécifications du défi. Si la question demandait un programme / fonction qui renvoie une représentation sous forme de chaîne d'une diapositive, l'une ou l'autre de mes réponses serait valide. Comme il spécifie "print" comme vous l'avez souligné, j'aurais dû soit nommer la fonction lambda et imprimer un appel, soit faire ce que j'ai fait ci-dessus qui était plus court.
Cowabunghole
Les spécifications ne disent pas que la fonction doit être nommée ou appelée ;-)
Hubert Grzeskowiak
Convertissez-le en un programme complet: remplacez def f(x):par x=input()et supprimez le retrait sur la deuxième ligne. Cela vous fait économiser 1 octet.
Erik the Outgolfer
6

Vim, 71 frappes

C'est une façon tellement stupide de le faire, mais c'est un peu amusant. L'entrée est donnée sous forme de fichier texte avec une seule ligne contenant un entier. C'est probablement assez jouable au golf, mais cela suffira pour l'instant ( modifier: style de contrôle des caractères de contrôle sur demande ):

A@qyyPgg<c-v><c-v>GkI <c-v><esc>G$i  <c-v><esc><esc>
Tq"qDI/----/\^[lD@"ddh<c-v>god:%s/     \\/\\    \\<cr>

<c-v>, <esc>Et <cr>sont toutes les frappes individuelles; ctrl + v, escape et retour chariot (entrée) respectivement. Pour une version simple à digérer avec les bons littéraux, voici le fichier ladder.keysexécuté cependant xxd:

00000000: 4140 7179 7950 6767 1616 476b 4920 161b  [email protected] ..
00000010: 4724 6920 2016 1b1b 5471 2271 4449 2f2d  G$i  ...Tq"qDI/-
00000020: 2d2d 2d2f 5c1b 6c44 4022 6464 6816 676f  ---/\.lD@"ddh.go
00000030: 643a 2573 2f20 2020 2020 5c5c 2f5c 5c20  d:%s/     \\/\\
00000040: 2020 205c 5c0d 0d0a                         \\...

Pour l'essayer (en supposant un nix avec les outils appropriés), prenez ce qui précède, exécutez-le xxd -ret mettez le fichier ladder.keys. Créez un fichier ladder.txtcontenant un entier. Alors fais:

vim -s ladder.keys -u NONE ladder.txt
algmyr
la source
Nous écrivons généralement ^Vcomme <c-v>ici.
Leaky Nun
@Jordan Ce sont chacune une touche, comptant les touches modifiées (shift, ctrl ou alt avec une autre touche) comme une seule touche. Les touches sont Ctrl + v, échapper et entrer.
algmyr
@algmyr Mon erreur. J'ai mal lu votre réponse plus tôt.
Jordan
6

bash, 61

for((;i<$1;)){ printf "%$[$1+i]s\    \^M%$[$1-++i]s/----/\n";}

^Mest un retour chariot littéral

$ ./ladder 1
/----/\
$ ./ladder 4
   /----/\
  /----/  \
 /----/    \
/----/ \    \
$ ./ladder 10
         /----/\
        /----/  \
       /----/    \
      /----/ \    \
     /----/   \    \
    /----/     \    \
   /----/       \    \
  /----/         \    \
 /----/           \    \
/----/             \    \
izabera
la source
Je pense que vous devriez avoir un seul espace entre /et `\ 'dans la 4e rangée, et 1 espace de moins entre les bords de la diapositive.
Leibrug
Il devrait y avoir 4 tirets, pas 5.
algmyr
@algmyr merci qui sauve 2 octets
izabera
5

JavaScript (ES6), 79 octets

f=
n=>" ".repeat(n).replace(/./g,"$'/$`$`\\    \\\n").replace(/\/...../g,"/----/")
;
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Fonctionne en prenant une chaîne d' nespaces, puis en faisant une substitution exotique pour obtenir la diapositive avec un support, puis en remplaçant le support par une échelle.

Neil
la source
4

Rubis, 61 octets

->n{n.times{|i|puts"%*s\\    \\\r%*s----/"% [n+i,"",n-i,?/]}}

Non golfé

->(num_rows) {
  num_rows.times {|row_idx|
    puts "%*s\\    \\\r%*s----/" % [ num_rows + row_idx, "", num_rows - row_idx, "/" ]
  }
}

Je pourrais économiser deux octets en utilisant '%*s\ \^M%*s----/' (où ^Mest un retour chariot littéral) pour la chaîne de format, mais Ruby affiche ensuite l'avertissement " warning: encountered \r in middle of line, treated as a mere space". ¯ \ _ (ツ) _ / ¯

Solution précédente (64 octets)

->n{n.times{|i|puts" "*(n+i)+"\\    \\\r"+" "*(n-i-1)+"/----/"}}
Jordan
la source
3

Lot, 194 octets

@echo off
for /l %%i in (1,1,%1)do call:l %1 %%i
exit/b
:l
set s=\    \
for /l %%j in (1,1,%2)do call set s=  %%s%%
set s=/----/%s:~7%
for /l %%j in (%2,1,%1)do call set s= %%s%%
echo%s%

Il s'est avéré être assez simple: mettre en retrait la diapositive, supprimer les 7 premiers caractères, mettre en retrait l'échelle, supprimer l'espace de tête. Ce dernier bit implique cependant une petite ruse!

Neil
la source
2

Java, 116 octets

c->{for(int i=0;i<c;i++)System.out.format("%"+(5+c-i)+"s%"+(i<3?i*2+1:2*(i-2))+"s%5s\n","/----/","\\",i<3?"":"\\");};

Malheureusement, vous ne pouvez pas [facilement] dupliquer des chaînes en Java, donc je finis par abuser de la fonction de formatage.


la source
2

Scala, 95 octets

def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+("  "*i+"\\    \\").substring(5))}
leonidv
la source
2

Haskell, 81 octets

a n=[1..n]>>" "
f n=[1..n]>>=(\i->a(n-i)++"/----/"++drop 7(a(2*i)++"\\    \\\n"))
Damien
la source
do i<-[1..n];a(n-i)++"/----/"++drop 7(a(2*i)++"\\ \\\n")enregistre deux octets.
Lynn
0

eacal , non concurrentiel, 386 octets

init .
define @ curry push .
define ~ curry exec .--func
alias $ strap
alias ' string
set n set m cast number arg number 0
set s empty string
label l
@ get n
set n ~ dec
@ space
@ get n
$ ~ repeat
$ ' /----/
@ space
@ get m
@ get n
@ ~ sub
@ ~ dec
@ number 2
@ ~ mul
$ ~ repeat
$ ' \
$ newline
@ get n
@ number 0
if ~ more
goto l
@ $
@ regex gm '   ( {4})(?=.$)
@ '  \$1
print ~ replace

J'ai officiellement rendu la langue la plus verbeuse possible. J'ai fait le commentaire en plaisantant et en sarcasme. Calmez vous s'il vous plait. Instructions sur la façon d'exécuter dans le référentiel github lié dans l'en-tête.

Non golfé

init .
set n set m cast number arg number 0
set s empty string
label loop
    push . get n
    set n exec .--func dec
    push . space
    push . get n
    strap exec .--func repeat
    strap string /----/
    push . space
    push . get m
    push . get n
    push . exec .--func sub
    push . exec .--func dec
    push . number 2
    push . exec .--func mul
    strap exec .--func repeat
    strap string \
    strap newline
    push . get n
    push . number 0
    if exec .--func more
        goto loop

push . strap
push . regex gm string   ( {4})(?=.$)
push . string  \$1
print exec .--func replace
Conor O'Brien
la source
1
" J'ai officiellement créé le langage le plus verbeux possible. " Excusez-moi, avez-vous entendu parler d'AppleScript?
Addison Crump
@VTCAKAVSMoACE D'accord, faisons un marché. Vous répondez à cette question en applescript. Ensuite, je vais vous dire que c'est plus verbeux.
Conor O'Brien
4
Ce n'est pas assez verbeux si vous pouvez le dé-golfer.
Neil
@VTC, TimmyD et Neil: Geez. Tu es content maintenant?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Nous plaisantons évidemment, lol
Addison Crump