L'architecte ASCII

15

Vous ne voulez pas payer pour le programme architectural coûteux, vous décidez donc de lancer le vôtre. Vous décidez d'utiliser ASCII pour concevoir vos bâtiments. Votre programme prendra en une seule chaîne formatée d'une manière spécifique, et le programme sortira le bâtiment.

Contribution

L'entrée se compose d'une seule ligne de caractères. On peut supposer qu'il ne contient que les lettres a-j, les chiffres 1-9et les symboles -et +.

Description de sortie

Pour chaque lettre a-j, le programme affichera une ligne verticale comme suit. Nous appellerons cela une colonne.

         .
        ..
       ...
      ****
     *****
    ******
   -------
  --------
 +++++++++
++++++++++
abcdefghij

Par exemple, l'entrée abcdefgfedefghgfedcproduirait:

             .
      *     ***
     ***   *****
    ***** *******
   ---------------
  -----------------
 ++++++++++++++++++
+++++++++++++++++++

Une lettre peut être préfixée par un entier positif n, ce qui ajoutera des nespaces blancs sous la colonne. Nous appellerons cela un décalage. Par exemple, en utilisant Spour noter un espace, l'entrée 3b2b3bproduirait:

+ +
+++
S+S
SSS
SSS

Une lettre peut également être préfixée par un entier négatif-m , ce qui supprimera les caractères m non blancs en bas de la colonne (ne les remplacez pas par des blancs, supprimez-les entièrement). Nous appellerons cela une tranche. Par exemple, l'entrée -1j-2j-3j-4j-5j-6j-7j-8jproduirait:

.
..
...
*...
**...
***...
-***...
--***...
+--***..

Un décalage et une tranche peuvent être appliqués à la même ligne, mais le décalage doit aller en premier. En d'autres termes, la lettre peut être préfixée par n-m, où nest la taille de l'offset et mla taille de la tranche. Par exemple, en utilisant Spour noter un espace, l'entrée '2-4j' produirait:

.
.
.
*
*
*
S
S

Enfin, l' +opérateur utilisé entre deux colonnes indique qu'elles doivent être empilées les unes sur les autres dans la même colonne plutôt que dans des colonnes séparées. Par exemple, l'entrée «2-4ja» sort:

.
.
.
*
*
*
S
S+

Alors que les 2-4j+asorties d' entrée :

+
.
.
.
*
*
*
S
S

Voici un exemple d'entrée:

abiehef+ehfhabc

Et la sortie résultante:

      *
      -
  .   -
  . . +. .
  * * +* *
  * * ****
  ********
  --------
  --------  -
 +++++++++ ++
+++++++++++++

On dirait une vieille tour de château détruite.

Voici un autre exemple d'entrée:

6b5b+a6b1-2d+3-4f1-2d+-2c+2-4f+1-2d+-2c2-2d+1-4g+1-2c+b+-2c+-4e2-7j+-4g+d+-2c+-4f2-7j+-5h+b+-2c+a+-3f2-7j+-7i+-4e+b+b+a+-4f2-7i+a+-7h+-4f+b+b+a+-4f2-7j+-7h+-4f+a+-7h+a+-7i+-4f2-7j+-7i+-6h+a+-7i+b+-4e3-7i+a+-7h+-4e+a+-7h+b+1-7h3-7j+1-4f+-7h+b+-4f+a3-7j+2-4f+a+-4f+b3-2d+-2d+3-4g+b3-2d+-2d+-2c

Et la sortie résultante:

      ****** +++
     ******+.*++
     ---++.+ ***
    -+-+++..++**
    -+--+++.+++*
    --++++.+..*
      +++++.+**
+++****.******  -
+++*****.**..  --
 +   ***....+..--
      ...+.....--
    --.........--
   ---......
   --

(C'était censé être Mario mais ça ne s'est pas très bien passé ...)

Si la spécification n'est toujours pas claire, j'ai une implémentation non-golfée écrite en Python 2.7. Vous pouvez l'exécuter et expérimenter pour avoir une idée du fonctionnement de la spécification. Vous pouvez également choisir de rire de mes compétences en programmation.

C'est le golf de code, donc l'entrée la plus courte l'emporte. Posez des questions dans les commentaires si elles ne sont pas claires.

Absinthe
la source
L'empilement de plus de deux tours est valide? Je vois "2c + b + -2c" dans l'un de vos exemples, mais je ne peux pas savoir si c'est comme ça que vous les avez empilés.
AndoDaan
1
@AndoDaan Towers peut être empilé à l'infini en utilisant +. Par exemple a+a+a+a+a, les cinq signes plus s'afficheraient les uns sur les autres.
absinthe
1
N'est-ce pas un doublon de codegolf.stackexchange.com/questions/18967/landscapes ?
Howard
@Howard Huh, vous avez raison, ceux-ci sont étonnamment similaires (les seuls ajouts étant de pouvoir couper la tour et d'empiler les tours).
Martin Ender
@Howard Huh. Il n'est pas apparu sur le truc des questions similaires qui apparaît lorsque vous tapez votre titre. La mise en œuvre de l'espace blanc est cependant un peu différente. Je signalerai mon message comme un doublon et verrai ce que les mods pensent.
absinthe

Réponses:

10

Rubis, 223214 octets

g=$*[0].split(/(?<=[a-j])(?!\+)/).map{|r|r.scan(/(\d*)(-\d+)?([a-j])/).map{|a,b,c|' '*a.to_i+'++--***...'[-b.to_i..c.ord-97]}*''}
puts g.map{|s|s.ljust(g.map(&:size).max).chars.reverse}.transpose.map(&:join).join$/

C'était amusant. :)

Bien que cela devrait être assez évident, j'ai découvert une nouvelle façon de relever ces défis où les chaînes ont été construites à partir de colonnes: faites-les simplement en lignes et transposez le tableau de caractères avant de tout joindre.

g=$*[0].split(/(?<=[a-j])(?!\+)/)               # Split into columns.
       .map{|r|                                 # For each column
            r.scan(/(\d*)(-\d+)?([a-j])/)       # Split into components.
             .map{|a,b,c|                       # For each component
                ' '*a.to_i+                     # Prepend spaces if any.
                '++--***...'[-b.to_i..c.ord-97] # Select the appropriate slice of the tower.
            }*''                                # Join all components together.
        }
puts g.map{|s|                                  # For each column
            s.ljust(g.map(&:size).max)          # Pad with spaces on the right such that. 
                                                # all columns are the same height.
            .chars.reverse                      # Turn into character array and reverse.
      }
      .transpose                                # Mirror in the main diagonal.
      .map(&:join)                              # Join lines.
      .join$/                                   # Join columns.
Martin Ender
la source
Expérimentait différents styles de la dernière ligne et est sorti avec: puts (0..z=g.map(&:size).max-1).map{|i|g.map{|y|(v=y[z-i])?v:?\ }*''}. Mais probablement pas si amusant sans la transposition.
vectorisé
@bitpwner Merci, je vais y jeter un œil et tester cela plus tard.
Martin Ender
2

Cobra - 473

Je ne pense pas que Cobra va jamais gagner l'un d'eux: /

use System.Text.RegularExpressions
class P
    def main
        r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
        z,l=0String[](r.count)
        for m in r.count,for n in'[r[m]]'.split('+'),l[m]+=' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+'++--***...'[int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):' abcdefghij'.indexOf(n[-1:])]
        for y in l,if y.length>z,z=y.length
        for x in-z+1:1
            for y in l,Console.write(if(-x<y.length,y[-x],' '))
            print

Tout gentil et commenté:

EDIT: Je viens de réaliser que cela ressemble étrangement à la solution Ruby. Les grands esprits se rencontrent?

use System.Text.RegularExpressions
class P
    def main
        r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
        # Split into columns
        z,l=0,String[](r.count)
        # Assign the column-array
        for m in r.count
        # Loop through columns
            for n in'[r[m]]'.split('+')
            # Loop through individual letter instructions
            # - within columns
                l[m]+=
                # Add characters to the last column
                    ' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+
                    # Any spaces, plus
                    '++--***...'[:' abcdefghij'.indexOf(n[-1:])]
                    # The default column string
                        [int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):]
                        # Sliced to the right length
        for y in l,if y.length>z,z=y.length
        # Determine the maximum length of any column
        for x in-z+1:1
            for y in l
            # Loop through columns so that they rotate to the left
                Console.write(if(-x<y.length,y[-x],' '))
                # Write the character in the current position
            print
            # Insert newlines
Οurous
la source
2

Lua - 451

a=arg[1]j='++--***...'I=io.write M=string.match U=string.sub T=table.insert n=''y=0 t={}m=0 for i in a:gmatch('[%-%d]*[a-j]%+?')do b=M(i,'-(%d)')b=b or 0 s=M(U(i,1,1),'%d')s=s or 0 n=n..(' '):rep(s)..U(U(j,1,M(U(i,-2),'[a-j]'):byte()-96),1+b,-1)if U(i,-1,-1)~="+"then T(t,n)m=m<#n and #n or m n=""y=y+1 end end T(t,n)n=''for k,v in pairs(t)do n=#v<m and n..v..(' '):rep(m-#v)or n..v end for i=m,1,-1 do for k=0,m*y-1,m do I(U(n,i+k,i+k))end I'\n'end

Rien de spécial. C'était amusant de renommer un tas de fonctions pour une fois. Je modifierai le code non golfé plus tard.

Essayez-le ici. Exemple de sortie:

SampleOutput

AndoDaan
la source
1

PowerShell , 214 212 209 206 200 200 octets

-3 octets merci @Veskah

switch -r($args-split'(-?.)'){\+{$c=1}\d{sv('ps'[0-gt$_])$_}[a-j]{if(!$c){$t+=,''}$t[-1]+=' '*$p+-join'++--***...'[-$s..($_[0]-97)];$c=$p=$s=0}}($t|% Le*|sort)[-1]..1|%{-join($t|% *ht $_|% ch*($_-1))}

Essayez-le en ligne!

Version moins golfée:

# make table with lines instead columns
switch -r($args-split'(-?.)'){
    \+ {$c=1}
    \d {set-variable ('ps'[0-gt$_]) $_}
    [a-j] {
        if(!$c){$t+=,''}
        $t[-1]+=' '*$p+-join'++--***...'[-$s..($_[0]-97)]
        $c=$p=$s=0
    }
}
# transpose
($t|% Length|sort)[-1]..1|%{
    -join($t|% padRight $_|% chars($_-1))
}
mazzy
la source
1
Regex de (-?.)devrait aussi fonctionner
Veskah
impressionnant! Merci.
mazzy
0

Python 3, 268 octets

import re
q,t=[(p,' '*int(o or 0)+'++--***...'[-int(s or 0):ord(l)-96])for p,o,s,l in re.findall('(\+?)(\d?)(-\d)?(.)',input())],[]
while q:p,s=q.pop(0);t+=[t.pop()+s if p else s]
t=[*zip(*[[*c.ljust(max(map(len,t)))]for c in t])][::-1]
for l in t:print(*l,sep='')

Surtout non golfé:

# import the regex module
import re

# array to store initial input
q = []
# array to store translated output
t = []

# split string from stdin into column groups, like: ('plus or blank', 'offset or blank', 'slice or blank', 'letter')
# ex: 6b1-2d+a would become:
# [('','6','','b'), ('', '1', '-2', 'd'), ('+', '', '', 'a')]
i = re.findall('(\+?)(\d?)(-\d)?(.)',input())

# iterate through the groups returned by the regex
for p,o,s,l in i:
    # create offset string
    # int() cannot parse '', but empty strings are falsey,
    # so (o or 0) is equivalent to 'parse the string as an int, or return 0 if it is empty'
    offset = ' ' * int(o or 0)

    # get the starting point of the slice
    # since the regex returns the minus, it must be negated after converting the string to an int
    # as before, (s or 0) ensures that the slice is converted to an int properly
    start = -int(s or 0)
    # since 'a' is ordinal 97, this ensures that the end position will be 1-9
    end = ord(l) - 96
    # slice the largest possible column string with the calculated start and end positions
    a = '++--***...'[start:end]
    # add the space offset
    a = offset + a
    # add the plus sting and the column string to the array
    q.append( (p, a) )

# while q is not empty
while q:
    # remove the first item from the list and separate it into a plus variable and a column string
    p, s = q.pop(0)

    # if p is not blank, it is a '+'
    # if p is truthy, remove the last item added and add s to it
    # otherwise just return s
    # append the resulting item to the ongoing list
    t += [t.pop()+s if p else s]

temp = []
for c in t:
    # call len() on all items in t, then return the maximum length
    m = max(map(len, t))
    # left justify c by adding spaces to the right, up to m total characters
    c = c.ljust(m)
    # unpack c into a list
    # this is equivalent to list(c), but shorter
    c = [*c]
    # add the list of characters to the array
    temp.append(c)

t = temp

# t is currently a list of rows, and needs to be rotated so that it displays correctly
# input: 'abcdefghij'
# before:
#
# +
# ++
# ++-
# ++--
# ++--*
# ++--**
# ++--***
# ++--***.
# ++--***..
# ++--***...
#
# after:
#
#  ++++++++++
#   +++++++++
#    --------
#     -------
#      ******
#       *****
#        ****
#         ...
#          ..
#           .
# 
t = [*zip(*t)]
# t is currently upside down, reverse the list
t = t[::-1]

# for each line (currently a list of characters)
for l in t:
    # unpack the list into print as arguments, do not add a space between arguments
    print(*l,sep='')
Triggernométrie
la source