Zeichnen Sie die Schatten von Gebäuden

23

Eingang:

1
      X                                
      X                                
      X                                
      X      XX    XXXXXX     X X X    
      X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    

Ausgabe:

      X.                               
      X..                              
      X...                             
      X....  XX.   XXXXXX.    X.X.X.   
      X..... XX..  XXXXXX..   X.X.X..  
XXX.  X......XX... XXXXXX...  X.X.X... 
XXX.. X......XX....XXXXXX.... X.X.X....

Eingang:

2
         XX
         XX
         XX
         XX
         XX
     XX  XX
     XX  XX
     XX  XX
     XX  XX

Ausgabe:

        .XX
       ..XX
      ...XX
     ....XX
    .....XX
   ..XX..XX
  ...XX..XX
 ....XX..XX
.....XX..XX

Spezifikation:

  • Sie müssen als Eingabe nehmen
    1. Eine Flagge, die anzeigt, ob das Licht von links oben oder rechts oben kommt. Dies kann 1oder sein 2, -1oder 1, 0oder 65536, oder was auch immer für Sie bequem ist, solange beide Flags Ganzzahlen sind.
    2. Zeilen, die entweder aus Xoder aus Zeichen bestehen, die alle dieselbe Länge haben (dh mit Zeichen aufgefüllt sind )
      • Alle Xs befinden sich entweder in der letzten Reihe oder haben eine Xdarunter (dh keine schwimmenden Gebäude)
  • Sie müssen die Zeilen (Gebäude) mit Schatten ausgeben. Dies geschieht mit folgendem Verfahren:
    • Wenn das Licht von oben links kommt, zeichnen Sie ein rechtwinkliges Dreieck von .s mit der gleichen Höhe und Breite wie die Höhe des Gebäudes. Beginnen Sie mit einem Abstand von einem Feld nach dem rechten Rand und gehen Sie nach rechts.
    • Andernfalls, wenn es von rechts oben ist, machen Sie dasselbe, aber beginnen Sie an einer Stelle hinter dem linken Rand und zeigen Sie nach links.
    • Denken Sie daran, ändern Sie Xs nicht, indem Sie sie in .s ändern . lass sie wie sie sind.
    • Es wird immer "Raum" für Ihre Schatten geben, dh wenn sich am Ende ein 3-Feld-Hochhaus befindet, werden mindestens 3 Felder Polsterung folgen.
  • Das ist , also gewinnt der kürzeste Code in Bytes!
Türknauf
quelle
1
Kann ich {}und {-1*}als Flagwerte verwenden?
John Dvorak
@Jan Ja, das kannst du. Sie könnten sogar potatound verwenden while(1){}. Wie in der Frage zitiert, "was auch immer bequem ist."
Türklinke
2
:( Ich wollte das in (.NET-aromatisiertem) Regex lösen, aber ich glaube, ich habe einen Fehler gefunden, bei Regex.Replacedem ich nicht umgehen kann ... habe ich jetzt zwei Probleme?
Martin Ender
3
@Doorknob Jemand wird diese Regel missbrauchen, um nur seinen gesamten Code in der Eingabe zu haben.
ɐɔıɐɔu Aprs
2
@Synthetica Das ist eine der "Standardlücken".
Türklinke

Antworten:

6

GolfScript, 67 Zeichen

n%(~:S\zip\%.0=\{.' '3$);+{{\(@[\].~<=}%+}:M~'X'/'.'*@@M}%S%zip\;n*

1 / -1 für Schatten nach rechts / links. Führen Sie das Beispiel online aus :

      X.                               
      X..                              
      X...                             
      X....  XX.   XXXXXX.    X.X.X.   
      X..... XX..  XXXXXX..   X.X.X..  
XXX.  X......XX... XXXXXX...  X.X.X... 
XXX.. X......XX....XXXXXX.... X.X.X....
Howard
quelle
11

Perl - 85

BEGIN{$d=-<>}$d?s/X /X./g:s/ X/.X/g;s/ /substr($p,$+[0]+$d,1)eq'.'?'.':$&/ge;$p=$_;

EDIT: Ich habe völlig vergessen, -pmit welcher Flagge das laufen soll. 2 zur Zeichenanzahl hinzugefügt.
Das in der ersten Zeile angegebene Flag gilt 0für Schatten nach links und 2für Schatten nach rechts.

mniip
quelle
4

Python 3 - 233

Nun, das war länger als erwartet ...

1 für Schatten nach rechts, -1 für Schatten nach links.

d,x=int(input()),[1]
while x[-1]:x+=[input()]
x,o,l,h=list(zip(*x[1:-1]))[::d],[],0,len(x)-1
for i in x:o+=[''.join(i[:len(i)-l])+''.join(i[len(i)-l:]).replace(' ','.')];l=max(l-1,i.count('X'))
for i in zip(*o[::d]):print(''.join(i))

BEARBEITEN: Keine der beiden Seiten wurde in den Regeln aufgefüllt. Ehehe. ^^ '

cjfaure
quelle
3

JavaScript - 14

eval(prompt())

Das Flag in der ersten Zeile steht for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));für Schatten nach links oder for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));für Schatten nach rechts.

Dies könnte die Regel "Was auch immer für Sie bequem ist" für die Flagge missbrauchen: P


Bearbeiten: ohne Missbrauch (127):

c=prompt();for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+c]=='.'||p[b]=='.'||l[b+c]=='X'?'.':a}));

Die Flagge dafür ist 1oder-1

Zaq
quelle
Gut, ich habe die Regeln festgelegt. :-P
Türklinke
Aaww, das macht keinen Spaß :-( Dies führt dazu, dass "beide Flags sind Ganzzahlen" mit Ihrem Kommentar "Sie könnten sogar potato..." in Konflikt geraten , es potatosei denn, es handelt sich um eine Ganzzahl. :-P
Zaq
c=+prompt()oder b+cwird als Zeichenfolge verkettet.
Nderscore
Optimierte ein paar Dinge und brachte es auf 119: for(c=p=+(P=prompt)(d='.');l=P();)console.log(p=l.replace(/ /g,function(a,b){return p[b]==d|p[b+=c]==d|l[b]=='X'?d:a})) (Demo)
nderscore
Speichern Sie ein weiteres Byte beim Konvertieren cin eine Zahl, indem Sie stattdessen subtrahieren. b-coder b-=cin meinem Code oben. (Demo)
nderscore
1

Python 2.7 - 229

p,s,M,J,L=input(),__import__('sys').stdin.readlines(),map,''.join,len
n,s,r,f=L(s),M(str.strip,M(J,zip(*s[::-1]))),0,[]
for l in s[::p]:f,r=f+[(l+'.'*(r-L(l))+' '*n)[:n]],max(r-1,L(l))
print'\n'.join(M(J,zip(*f[::p])[::-1]))

Ungolfed Version

def shadow(st, pos):
    _len = len(st)
    st = map(str.strip, map(''.join,zip(*st[::-1])))
    prev = 0
    res = []
    for line in st[::[1,-1][pos-1]]:
        res +=[(line+'.'*(prev-len(line)) + ' '*_len)[:_len]]
        prev = max(prev - 1, len(line))
    return '\n'.join(map(''.join,zip(*res[::[1,-1][pos-1]])[::-1]))
Abhijit
quelle