建物の影を描く


23

入力:

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    

出力:

      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....

入力:

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

出力:

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

仕様:

  • 入力として受け取らなければなりません
    1. ライトが左上から来るか右上から来るかを示すフラグ。両方のフラグが整数である限り、これは1or 2-1or 10or 65536、またはあなたにとって便利なものになります。
    2. Xまたはで構成された行で、すべて同じ長さの文字(つまり、で埋め込まれた
      • すべてXのが最後の行にあるか、そのX下にあります(浮き建物がないことを意味します)
  • 影を追加した行(建物)を出力する必要があります。これは、次の手順で実行されます。
    • ライトが左上から来る場合.は、建物の高さと同じ高さと幅で、右端を過ぎた1つのスペースから右に向かって、sの直角三角形を描きます。
    • それ以外の場合、右上からの場合は同じことを行いますが、左端を過ぎて左を指す1つのスペースから開始します。
    • Xsをsに変更して変更しないでください.。そのままにしておきます。
    • 影には常に「部屋」があります。つまり、最後に3スペースの高さの建物がある場合、その後に少なくとも3スペースのパディングがあります。
  • これはなので、バイト単位の最短コードが勝ちます!

1
{}and {-1*}をフラグ値として使用できますか?
ジョンドヴォルザーク14

@Janはい、できます。potatoとを使用することもできますwhile(1){}。質問で引用されているように、「便利なものは何でも」。
ドアノブ

2
:((。NET風味の)正規表現でこれを解決しようとしていましたが、Regex.Replace回避できないバグを見つけたと思います...今2つの問題がありますか?
マーティンエンダー14

3
@Doorknob誰かがこのルールを悪用して、入力にコード全体を含めるだけです。
ɐɔıʇǝɥʇuʎs

回答:


6

GolfScript、67文字

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

左右に行く影の場合は1 / -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....

11

Perl-85

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

編集:私は-pこれを実行する必要があるフラグを完全に忘れていました。文字数に2を追加しました。
最初の行で指定されたフラグは0、影が左に2、影が右に向かうためのものです。


4

Python 3-233

まあ、それは予想よりも長いことが判明しました...

影が右に行く場合は1、左に行く場合は-1。

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))

編集:ルールの両側のパディングが表示されませんでした。えへへ。^^ '


3

JavaScript-14

eval(prompt())

最初の行のフラグは、for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));左向きのfor(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));影または右向きの影用です。

これ、フラグの「あなたにとって便利なもの」ルールを乱用する可能性があります。


編集:乱用なし(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}));

このフラグは1または-1


ルールを修正しました。:-P
ドアノブ

何の楽しみませんAaww、:-(このメイクは、あなたのコメントとの競合「の両方のフラグが整数である」「あなたも使用することができないpotato...」、しない限り、potato整数です:-P。
ZAQ

c=+prompt()またはb+c、文字列として連結されます。
nderscore 14

いくつかのことを最適化し、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})) (デモ)
nderscore

c代わりに減算して、数値に変換するときに別のバイトを保存します。b-cまたはb-=c上記の私のコードで。(デモ)
nderscore 2014

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]))

非ゴルフバージョン

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]))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.