ASCII kemerleri oluşturun


17

Ascii sanatını seviyorum ve çok sıkıldım, bu yüzden bazı ascii karakterleri buldum ve rastgele şeyler, 8-bit mario kalesi, labirentler ve kemerler yapmaya başladım. Kemerin düzgün bir şekilde kolayca istiflenebileceğini buldum.

╔═══════╗
║╔═════╗║
║║╔═══╗║║
║║║╔═╗║║║
╨╨╨╨─╨╨╨╨

Meydan okuma

0'dan büyük veya ona eşit bir tamsayıyı kabul eden (bonusu yapmazsanız) bir program, işlev veya başka bir standart biçim oluşturun ve belirtilen miktarda kemerle ascii sanat çıktısı alın.

Test Durumları

Giriş:

7

Çıktı:

╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

Alt:

+-------------+
|+-----------+|
||+---------+||
|||+-------+|||
||||+-----+||||
|||||+---+|||||
||||||+-+||||||
||||||| |||||||
---------------

Giriş:

1

Çıktı:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Tam sayı 0 ise hiçbir şey çıktılamayın
  • Bu soru utf-8'de olacak, her karakter bir "bayt" olarak sayılacak
  • Bu bu yüzden en kısa cevap kazanıyor.
  • Bunun +-+yerine ╔═╗, ---yerine ╨─╨ve |yerine kullanma seçeneğiniz vardır .

Bonus (alternatif sürümde buna izin verilip verilmeyeceğine karar verilmedi, çünkü o kadar zor olmayacaktı)

Program negatif sayıları destekliyorsa ve kemerleri böyle döndürürse% -10

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝

3
AFAIK bunlar ASCII karakterleri değildir. unicode-art
flawr

welp, @flawr haklısın. Şimdi ne var ...
JuanPotato

Dünya çökecek! Endişelenmeyin, belki de sadece standart
ASCII'nin

Yine de genişletilmiş ASCII'ye benziyor, bu yüzden muhtemelen iyisin.
Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ genişletilmiş ASCII hiçbir standart sürümü kullanıma en.wikipedia.org/wiki/Extended_ASCII orada yakın şey kod sayfası 437 en.wikipedia.org/wiki/Code_page_437 ABD ve diğer birçok ülkede standart ama bulduğumda bunu bir kod sayfası 437 düzenleyicisine kopyalayıp yapıştırın ve pencerenin içine "yorumladığı" +---+üst, yanları |ve altları -----bana göre iyi görünen kemerler olarak yapıştırın . Juanpotato, ascii olmayan karakterleri kullanmak istiyorsanız, lütfen sorudaki kodlamayı belirtin. Durduğu gibi belirsiz olarak kapatmak için oy kullanıyorum.
Level River St

Yanıtlar:



2

Python 2, 106 bayt (94 karakter)

n=input();j=1
exec"s=j/2*'║';print s+'╔'+'═'*(2*n-j)+'╗'+s;j+=2;"*n
if n:t='╨'*n;print t+'─'+t

Oldukça basit. Değişen sayıda yatay ve dikey çubukla satır satır yazdırır. Son satır ayrı olarak yazdırılır.

Bazı optimizasyonları kaçırdığımı hissediyorum. Karakterlerin birden fazla bayt olması, böyle bir şey yapamayacağınız anlamına gelir '║╨'[n>0], bu yüzden döngüdeki son satırı yazdırmak için iyi bir yol bulamadım. Tezgahta çok fazla manipülasyon olması çok çirkin. Doğrudan dizeleri güncellemek istiyorum s+='║', ancak dizin yatay çubuklar için de kullanılır.


Artık +-|kemerleri oluşturmak için kullanabilirsiniz , örnekler için bkz.
JuanPotato

2
@JuanPotato OP, orijinal poster anlamına gelir. Soru mu demek istiyorsun?
Addison Crump

1
@flagasspam evet, sadece orijinal yazı anlamına gelen kullanımları gördüm
JuanPotato

2

Perl, 78 82 karakter

$n='─';$_='══'x pop;while(s/══//){print"$s╔═$_╗$s\n";$s.="║";$n="╨$n╨"}$s&&print$n

Ne yazık ki, boyutu% 10'dan fazla artırmadan bonusdan yararlanmanın bir yolunu bulamadım. Henüz galip gelebilirim.

Ungolfed

Gerçekten çok basit. Alt satırı ( ╨$n╨) adım adım geliştirir, üst satırı ( ══) iki karakterle kısaltır, artık kısaltılamadığında sona erer, bu nedenle sayaçlarla uğraşmak zorunda kalmam.

 $n = '─'; # Bottom line
 $_ = '══'x pop; # "Top" line, length from commandline argument
 while (s/══//) { # Shorten top line by two characters
     print "$s╔═$_╗$s\n"; # Print current line with $s (sides)
     $s .= "║";           # Append vertical bar to sides
     $n  = "╨$n╨";        # Widen bottom line
 }
 $s && print $n; # Print bottom line if input is not 0

Bu n = 0 için tek bir baskı düşünüyorum , ama hiçbir şey yazdırmak gerekir.
Lynn

@Mauris Az önce koştum ve
haklısın

1
@Mauris Dang! Kesinlikle haklısın. Orijinal versiyonum iyiydi, ama çizgi boyunca bir yerde çek kaybettim. Sabit, 4 karakter pahasına. Bunu tespit ettiğiniz için teşekkürler.
type_outcast

Bunun eski olduğunu biliyorum, ancak @ Abigail'in yorumuna eklemek için baytları da kullanarak kaydedebilirsiniz -n: Çevrimiçi deneyin!
Dom Hastings

1

Bash, 124 bayt (112 karakter)

printf -vh %$1s
b=${h// /╨}
h=${h// /═}
for((n=$1;n--;)){
echo $v$h${h:1}╗$v
h=${h#?}
v+=║
}
(($1))&&echo $b$b

Örnek çalışma:

bash-4.3$ bash ascii-arch.sh 7
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ bash ascii-arch.sh 1
╔═╗
╨─╨

bash-4.3$ bash ascii-arch.sh 0

1

Japt -R , 29 bayt

Kullanır +& -. Kanlı giriş doğrulaması için 4 bayt feda edildi!

©Æ'+²¬q-p´UÑÄÃpS û| p-pNÑÄ)ªP

Dene


açıklama

                                  :Implicit input of integer U
©                                 :Logical AND with U
 Æ                                :Map the range [0,U)
  '+                              :  Literal "+"
    ²                             :  Repeat twice
     ¬                            :  Split
      q                           :  Join with
       -                          :   Literal "-"
        p                         :   Repeat
         ´U                       :    Decrement U
           Ñ                      :    Multiply by 2
            Ä                     :    Add 1
             Ã                    :End mapping
              pS                  :Push a space
                 û|               :Centre pad each element with "|" to the length of the longest element
                    p     )       :Push
                     -            : Literal "-"
                      p           : Repeat
                       N          :  The array of inputs (which will be cast to an integer if we perform a mathematical operation on it)
                        ÑÄ        :  Multiply by 2 and add 1
                           ª      :Logical OR
                            P     :The empty string
                                  :Implicitly join with newlines and output

girişte başarısız0
dzaima

@dzaima, ne demek istiyorsun? 0 büyüklüğünde bir kemerin nasıl olabilir?
Shaggy

If the integer is 0 then don't output anythingmeydan okumadan: /
dzaima

@ dzaima, Oh, bunu özledim. Teşekkürler. Her şeyden önce: Giriş doğrulama için boons! İkincisi, Japt hiçbir şey veremez - çıktı verebilirim 0, falseya da boş bir dize, bazı baytlar pahasına, ama bunlardan herhangi birinin kabul edilebilir olup olmayacağını bilmiyorum, belki, bana 5 bayt'a mal olacak boş dize ( 0sadece bana mal olacak 1).
Shaggy

0

JavaScript (ES6), 101 karakter

f=(n,i=0)=>n?i-n?(b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1):(g="╨"[r](n))+"─"+g:""

açıklama

Her satırı basan özyinelemeli işlev

f=(n,i=0)=>              // f = recursive function, i = current line (default = 0)
  n?                     // if n != 0
    i-n?                 // if we are not in the last line, print the line
      (b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1)               // add the output of the next line
    :(g="╨"[r](n))+"─"+g // if we ARE in the last line, print the last line
  :""                    // print nothing if n = 0

Ölçek

Test, tarayıcı uyumluluğu için varsayılan parametreyi kullanmaz.


0

PHP (109 karakter)

$s='';for($b=($n=$argv[1])?'─':'';$n--;){echo$s.'╔═'.str_repeat('══',$n)."╗$s\n";$s.='║';$b="╨{$b}╨";}echo$b;

Hala bu str_repeat kurtulmak gerekir, ancak çoğu alternatif mulyibyte chars işlemez.

$s = '';
// Initialise $b (bottom) to '─' or '' for n==0
for ($b = ($n = $argv[1]) ? '─' : ''; $n--;) {
    // Echo sides + arch + sides
    echo $s . '╔═' . str_repeat('══', $n) . "╗$s\n";
    // Growing sides
    $s .= '║';
    // Growing bottom
    $b = "╨{$b}╨";
}
// Show bottom
echo $b;

0

Retina , 79 karakter

.+
$0$*═$0$*═╗
^═
╔
+`(║*)╔═(═+)═╗║*$
$0¶$1║╔$2╗║$1
(\S+)$
$0¶$1
T`═╔╗║`─╨`\S+$

Çevrimiçi deneyin.

Bu, Retina'da ondalık bir sayıyı \d+bu kadar çok karakterin listesiyle değiştiren yeni bir özellik kullanır $0$*═.


0

Swift (209 bayt)

Muhtemelen Swift bunun için en iyi dil değil, bu benim ilk kez bir kod golf meydan okuma yapmaya çalışıyorum:

func *(l:String,r: Int)->String{return r>0 ?l+(l*(r-1)):""}
let n=Int(readLine()!)!
for i in 0...(n-1){let a=("║"*i)+"╔═";let b=a+("══"*(n-1-i))+"╗"+("║"*i);print(b)};print("╨"*n+"─"+"╨"*n)

0

Ruby, 90 bayt (74 karakter)

->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}

Örnek çalışma:

2.1.5 :001 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[7]
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨
 => nil 

2.1.5 :002 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[1]
╔═╗
╨─╨
 => nil 

2.1.5 :003 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[0]
 => false 

0

Haskell'in 151 162 bayt

r=replicate
c=concat
f n=putStr$unlines[c[r i '║',"╔",r(2*(n-i)-1)'═',"╗",r i '║']|i<-[0..n-1]]++c[r n '╨',r(signum n)'─',r n '╨']
main=readLn>>=f

Edit: 0girdi olarak başa çıkmak unuttum


0

𝔼𝕊𝕄𝕚𝕟, 54 karakter / 95 bayt

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1

Try it here (Firefox only).

açıklama

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1 // implicit: ï=input, $=mapped item
                                                       // PHASE 1
⩥ïⓜ                                                   // create a range to map over
    ᵖ                                                  // push to stack:
     ⟮ ⍘|ď⟯$                                            // | repeated $ times
           +`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`                      // & +[- repeated 2$-1 times]+
                                 +Ⅰ$;                  // & | repeated $ times
                                                       // PHASE 2
                                     ï⅋                // if ï>0
                                       ᵖ               // push to stack 2 items:
                                        Ⅰï+⬭+Ⅰï,      // | repeated $ times & [space] & | repeated $ times
                                                 Ⅱ*2+1 // and - repeated 2ï+1
                                                       // implicit stack output, newline-separated

NOT: Bu, normal değişken bildiriminin ulaşamadığı noktalara ulaşmak için iyi ol 'bloklarını kullanır.


0

Sed, 97 bayt (81 karakter)

(96 bayt (80 karakter) kodu + 1 karakter komut satırı seçeneği)

s/.(.*)/2&\13/
t
:
H
s/(.+)11(.+)/4\1\24/
t
y/1234/─╨╨╨/
H
g
s/\n//
y/1234/═╔╗║/

Girdi tekli olarak bekleniyor tamsayı .

Örnek çalışma:

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< ''

Sed, 105 bayt (75 karakter)

(104 bayt (74 karakter) kodu + 1 karakter komut satırı seçeneği)

y/1/═/
s/.(.*)/╔&\1╗/
t
:
H
s/(.+)══(.+)/║\1\2║/
t
y/╔║╗═/╨╨╨─/
H
g
s/\n//

Girdi tekli tamsayı olarak bekleniyor .

Örnek çalışma:

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< ''

0

Tuval , 15 bayt

-*+∔]⤢:↷±n│L-×∔

Burada deneyin!

Açıklama:

{    ]            map over 1..input
 -*                 repeat "-" counter times
   +∔               append "+" to that
      ⤢           transpose
       :          create a duplicate of that
        ↷±        rotated 90°, then reversed horizontally
          n       overlap the 2
           |      and palindromize horizontally with 1 overlap
            L     get the with of that
             -×   repear "-" that many times
               ∔  and add vertically to the rest of the output
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.