Bentang Alam ***

28

Tujuan : Menulis sebuah program yang menghasilkan lanskap dan langit-langit ASCII-art yang indah (?)!

Program Anda hanya memiliki satu input: string yang terdiri dari kombinasi / pengulangan karakter apa pun 0123456789abc.

Untuk setiap karakter input, hasilkan garis vertikal yang disusun sebagai berikut:

         .
        ..
       ...
      oooo
     ooooo
    OOOOOO
   OOOOOOO
  XXXXXXXX
 XXXXXXXXX
XXXXXXXXXX

0123456789

abcSebaliknya, huruf diikuti oleh satu angka n, dan menggambar garis vertikal n dengan masing-masing 1,2 atau 3 lubang (spasi) di bagian bawah.

Contohnya

Gedung Crysler

Input: 2479742

   .
   .
  ...
  ooo
  ooo
 OOOOO
 OOOOO
XXXXXXX
XXXXXXX
XXXXXXX

Taj Mahal

Input: 0804023324554233204080

 .                  .
 .                  .
 o                  o
 o        oo        o
 O O     OOOO     O O
 O O  OO OOOO OO  O O
 X X XXXXXXXXXXXX X X
 X X XXXXXXXXXXXX X X
XXXXXXXXXXXXXXXXXXXXXX

Menara Eiffel

Input: 011a2b3b5c9c9b5b3a2110

      ..
      ..
      ..
      oo
     oooo
     OOOO
    OOOOOO
   XXX  XXX
 XXX      XXX
XXX        XXX

Anda dapat mengasumsikan input tidak kosong dan inputnya baik.
Bahasa apa pun diterima, dari A + hingga Z ++ .

Ini adalah kode-golf: kode sumber terpendek menang .
Jika ada sesuatu dalam aturan yang tidak jelas, jangan ragu untuk bertanya di bawah ini di komentar.

Bersenang-senang, dan dapatkan struktur tinggi seratus meter dalam beberapa byte!

(dan jangan lupa untuk memasukkan bangunan favorit Anda dalam solusi Anda)

PS: tidak, Anda tidak dapat mengunduh / mengakses data dari Internet, menggunakan nama file Anda sebagai data dan semua itu. Adil, dan gunakan hanya keterampilan kode-golf Anda.

Gabriele D'Antona
sumber
Sepertinya tinggi 9 bagi saya ...: -?
Gabriele D'Antona
Oh, saya melihatnya: bagian atas didefinisikan sebagai "c9", yang berarti: menggambar garis vertikal dengan ketinggian 9 dan mencukur 3 karakter bawah. Itu sebabnya nampaknya tinggi untuk Anda. Baca peraturan lagi dan beri tahu saya jika tidak apa-apa.
Gabriele D'Antona
ok, saya salah membaca spesifikasi offset Anda.
Howard

Jawaban:

5

GolfScript, 69

'XXXOOoo...':s\{.96>{96-.' '*\@>+}{47-<' '10*+10<s\}if}%10/zip-1%n*\;

Tidak jauh dari solusi APL.

Tes online

Keriangan
sumber
5

Rubi, 88 85

Tantangan yang menyenangkan!

9.downto(0){|h|puts$*[0].gsub(/(\D?)(.)/){'XXXOOoo... '[h<$1.hex-9||$2.hex<h ?-1:h]}}

Mengambil input pada commandline, misalnya:

ruby landscapes.rb 011a2b3b5c9c9b5b3a2110

Akan dicetak:

      ..      
      ..      
      ..      
      oo      
     oooo     
     OOOO     
    OOOOOO    
   XXX  XXX   
 XXX      XXX 
XXX        XXX
Paul Prestidge
sumber
5

Python 2.7 - 186

Mungkin bisa lebih pendek ...

x=[]
l=iter(raw_input())
a="XXX00oo..."
for i in l:
 try:i=int(i);o=0
 except:o=" abc".index(i);i=int(next(l))
 x.append(" "*o+a[o:i+1]+" "*(9-i))
for i in zip(*x)[::-1]:print''.join(i)

Contoh dijalankan:

08040233245542332040800000247974200000011a2b3b5c9c9b5b3a2110
                             .              ..
 .                  .        .              ..
 .                  .       ...             ..
 o                  o       ooo             oo
 o        oo        o       ooo            oooo
 0 0     0000     0 0      00000           0000
 0 0  00 0000 00  0 0      00000          000000
 X X XXXXXXXXXXXX X X     XXXXXXX        XXX  XXX
 X X XXXXXXXXXXXX X X     XXXXXXX      XXX      XXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX        XXX

Jembatan Pelabuhan Sydney

a1a13443a1a2a3a4a5a6a6a7a7a8a8a8a8a9a9a9a9a9a9a8a8a8a8a7a7a6a6a5a4a4a3a2a13443a1a1
                   ......
               ..............
             ..................
           oooooooooooooooooooooo
          oooooooooooooooooooooooo
   00    000000000000000000000000000    00
  0000  00000000000000000000000000000  0000
  XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  XXXX                                 XXXX

Jembatan Golden gate / logo Cisco

a2a0a0a4a0a06a0a0a4a0a0a2a0a0a4a0a06a0a0a4a0a0a2



      o           o
      o           o
   0  0  0     0  0  0
   0  0  0     0  0  0
X  X  X  X  X  X  X  X  X
X  X  X  X  X  X  X  X  X
      X           X

Ngomong-ngomong, pertanyaan bagus!


sumber
Monumen yang luar biasa! :)
Gabriele D'Antona
5

C64 BASIC, 276 karakter PETSCII

Solusi saya sendiri, bermain golf hingga 276 karakter dan 10 baris BASIC V2.0!

0inputa$:dIc$(10):fOi=0to9:rE c$(i):nE:fOr=0to9
1z=1
2c=aS(mI(a$,z,z+1))
3ifc>57tHgO8
4ifc>=57-r tH?c$(9-r);:gO6
5?" ";
6z=z+1:ifz<=len(a$)gO2
7?:nE:eN
8z=z+1:w=aS(mI(a$,z,z+1)):ifw>=57-r aNc<=73-r tH?c$(9-r);:gO6
9?" ";:gO6:dA"x","x","x","o","o","W","W",".",".","."

(salin dan tempel dalam emulator untuk melihat hasilnya).

Dan akhirnya, monumen favorit saya, Jembatan Brooklyn :)

masukkan deskripsi gambar di sini

Gabriele D'Antona
sumber
5

C, 130 126 karakter

Agak lama dibandingkan dengan kompetisi, tapi saya menyalahkan bahasa ...

char*p,b[99];r=10,q;main(o){for(gets(&b);r--;puts(""))
for(p=b;q=*p++;)o=q<60?putchar("XXXOOoo... "[o<r&r<q-47?r:10]),-1:q-97;}

Saya tidak tahu tentang bangunan favorit , tetapi salah satu yang lebih dikenal di sekitar sini adalah Globen , jadi ini adalah terjemahan yang buruk.

% ./a.out <<<24556667777776665542


       ......       
    oooooooooooo    
  oooooooooooooooo  
 OOOOOOOOOOOOOOOOOO 
 OOOOOOOOOOOOOOOOOO 
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
FireFly
sumber
Anda dapat memotong karakter dengan mengubah urutan deklarasi agar char b[99],*p;terbaca char*p,b[99];. Juga mungkin lebih pendek untuk digunakan putsuntuk mencetak baris baru.
C0deH4cker
@ C0deH4cker bagus, terima kasih! Itu menyelamatkan saya empat karakter.
FireFly
@Friol oh, saya tidak bermaksud seperti itu sama sekali, hanya saja saya tidak tahu apa yang akan saya anggap bangunan favorit saya. : P
FireFly
3

APL ( 69 66)

' XXXOOoo...'[1+⌽⍉⌽↑{z×(z<' abc'⍳⍵)<(1+⍎⍺)≥z←⍳10}/↑2↑¨I⊂⍨⎕D∊⍨I←⌽⍞]

Contoh:

      'XXXOOoo ...' [1 + ⌽⍉⌽ ↑ {z × (z <'abc'⍳⍵) <(1 + ⍎⍺) ≥z ← ⍳10} / ↑ 2 ↑ ¨I⊂⍨⎕D∊⍨ Saya ← ⌽⍞]
0804023324554233204080

 . .
 . .
 oo 
 o oo o 
 OO OOOO OO 
 OO OO OOOO OO OO 
 XX XXXXXXXXXXXX XX 
 XX XXXXXXXXXXXX XX 
XXXXXXXXXXXXXXXXXXXXXX

      'XXXOOoo ...' [1 + ⌽⍉⌽ ↑ {z × (z <'abc'⍳⍵) <(1 + ⍎⍺) ≥z ← ⍳10} / ↑ 2 ↑ ¨I⊂⍨⎕D∊⍨ Saya ← ⌽⍞]
011a2b3b5c9c9b5b3a2110
      ..      
      ..      
      ..      
      oo      
     oooo     
     OOOO     
    OOOOOO    
   XXX XXX   
 XXX XXX 
XXX XXX
marinus
sumber
Saya tidak mengenal APL dengan sangat baik, tetapi apakah Anda yakin Anda memerlukan ruang di awal string 'XXXOOoo ...'?
Gabriele D'Antona
@ friol: ya, ini digunakan untuk mengisi ruang "kosong"
marinus
2

PowerShell , 127 byte

$r=,''*10
$args|% t*y|%{if($_-in97..99){$b=$_-96}else{,' '*$b+'XXXOOoo...'[$b.."$_"]+,' '*(9-"$_")|%{$r[--$i]+=$_}
$b=$i=0}}
$r

Cobalah online!

mazzy
sumber
2

Kanvas , 35 33 byte

±{⌐╷≡?┤╵“`Fc|C!‟m]c96- ×11╋╋}})⤢⇵

Coba di sini!

dzaima
sumber
2

PHP ,131 114 byte

for($b=10;$b--;print"
")foreach(str_split($argn)as$a)$c=strpos(' abc',$a)?:!print$a<$b|$b<$c?' ':'XXXOOoo...'[$b];

Cobalah online!

$ echo 2479742|php -nF land.php 
   . 
   . 
  ... 
  ooo 
  ooo 
 OOOOO 
 OOOOO 
XXXXXXX 
XXXXXXX 
XXXXXXX 


$ echo 011a2b3b5c9c9b5b3a2110|php -nF land.php 
      .. 
      .. 
      .. 
      oo 
     oooo 
     OOOO 
    OOOOOO 
   XXX  XXX 
 XXX      XXX 
XXX        XXX 


$ echo a2a0a0a4a0a06a0a0a4a0a0a2a0a0a4a0a06a0a0a4a0a0a2|php -nF land.php 



      o           o 
      o           o 
   O  O  O     O  O  O 
   O  O  O     O  O  O 
X  X  X  X  X  X  X  X  X 
X  X  X  X  X  X  X  X  X 
      X           X
Russ G
sumber
1

Perl 6 , 93 byte

{for 9...0 ->\n {say .subst(/(\D)?(.)/,{'XXXOOoo... '.comb[$1>=n>=ord($0//0)-96??n!!10]}):g}}

Blok yang mengambil string dan mencetak ke stdout.

Cobalah online!

bb94
sumber
1

05AB1E (warisan) , 34 byte

Rvy.ïi"XXXOOoo..."y>£ëðAykÝǝ])ζRí»

Menggunakan versi lawas 05AB1E untuk menghemat 2 byte, karena ζjuga berfungsi pada string, bukan hanya daftar karakter.

Cobalah online.

Penjelasan:

R                  # Reverse the (implicit) input-string
 v                 # Loop `y` over each character:
  yi             #  If `y` is a digit:
      "XXXOOoo..." #   Push string "XXXOOoo..."
        y        #   And only leave the first `y`+1 characters as substring
     ë             #  Else (`y` is a letter):
       Ayk         #   Get the index of `y` in the lowercase alphabet
          Ý        #   Create a list in the range [0, alphabet-index]
      ð    ǝ       #   Replace in the string at the top of the stack the characters at
                   #   those indices with a space
 ]                 # Close the if-else statement and loop
  )                # Wrap all strings on the stack into a list
   ζ               # Zip/transpose; swapping rows/columns
    Rí             # Reverse this list, as well as each individual line
      »            # And join the strings by newlines
                   # (after which the result is output implicitly)

Adapun 'bangunan' favorit saya, mari kita pergi dengan pohon ini. ;)

b2b3b4b5b6b7898b7b6b5b4b3b2

       .       
      ...      
     .....     
    ooooooo    
   ooooooooo   
  OOOOOOOOOOO  
 OOOOOOOOOOOOO 
XXXXXXXXXXXXXXX
      XXX      
      XXX      
Kevin Cruijssen
sumber
1

Japt -R , 36 byte

óȦnãÒXÌ î"XXXOOoo..."hSpXÎnD)s9Ãz3

Cobalah

óȦnãÒXÌ î"..."hSpXÎnD)s9Ãz3     :Implicit input of string
ó                                 :Partition at
 È                                :Characters that return true when passed through the following function
  ¦                               :  Test for inequality with
   n                              :  Convert to number
    Ã                             :End function
     £                            :Map each X
      Ò                           :  Bitwise increment
       XÌ                         :  Last character of X
          î                       :  Slice the following to that length
           "..."                  :    Literal string
                h                 :    Replace as many characters as necessary at the start of that string with
                 S                :      Space
                  p               :      Repeat
                   XÎ             :        First character of X
                     n            :        Convert from base
                      D           :        14
                       )          :      End repeat
                        s9        :      Slice off the first 9 characters
                          Ã       :End map
                           z3     :Rotate clockwise by 90 degrees 3 times
                                  :Implicit output, joined by newlines
Shaggy
sumber