Dans le cadre d'un projet d'urbanisme, vous avez obtenu la tâche de créer un programme ou une fonction qui affichera les toits de la ville, compte tenu de la contribution des architectes. Le projet est seulement en phase de démarrage, donc un croquis très grossier est suffisant. L'approche la plus simple est bien sûr de simplement dessiner la ligne d'horizon en ASCII-art.
Tous les bâtiments seront au bord de la rivière, ils sont donc tous alignés. Les architectes donneront la hauteur de chaque bâtiment en entrée, et votre code devrait afficher l'horizon.
L'entrée des architectes sera soit un entier soit un demi-entier. Si le nombre est un entier, le bâtiment aura un toit plat, tandis qu'un demi-entier donnera un toit en pente. Un zéro sera juste un terrain plat. Les murs d'un bâtiment sont séparés par 3 caractères, tandis qu'un zéro sera large d'un seul caractère. Les bâtiments adjacents partagent des murs.
Pour plus de détails et des clarifications concernant la sortie, veuillez consulter les exemples ci-dessous:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Exemple d'entrée: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Exemple d'entrée: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Les caractères ASCII utilisés sont: nouvelle ligne, espace et /\_|
(points de code 10, 32, 47, 92, 95, 124).
Règles:
- Il est facultatif de créer un programme qui ne prend que des entiers en entrée, en multipliant tous les nombres par deux. Ainsi, au lieu de prendre
3 3.5 2
, votre programme peut prendre6 7 4
. Si le deuxième format d'entrée est choisi, une entrée de 6 devrait se traduire par un bâtiment de 3 étages, 7 devrait être un bâtiment de 3 étages avec des toits en pente, etc. - La sortie doit être exactement comme décrit ci-dessus, mais les espaces de fin et les retours à la ligne sont OK.
- Le format exact de l'entrée est facultatif. Tout ce qui est le mieux dans votre langue.
- Le résultat doit être affiché à l'écran, afin que les architectes puissent le consulter.
- Vous pouvez supposer qu'il y aura au moins un entier donné et que seule une entrée valide sera donnée.
C'est codegolf, donc le code le plus court en octets gagne.
Réponses:
Python 2,
199193 193188185 octetsIl s'agit d'un programme complet qui accepte des entiers en entrée. Exemple d'entrée .
la source
MATLAB,
219 209203 octetsCela ne fonctionne malheureusement pas sur Octave . Je ne sais pas vraiment pourquoi, semble être quelque chose à voir avec le bit disp / flipud qui se casse.
De plus, il n'y a actuellement aucune définition de ce à quoi ressemble un bâtiment de 0,5 hauteur, ni aucune mention d'eux, donc dans ce code, je suppose qu'ils sont interdits.
Ce qui suit est le code d'une manière légèrement plus lisible:
D'abord, nous prenons une entrée comme un tableau et faisons une initialisation variable.
Parce que les bâtiments de hauteur zéro sont pénibles - ils se retrouvent essentiellement avec une largeur qui dépend de ce qu'ils sont à côté (bien que ce qui est imprimé ne change pas), nous simplifions les choses en dessinant suffisamment de terrain pour tous les bâtiments. Nous supposons que chaque bâtiment aura une largeur de 4 caractères (car les bâtiments adjacents fusionnent) - ceux de hauteur nulle ne le sont pas, mais l'excédent sera coupé plus tard.
Maintenant, nous dessinons tour à tour chaque bâtiment.
Nous obtenons d'abord la partie entière de la hauteur, car cela déterminera le nombre de «|» nous avons besoin.
Maintenant, dessinez le mur de ce bâtiment - s'il y a deux bâtiments adjacents, le mur de ce nouveau sera dans la même colonne que le mur du dernier.
Vérifiez s'il s'agit d'un bâtiment à mi-hauteur. Si c'est le cas, le toit sera différent. Pour les demi-hauteurs, le toit sera identique à celui de
/ \
toute la hauteur___
(Matlab le reproduira implicitement à partir d'un seul trait de soulignement, économisez donc quelques octets). Il y a un peu plus de toit une rangée plus haut pour les bâtiments à mi-hauteur, ce qui est également ajouté.Dessinez dans le toit
Déplacez-vous maintenant au début du bâtiment suivant et dessinez dans le mur partagé (si le mur est trop court à ce stade, il sera agrandi lorsque le bâtiment suivant sera dessiné). Notez que les bâtiments de hauteur nulle ont une largeur de 1, les bâtiments normaux ont une largeur de 4, nous simplifions donc ce qui serait autrement un if-else en traitant (a> 0) comme un nombre décimal et non comme un booléen.
Vient ensuite un peu de piratage pour travailler avec des bâtiments de hauteur nulle. Fondamentalement, ce que cela dit, c'est que si ce bâtiment était de hauteur zéro, et celui qui ne l'était pas auparavant, cela signifie que l'emplacement du bâtiment suivant doit être incrémenté de 1, car un bâtiment de hauteur zéro pris en sandwich entre deux autres bâtiments est effectivement deux fois plus large - ce représente le mur supplémentaire qui est normalement partagé avec un bâtiment adjacent. Nous gardons également une trace de cette hauteur de bâtiment pour effectuer cette vérification la prochaine fois.
Une fois cela fait, retournez la matrice de construction pour être dans le bon sens et affichez-la. Notez que nous supprimons également tout excédent de sol ici également.
Ainsi, lorsque nous exécutons ce script, on nous demande notre entrée, par exemple:
Il génère ensuite le bâtiment et affiche le résultat. Pour l'entrée ci-dessus, les éléments suivants sont générés:
la source
Kotlin,
447442 octetsVersion non golfée:
la source
Python 2,
357306299294287281276 octetsCelui-ci utilise le codage "doublé", pour être transmis à la fonction sous forme de liste. Edit: octets rasés en refaisant une partie du grand conditionnel comme sélecteur de tableau et en passant au codage doublé. Réduit plus d'octets en réorganisant encore plus le conditionnel et en convertissant plus de logique en arithmétique.
EDIT: xsot est mieux
Explication:
d
est 1 de plus que la longueur du tableau, car nous allons ajouter des zéros à chaque extrémité de la liste du deuxième élément jusqu'au zéro que nous avons ajouté à la fin.h
est la hauteur du dessin. (Nous devons diviser par 2 dans ce calcul parce que nous utilisons la représentation doublée, que nous utilisons spécifiquement pour éviter d'avoir à lancer des flotteurs en pouces partout. Nous ajoutons également 1 avant de diviser les hauteurs si étranges - bâtiments pointus-- obtenir un peu plus de dégagement que le type régulier.)o
est la chaîne de sortie.Une astuce standard pour réduire une boucle double en une boucle simple. Une fois que nous faisons:
nous avons maintenant accompli la même chose que:
mais d'une manière qui nous rapporte dix octets enregistrés (y compris les espaces sur les lignes suivantes).
Collez un mur à tout moment, la hauteur du bâtiment actuel ou du bâtiment précédent étant plus haute que la ligne actuelle, tant qu'il y a au moins une limite de bâtiment ici. C'est l'équivalent du conditionnel suivant:
où b est la hauteur de numérisation actuelle, a est la hauteur de bâtiment actuelle et c est la hauteur de bâtiment précédente. La dernière partie du conditionnel empêche de placer des murs entre les espaces au sol.
Il s'agit de la partie qui dessine le toit approprié, en sélectionnant les parties du toit en comparant la hauteur du bâtiment à la hauteur de numérisation actuelle. Si un toit ne va pas ici, il imprime un nombre approprié d'espaces (3 lorsqu'il s'agit d'un bâtiment réel, par exemple a> 0, sinon 1). Notez que lorsque nous sommes au niveau du sol, il n'essaie jamais de dessiner un toit, ce qui signifie que les bâtiments de taille 0,5 n'ont pas de toits pointus. Tant pis.
Lorsque nous sommes au niveau du sol, nous voulons des traits de soulignement au lieu d'espaces. Nous les remplaçons tous à la fois ici.
Juste avant de commencer le traitement de la ligne suivante, imprimez la ligne actuelle et effacez la ligne de sortie. Nous coupons le dernier caractère car c'est le "_" correspondant à l'espace au sol que nous avons ajouté en ajoutant un zéro au début de la fonction. (Nous avons ajouté ce zéro afin que nous n'ayons pas à ajouter un cas spécial pour insérer un mur droit, s'il existe, ce qui ajouterait beaucoup plus de code que nous n'en avons ajouté en ajoutant le 0 et en coupant le "_".)
la source
Python 3
725 octets608 octets
Code golf:
Voici le code non golfé. Il y a quelques commentaires mais l'idée de base est de créer des bâtiments à double paroi, donc la ligne de fond ressemble à:
Ensuite, pour obtenir les index de ces doubles parois et supprimer ces colonnes, nous obtenons:
Code:
Il est temps de faire du golf!
la source
ru(n):return math.ceil(n)
compte comme le golf, mais quand même ... S'il vous plaît ne prenez pas cela d'une manière négative, je ne suis pas bon golfeur moi-même, et certainement pas un bon programmeur. Je vous suggère d'essayer de l'améliorer un peu ... C'est en fait assez amusant une fois que vous réalisez que vous parvenez à le raccourcir. Je suis passé de plusieurs à 120 à 55 il y a quelques jours. C'est donc possible même si vous êtes nouveau.PHP,
307297293 octetsPrend les arguments * 2 de la ligne de commande. enregistrer dans un fichier, exécuter avec
php <filename> <parameters>
.panne
la source
C ++, non golfé
(ou peut-être ingérable)
En supposant qu'il y a moins de 100 éléments et que chaque élément est inférieur à 100.
s
est le nombre de bâtiments (requis en entrée).la source