Merdiven Mücadelesi


20

İşiniz bu sanat eserini yeniden yaratmaktır:

                        _____
                       |
                       |
                       |
                       |
                  _____| 
                 |
                 |
                 |
                 |
            _____|
           |
           |
           |
           |
      _____|
     |
     |
     |
     |
_____|

Cevap bunu yeniden oluşturmalı ve sonuç olarak yazdırmalıdır. İzin verilen tüm diller, doğrudan sanat baskısı yok, ofc, bir miktar manipülasyon gerekli. En az bayt ile cevap kazanır.

Perşembe 06: 30'da UTC veya benzeri kapanır.

Orijinal şey bana bunu Java ile yapan arkadaşım tarafından gösterildi, bana kaynak kodunu göstermeyi reddetti ve şimdi ona muhtemelen diğer dillerin parlaklığıyla göz kamaştıracağım. : D

Alternatif karakter kullanamazsınız (kolaylaştırır mı?).


Mevcut liderlik kurulu

  1. Pyth - 28 bayt - isaacg
  2. CJam - 30 bayt - Runer112
  3. CJam - 32 bayt - Martin Büttner

En yüksek oy: C - 73 bayt - Paul R


isaacg, Pyth ile Merdiven Mücadelesini geçmek için tacı alır. PPCG'de bunun gibi daha fazla zorluğa dikkat edin!


1
Programlama Bulmacalar ve Kod Golf Stack Exchange hoş geldiniz! Buradaki tüm zorluklar tartışmasız olarak hangi çözümün kazanması gerektiğine karar vermek için nesnel bir kazanma kriteri gerektirir. Bu bir kod golf sorusuna benziyor , yani en kısa kod kazanıyor, ancak farklı bir şey yapmak istemeniz durumunda kendiniz düzenlemenize izin vereceğim. Teşekkürler!
Kapı tokmağı

1
Ah, özür dilerim, bunu özledim. Sorunuzda uygun etiketi düzenledim.
Kapı tokmağı

13
6. sıradaki o garip sondaki alanı yazdırmak zorunda mıyız?
Doktor

4
Daha genel olarak, sondaki boşluğa izin verilir mi? Bunu ilk satırın genişliğinde bir dikdörtgene doldurabilir miyim?
Martin Ender

8
Sonunda bir satırsonu alabilir miyiz?
TheNumberOne

Yanıtlar:


4

Pyth, 29 28

V21++**6/-20N5d*5?d%N5\_<\|N

Burada deneyin.

@ Xnor'un çözümünden "beş boşluk veya beş alt çizgi ekle" hilesi ile oldukça basit bir çözüm, ancak döngü 20'den 0'a değil, 0'dan 20'ye.


1
Sana dublaj yapıyorum, Efendim, Merdiven Mücadelesini geçtiğin için.
zamanki kahve

... ve şimdi merdivene girebilirsiniz
Anthony Pham

22

C, 86 80 76 75 73 bayt

c;main(i){for(i=21;i--;c='|')printf("%*s%c\n",i/5*6+5,i%5?"":"_____",c);}

5
Her zaman bir C çözümü gönderecek olan kişi olmalı. Sizin için oy verin.
zamankikahve

1
Döngüyü şu şekilde değiştirerek daha da for(i=25;i--;)
kısaltabilirsiniz

1
@FelixBytow Olmalı i=26. Bunun yanı sıra, ekstra bir karakter için ' 'değiştirilebilir 32. Benim çözümüm bu optimizasyonlardan sonra 2 karakter daha uzun :(
Allbeert

2
Fazladan bir adım atmış gibisin. 26'da değil, gerekli çıktıda 21 satır vardır. Bazı optimizasyonlar: main(i){for(i=21;i--;)printf("%*s%c\n",i/5*6+5,i%5?"":"_____",i<20?'|':0);}1. Uzunluk için formülü basitleştirin 2. @Allbeert'in söylediği gibi, ' 'ASCII 0'ı neden ASCII 32'de durdurabilirsiniz? Ayrıca bunun ""yerine benim için iyi çalışır" "
Level River St

1
'|'Baskıda iki bayt tasarruf etmeye ne dersiniz ? c;main(i){for(i=21;i--;c='|')printf("%*s%c\n",i/5*6+5,i%5?"":"_____",c);}
Runer112

11

Java, 198 158 156 146 bayt

Bu muhtemelen çok kısaltılabilir. Her zamanki gibi, önerilerinizi bekliyoruz.

void a(){String a="",b="_____",c=b;for(int i=-1;i<20;b=i%5<1?b.replace(c,"     "):i%5>3?b+" "+c:b)a=b+(++i>19?"":"|")+"\n"+a;System.out.print(a);}

Girintili (tür):

void a(){
    String a="",b="_____",c=b;
    for(int i=-1;i<20;b=i%5<1?b.replace(c,"     "):i%5>3?b+" "+c:b)
        a=b+(++i>19?"":"|")+"\n"+a;
    System.out.print(a);
}

Teşekkürler Martin Büttner, Rainbolt ve Geobits.


1
Dürüst olmak gerekirse, Java ile yaptığınız için etkilendim.
zamankikahve

9

Brainfuck (1065 Bayt)

Güzel değil, kısa değil ... ama daha sonra optimize edeceğim!

++++[->++++++++<]>........................
[->+++<]>-.....>++++++++++.[->+++<]>++....
...................-[->++++<]>.>++++++++++
.[->+++<]>++.......................-[->+++
+<]>.>++++++++++.[->+++<]>++..............
.........-[->++++<]>.>++++++++++.[->+++<]>
++.......................-[->++++<]>.>++++
++++++.[->+++<]>++..................[->+++
<]>-.....[->++++<]>.>++++++++++.[->+++<]>+
+.................-[->++++<]>.>++++++++++.
[->+++<]>++.................-[->++++<]>.>+
+++++++++.[->+++<]>++.................-[->
++++<]>.>++++++++++.[->+++<]>++...........
......-[->++++<]>.>++++++++++.[->+++<]>++.
...........[->+++<]>-.....[->++++<]>.>++++
++++++.[->+++<]>++...........-[->++++<]>.>
++++++++++.[->+++<]>++...........-[->++++<
]>.>++++++++++.[->+++<]>++...........-[->+
+++<]>.>++++++++++.[->+++<]>++...........-
[->++++<]>.>++++++++++.[->+++<]>++......[-
>+++<]>-.....[->++++<]>.>++++++++++.[->+++
<]>++.....-[->++++<]>.>++++++++++.[->+++<]
>++.....-[->++++<]>.>++++++++++.[->+++<]>+
+.....-[->++++<]>.>++++++++++.[->+++<]>++.
....-[->++++<]>.>++++++++++.[--->++<]>+++.
....[->++++<]>.

brainfuck is never pretty :) upvote sadece yapmak için iş
Purefan


ideone.com/ICtrhv Zaman sınırı aşıldı Yani, ne ...
therewillbecoffee


8

CJam, 36 30 bayt

Çevrimiçi deneyin.

L{{S5*\+}/S'|5*+]'_5*+}5*1>zN*

İlk 36 baytlık çözümüm sonucu çıktı yönüne getirdi. Algoritmadan daha fazla bayt sıkıştırmaya çalışmama rağmen yapamadım. Sonra Martin'in satır yerine sütun oluşturma ve sonucu aktarma konusundaki parlak stratejisini gördüm . Bunun muhtemelen daha iyi bir yaklaşım olduğunu anladım, bu yüzden iç hukuka dayalı bir çözüm oluşturmak için yola çıktım.

Ancak, bu stratejiyi uygulama yaklaşımım biraz değişiyor. Tam sütunlar oluşturmak yerine, önceden oluşturulmuş "adımları" girintili yapan ve her yinelemede yeni bir adım ekleyen yinelemeli bir çözüm kullanıyorum. Böylece ana döngünün ilk yinelemesi bunu üretir:

 |||||
_
_
_
_
_

Ana döngünün ikinci yinelemesi, mevcut adımı girintili hale getirir ve ardından yeni bir adım ekler:

      |||||
     _
     _
     _
     _
     _
 |||||
_
_
_
_
_

Ve ana döngünün beş tam yinelemesi bunu üretir:

                     |||||
                    _
                    _
                    _
                    _
                    _
                |||||
               _
               _
               _
               _
               _
           |||||
          _
          _
          _
          _
          _
      |||||
     _
     _
     _
     _
     _
 |||||
_
_
_
_
_

Bundan sonra, yapılması gereken tek şey, aksi takdirde alt adım için istenmeyen yükselticiye dönüşecek ve devredecek olan ilk çizgiyi ortadan kaldırmaktır.


7

Python 2, 80 77 74 bayt

n=24;exec"print' '*n+'_'*5+'|'*(n<24)+('\\n'+~-n*' '+'|')*4*(n>0);n-=6;"*5

Çifte kurtuldum execve her şeyi birine sığdır print!


6

Klip, 46

{:24S:5'_m[z{*4,:+5*6zS"|
":*6zS:5'_"|
"`}vR4`

açıklama

{               .- Put everything in a list -.
 :24S           .- 24 spaces                -.
 :5'_           .- 5 underscores            -.
 m[z            .- Map...                   -.
    {           .- A list                   -.
     *4         .- 4 of the following       -.
       ,        .- Append                   -.
        :+5*6zS .- 5 + 6 * the iteration of spaces  -.
        "|      .- A pipe and newline       -.
"
     :*6zS      .- 6 * the iteration of spaces      -.
     :5'_       .- 5 underscores            -.
     "|         .- A pipe and newline       -.
"
    `           .- End list (per iteration  -.
   }vR4         .- The mapping is onto {3,2,1,0}    -.

1
Klibin bir Wikipedia sayfası bile yok. Demek istediğim, ne ....
therewillbecoffee

4
@therewillbecoffee Bu sitedeki birçok dilde bir Wikipedia sayfası yok. İşte eğlenceli;)
Ypnypn

@Ypnypn Tasarladınız mı? Gerçekten ilginç görünüyor! Her ne kadar gerçek bir soruya ilgi duysam da. ;) (Örnekler sayfasında bu biraz daha ucuz.)
Martin Ender

6

CJam, 36 32 bayt

{5*S*'_+a5*~_W<S+5'|*+}5/;]W%zN*

Burada test edin.

Ben de açık bir formül kullanmayı denedim, ama CJam daha uzun ... belki başka birine yardımcı olur:

21,29,ff{_2$5/)6*(=@@6/5*=_++" |_|"=}W%N*

açıklama

A) ızgarayı değiştirirseniz ve b) çizgileri ters çevirirseniz merdiven çok daha kolay inşa edilebilir buldum:

_
_
_
_
_
 |||||
     _
     _
     _
     _
     _
      |||||
          _
          _
          _
          _
          _
           |||||
               _
               _
               _
               _
               _
                |||||
                    _
                    _
                    _
                    _
                    _

İlk önce bunu inşa ediyorum, sonra tersine çevirdim, sonra devrik yaptım.

{                     }5/        "For i in [0 .. 4].";
 5*S*'_+                         "Get a string of 5*i spaces and append _.";
        a5*~                     "Get five such lines.";
            _W<S+                "Duplicate the last, remove the _, add a space.";
                 5'|*+           "Add 5 copies of |.";
                         ;       "The above creates a row too many, so discard the last one.";
                          ]W%zN* "Wrap everything in an array, reverse, transpose, riffle
                                  with newlines.";

Tamam, biri bunu 30 baytla yaptý.
therewillbecoffee

6

Python 2, 59

n=21
exec"n-=1;print n/5*6*' '+' _'[n%5<1]*5+'|'*(n<20);"*n

21 satır endeksli niçinde [20,19,...,1,0]. Önce her bir "adım" için 6 boşluk yazdırırız (eksi 1), olarak hesaplanır n/5*6. Daha sonra, beş boşluk yazdırır, ancak bunlar beşin katları için alt çizgilerdir. Son olarak, üst satır hariç, dikey bir satır yazdırır n=20.


Güzel ve anlaşılır. Bunu sevdim!
Sp3000

6

JavaScript, 115 107 96 94 89 87 83 bayt

Bu kazanmak için çok uzun, ama PCG.SE hakkında ilk kez bir cevap buldum ve postalanabilir bir şey yaptığım için gurur duyuyorum.

Bazı yararlı sözdizimsel tavsiye ile, kaydırma çubuğu eşiğinin altında bile kodu önemli ölçüde kısalttım!

for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~(~-y/5)-~x?4+5*~(x/6)+y?' ':'_':'|'

Güzel cevap, kısaltmak için yapabileceğiniz birkaç şey çıkar alert. Konsolda çalıştırırsanız onsuz iyi çalışır. Ayrıca, son süslü ayraç içindeki noktalı virgül gerekli değildir. (y/5-.2)((y-1)/5)
qw3n

@ qw3n bu öneriler için teşekkürler; Uyarının kurallar tarafından gerekli olup olmadığından emin değildim.
vvye

Ayrıca s+='\n'sonra hareket y--ve kıvırcık parantez kurtulmak gibi görünüyor for(s='',y=21;y>0;y--,s+='\n'). Ben de for döngüsü içindeki s başlattım, böylece kodunuz tek bir ifade
qw3n

1
Bu benim sonuncum olduğunu düşündüm ama her iki terim de size 2 bayt tasarruf ederse for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~~(y/5-.2)+5-x?5*~~(x/6)+1-y?' ':'_':'|', test edebileceğiniz üçlü ifadenizi çevirirseniz bu benim için olmalı number - x.
qw3n

1
Tilde oyunları: ~ n == -n-1, - ~ n == n + 1, ~ -n == n-1, for(s='',y=22;--y;s+='\n')for(x=0;++x<29;)s+=6*~(~-y/5)-~x?4+5*~(x/6)+y?' ':'_':'|'83
edc65 4:15

6

ECMAScript 6, 142 138 129 91 bayt

@ Edc65'e bunu gerçekten yeniden çalıştığı için özel teşekkürler.

a=o='',[for(x of!0+o)(o=(a+'     |\n').repeat(4)+a+'_____|\n'+o,a+='      ')],a+'_____\n'+o

Orijinal versiyonun mantığı, @ edc65 yorumunun nasıl dönüştürüldüğüne dair yorum yapar.

((f,l,p)=>                  //variables
f(24)+l+p[1]+               //add the non pattern line
[0,1,2,3].map(b=>f(18-6*b)) //add the right number of spaces in front of the 4 steps
.map((a,b)=>f(4,a+f(5)+p)   //the four repeating lines of the step 
+a+l)                       //the landing line
.join(p)+p)                 //put it all together
((n,s=' ')=>s.repeat(n)     //create an variable array of some character
,'_____','|\n')             //string literals

1
Birkaç bayt kaydetmeden newönce yapıcıyı güvenle kaldırabilirsiniz Array.
NinjaBearMonkey

@hsl newbunun gerekli olduğunu düşündüğüm bir sebepten dolayı teşekkür ederim .
qw3n

1
Dizi (n). Birleşim (ler) çok ES5! denedin mirepeat
edc65

[1,2,3,4].map((a,b)ve sadece b => [0,1,2,3].map(b(-4) kullanarak
edc65

Firefox'u çalıştırıyorum ve gayet güzel çalışıyor!
therewillbecoffee

5

MATLAB, 68 bayt

MATLAB'ın daha iyisini yapabilmesi gerektiğine dair güçlü bir hissim var, ama bir yol düşünemiyorum.

p(1:5,6)='|';p(1,1:5)=95;w=blkdiag(p,p,p,p);w(21,25:29)=95;flipud(w)

Merdivenleri baş aşağı oluşturur ve ters çevirir. Taumometrem etraftaki tüm sihirli sabitler yüzünden kırıldı.

'|'başlatmak pve wkarakter dizisi olarak bilerek olduğu gibi bırakılır (ascii kod noktası yerine) .


1
'|' = 124neyse, bu ekstra karakterlere mal olmaz.
Peter Cordes

5

Yakut, 48

25.times{|i|puts" "*(4-i/6)*5+(i%6==0??_*5:?|)}

Eski yaklaşım, 68

4.times{|i|(?_*5+"
|"*5).each_line{|l|puts" "*(4-i)*5+l}}
puts"_"*5

PPCG'ye Hoşgeldiniz! Birkaç Ruby golf ipuçları: 1. orada bazı gereksiz boşluk var. 2. gibi tek karakter dizeleri '_'olarak yazılabilir ?_. 3. Yeni satırlar doğrudan dizelere gömülebilir (böylece bunu yapabilirsiniz "<linebreakhere>|"). 4. Bunun etrafındaki parantezler gerekli değildir. Final putsile değiştirilebilir $><<(kullandıktan sonra bile alandan kurtulmanızı sağlar ?_). Aynen böyle devam! :)
Martin Ender

Evet, biraz boşluktan kurtuldum. Teşekkürler! Tek karakter dizelerini bilmiyordum.
psycotica0

Muhtemelen de yerini alabilir (1..4).maptarafından 4.timesve daha sonra kullanmak 4-iyerine 5-i.
Martin Ender

Ooh, iyi çağrı. Bitti.
psycotica0

4

Julia, 83 bayt

for n=24:-6:0 print(" "^n*"_"^5*"|"^(n<24)*"\n"*(" "^(n>0?n-1:0)*"|\n"^(n>0))^4)end

Julia'da dize birleştirme *operatörünü kullanarak ve dize tekrarı kullanılarak yapılır ^.


4

> <> , 108 104 , 100 bayt

cc+::?v~'_____'o\/' 'o  \
?:o'|'\' 'o1-30.o\v!?:-1<}:{oav!?:<4;!
-20.12^?(+cc:ooo/ \~1-'!|'o1. \~ao6

Python cevabımla aynı stratejiyi kullanan basit bir> <> çözümü . Ana fark,> <> karakter dizisinin çarpımının (hatta dizelerin) olmamasıdır, bu nedenle bunların tümü döngülerle yapılır.

açıklama

cc+                  Push 24 (call this "n")

[outer loop]
[loop 1, print n spaces]

:                    Copy n (call this "i")
:?                   If i is not zero...
' 'o1-30.                Print space, decrement i and go to start of loop 1

~'_____'ooooo        Pop i and print five underscores
:cc+(?               If n < 24...
'|'o                     Print a pipe
21.                  Otherwise skip pipe printing

[loop 2: print vertical parts of stairs]

?!;                  If n is zero, halt
4                    Push 4 (call this "j")
?!                   If j is zero...
~ao6-20.                 Pop j, print a newline, minus 6 from n and go to start of outer loop
ao                   Print a newline
}:{                  Copy n (call this "k")

[loop 3: print n-1 spaces]

1-                   Decrement k
:?!                  If k is zero...
    ~1-'!|'o1.           Pop k, decrement j, print a pipe and go to start of loop 2
' 'o                 Otherwise print a space and go to start of loop 3

Her zaman> <> cevabı iptal edeceğimi hissediyorum.
krs013

3

Groovy, 98 71 bayt

// old: (25..5).each{i->println((1..(i-(i-1)%5)).collect{' '}.join()+(i%5?'|':('_____'+(i==25?'':'|'))))}

(25..5).each{i->println(' '*(i-(i-1)%5)+(i%5?'|':'_'*5+(i%25?'|':'')))}

(25..5).each { i ->
    println(
        ' '*(i - (i - 1) % 5) + (
            i % 5 ? 
            '|' : 
            '_'*5 + (i % 25 ? '|' : '')
        )
    )
}    

Eminim, bir şekilde azaltılabilir :) @Score_Under tarafından kısaltılabilir


1
Ben tıraş için birkaç bayt vardır: / toplamak yerine bir çarpma ile katılmak: ' '*(i-(i-1)%5), kaldırma parantez yerinden ('_____'+(i==25?'':'|')), yerini '_____'ile '_'*5, ve sonuncu koşullu çevirmek eğer alışılmışın dışında bir eşitsizlik operatörü olarak% kullanabilirsiniz: (i%25?'|':''). Bu sizi 71'e
indirir.

@Score_Under güzel, teşekkürler, dizeleri çoğaltmayı bilmiyordum: D
Kamil Mikolajczyk

2

Perl, 50

#!perl -l
print$"x6x(-$_/5),($_%5?$":_)x5,"|"x$|++for-20..0

Beni dene .


2

T-SQL, 276 bayt

declare @x int declare @y int declare @w varchar(30) declare @l char(5) set @l='_____' set @x=23 while @x > 4 begin set @w=replicate(' ',@x) set @y=0 if @x=23 print @w+' '+@l else print @w+' '+@l+'|' while @y < 4 begin set @y=1+@y print @w+'|' end set @x=@x-6 end print @l+'|'

2

Visual FoxPro 9.0, 261 bayt

n = Adım Sayısı

toplam 175 karakter, ancak doğru görüntülemek için dosyaya çıktı gerekiyordu - bu yüzden eksi dosya işlemleri için 43 karakter = 132 karakter.

n=10
c=CHR(13)
f="st.t"
ERAS (f)    
FOR i=n TO 1 STEP -1
    p=(i-1)*6
    =STRTO(PADL("_____",p+5)+IIF(i<n,"|","")+c+IIF(i>1,REPLI(PADL("|"+c,p+1),4),""),f,.t.)
    ?PADL("_____",p+5)+IIF(i<n,"|","")+c+IIF(i>1,REPLI(PADL("|"+c,p+1),4),"")
ENDFOR
MODI COMM (f)

Yanıtlayana not: Bayt sayısı mutlak çalışma kaynak kodu içindir ve bayt sayacı 261 bayt olduğunu söyler, öyle.


2

Bash (coreutils'ten + tac): 110 bayt

Bu doğrudan terminale yapıştırılabilir.

(n =; set {1..4}; çünkü yankı yapıyorum "$ {n} _____ |"; n + = ''; yankı yapıyorum "$ n |"; bitti; n + = \; tamamlandı; yankı " $ {n} _____ ") | tac

Olmadan |tac, pek işe yaramaz. Bunu Git Bash üzerinde çalıştırdım, bu yüzden kendimi öldürmeliyim.
zamankikahve

1

x86 makine kodu, 48 bayt

B1 05 B4 0E 80 E9 01 B0 5F B5 05 80 ED 01 CD 10 80 FD 00 75 F6 B5 05 80 ED 01 B0 0A CD 10 B0 08 CD 10 B0 7C CD 10 80 FD 00 75 EC 80 F9 00 75 D4

Montaj kodu eşdeğeri:

mov cl, 5
mov ah, 0Eh
main:
    sub cl, 1

print_step:
    mov al, '_'
    mov ch, 5

.loop:
    sub ch, 1

    int 10h

    cmp ch, 0
    jne .loop

print_stoop:
    mov ch, 5

.loop:
    sub ch, 1

    mov al, 0Ah;    ascii newline
    int 10h

    mov al, 8;      ascii backspace
    int 10h

    mov al, '|'
    int 10h

    cmp ch, 0
    jne .loop

cmp cl, 0
jne main

Çıktı:

_____
    |
    |
    |
    |
    |_____
         |
         |
         |
         |
         |_____
              |
              |
              |
              |
              |_____
                   |
                   |
                   |
                   |
                   |_____
                        |
                        |
                        |
                        |
                        |

Çıktının farklı olduğu için özür dilerim; Umarım kabul edilebilir.

Bu DOSBOX'ta çalıştırıldı

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.