ASCII-Kunst 3D StreetView


29

Eingang:

  1. Sie erhalten eine Reihe von ganzen Zahlen (über stdin oder prompt eingegeben).
  2. Jedes Paar von Ganzzahlen in dieser Reihe repräsentiert die BREITE eines Gebäudes [gültiger Bereich: 1..10] und die HÖHE [gültiger Bereich: 0..10].
  3. Nehmen Sie an, dass der Input wohlgeformt ist.

Beispieleingabe (die zweite Zeile dient nur zu Demonstrationszwecken):

1 2 1 1 1 0 2 4 1 3 1 2 2 1
WHWHWHWHWHWHWH

Entsprechende Beispielausgabe:

                 ______
               / ______ / |
              | | | __
              | | / __ / |
     __ | | | | __
   / __ / | | | | / __ / |  
  | | | __ | | | | | ______
  | | / __ / | | | | | / ______ / |
  | | | | _ | | | | | |
  | _o_ | _o_ | / __ | _o _____ | _o_ | _o_ | _o _____ | /
  -------------------------------------  
 - - - - - - - - - - - - 
-------------------------------------

Regeln:

Die Gebäude

  1. Ein Grundbaustein sieht so aus (1 W, 1H)
   __
 / __ / | (Der Basiswürfel wurde von demjenigen in dieser Frage ausgeliehen:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Unsere Ansicht ist (ahum) ~ 3D, sodass benachbarte Gebäude möglicherweise Teile anderer verbergen. Gebäude werden 'logisch' von links nach rechts gerendert.

  2. Vor dem ersten Gebäude stehen links zwei Felder.

  3. Sie rendern jedes Gebäude, indem Sie WIDTH und HEIGHT auf die Dimensionen des Basiswürfels anwenden (sehen Sie sich die mitgelieferte Beispielausgabe an!). Als Referenz: Anzahl der Zeichen von links nach rechts (für ein Gebäude mit W> 1): (W * 5) - (W-1).

  4. Gebäude mit einer Höhe> 0 haben EINE Tür (die vom Charakter dargestellt wird ound sich zwei Zeichen von der linken Wand in der unteren Reihe entfernt befindet).

Die Straße:

  1. Die Straße besteht aus drei Teilen, die wir "oben", "Mitte" und "unten" nennen.
  2. Der "obere" Teil und der "untere" Teil sind identisch, abgesehen von der Tatsache, dass dem "oberen" Teil zwei Leerzeichen vorangestellt sind.
  3. Dem Mittelteil geht ein Leerzeichen voraus und besteht aus einer Wiederholung des folgenden Musters:
    '-'
  4. Die Länge ist durch die Gesamtbreite der kombinierten Gebäude zu bestimmen: Der äußerste rechte Teil der Straße entspricht der Position der „rechten“ Wand des „letzten“ Gebäudes.

Gewinner:

Das ist Code-Golf! Der Gewinner ist der qualifizierende Teilnehmer mit der kürzesten Lösung (nach Anzahl der Quellcodes). Die Quelle darf nur aus druckbaren ASCII-Zeichen bestehen. Habe Spaß!

Imaginäre Bonuspunkte für (zufällige) Fenster, Autos oder Fußgänger.

Fühlen Sie sich frei zu kommentieren, wenn die Spezifikationen nicht klar sind!


@user unbekannt: es gab in der Tat einen kleinen Tippfehler in den Regeln. Sollte jetzt behoben sein, danke!
ChristopheD

Nachgestellte Leerzeichen erlaubt? Sie scheinen einige in dem Beispiel zu haben, also gehe ich davon aus.
Peter Taylor

@Peter Taylor: Leerzeichen dürfen nachgestellt werden.
ChristopheD

Straße Teil 3, sollte das sein '-  '(mit zwei Leerzeichen)? Edit : Ah, die beiden Leerzeichen zeigen nicht: P. Sie können mehrere Leerzeichen anzeigen, indem Sie ASCII 255 (nicht unterbrechendes Leerzeichen, ALT + 255 auf Nummernblock) verwenden oder indem Sie meinen Kommentar hier kopieren und einfügen. Oder ... Sie könnten stattdessen einfach sagen, es ist eine Wiederholung von ' - ':)
mellamokb

Es sieht so aus, als ob der gültige Höhenbereich tatsächlich [ 0 ..10] ist. Auch was meinst du mit but you must not enforce thisin 3)? IMO, jede Annahme kann ausgenutzt werden, wenn sie Ihre Punktzahl erhöht. Ich kann also Code schreiben, der nur funktioniert, wenn die Gesamtbreite kleiner als 80 ist, wenn ich eine geringere Anzahl von Zeichen herausdrücken kann. Wenn Sie beispielsweise eine Ausgabe in ein Anzeigepuffer-Array mit einer Breite von 80 schreiben, stürzt die Ausgabe bei jeder höheren Gesamtbreite ab. Wenn Sie möchten, dass eine beliebige Breite unterstützt wird, geben Sie nicht die Annahme an - Sie können nicht beides haben: P
mellamokb 18.01.12

Antworten:


10

Haskell, 396 Zeichen

w&h=take h((3," /|"++(w-3)#'_'++"o_|"):c[(3,"| |"++(w-1)#s++"|")])++[(2,"|/ "++(w-2)#'_'++"/"),(0,"  "++(w-2)#'_')]++c[(0,w#s)]
p(w,h)=r.z take[sum w+k|k<-[1..]]$([c"-",s:c"-  ","  "++c"-"]++).map r.foldl(z(%))((2+maximum h)#(5#s))$z(&)w h
main=interact$unlines.p.q.map read.words;y%(d,x)=x++drop d y;q(x:y:z)=(4*x:a,2*y:b)where(a,b)=q z
q x=(x,x);(#)=replicate;c=cycle;r=reverse;z=zipWith;s=' '

Beispielausgabe:

$ runghc Streetview.hs <<< "1 1 1 3 1 2 1 0 2 4 2 2 1 3 3 1"
                     ______                          
                   /______ /|                        
         __       |       | |        __              
       /__ /|     |       | |      /__ /|            
      |   | |__   |       | |_____|   | |            
      |   |/__ /| |       |/______|   | |            
     _|   |   | | |       |       |   | |__________  
   /__|   |   | | |       |       |   |/__________ /|
  |   |   |   | |_|       |       |   |           | |
  |_o_|_o_|_o_|/__|_o_____|_o_____|_o_|_o_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 Deine letzten Hashell-Einsendungen auf codegolf.se haben ein Interesse an mir geweckt, ein bisschen mehr über Hashell zu lernen. So kurz die Lösungen auch sein mögen, sie bleiben imho immer noch ziemlich "lesbar".
ChristopheD

8

Python, 415 Zeichen

I=eval(raw_input().replace(' ',','))
X=I[::2]
Y=I[1::2]
W=4*sum(X)+6
H=2*max(Y)+2
A=W*H*[' ']
p=W*H-W+2
for w,h in zip(X,Y):i=2*h;j=4*w;q=p-i*W;r=p+j;s=q+j;A[p+1:q+1:-W]=A[p+2:q+2:-W]=i*' ';A[p:q:-W]=A[r:s:-W]=A[r+2-W:s+2-W:-W]=i*'|';A[p+1:r]='_'*(j-1);A[q+2:s]=A[q+3-W:s+1-W]='_'*(j-2);A[q+1]=A[s+1]=A[r+1]='/';A[p+2]='_o'[h>0]; p+=j
A[W-1::W]='\n'*H
D=(W-5)*'-'
print''.join(A)+'  '+D+'\n'+(' - '*W)[:W-4]+'\n'+D

Zeichnet mit Slices alle Gebäudeteile.

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------

+1 Sehr schön. Die Lösung sieht schon ziemlich gut aus ;-)
ChristopheD

2
Bei `p + = j` (am Ende der langen Zeile) ist ein Leerzeichen verloren gegangen. Ich
ChristopheD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.