ASCII merdivenleri inşa etmek


28

İki tamsayı n ve m'nin bir girişi göz önüne alındığında , n uzunluğunda ve m büyüklüğünde bir ASCII merdiveninin çıktısını alın .

Bu, ASCII uzunluğu 3 ve boyut 3 olan bir merdivendir:

o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Bu, ASCII uzunluğu 5 ve boyut 1 olan bir merdivendir:

o-o
| |
+-+
| |
+-+
| |
+-+
| |
+-+
| |
o-o

Bu ASCII uzunluk 2 ve 5 büyüklüğündeki bir merdivenidir:

o-----o
|     |
|     |
|     |
|     |
|     |
+-----+
|     |
|     |
|     |
|     |
|     |
o-----o

Spesifik olmak:

  • Uzunluk ( n ), merdivenin kaç kareden oluştuğunu gösterir.

  • ( M ) büyüklüğü , iç karenin genişliğini ve yüksekliğini (yani, "sınırları" sayarak değil) her kareyi temsil eder.

  • Her kare, -üstte ve altta |s, solda ve sağda +s ve dört köşede s ile çevrili boşluklarla dolu iç alandan oluşur .

  • Kareler arasındaki sınırlar birarada birleşir, bu nedenle üst üste iki satır +--...--+birleşti.

  • Tüm merdivenin köşeleri karakteriyle değiştirilir o.

  • İsteğe bağlı olarak sonunda yeni bir satır gönderebilirsiniz.

Merdivenin ( n ) uzunluğu her zaman ≥ 2, boyut ( m ) her zaman ≥ 1 olacaktır.

Girdi, boşluk / virgülle ayrılmış bir dize, bir dizi / liste / etc veya iki işlev / komut satırı / etc olarak alınabilir. argümanlar. Bu argümanlar hangi sırada en uygun / en golfiften alınabilir.

Bu olduğundan, bayttaki en kısa kod kazanır.

İpucu: Yukarıdaki örnekler test senaryosu olarak da kullanılabilir.


Önce boy, sonra boy almak zorunda mıyız?
RK.

@RK. Hangi sırayla daha uygun olursa onları alabilir.
Doorknob

1
Bir orada olabilir lider satırsonu?
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... Ben o konuda hayır ile gideceğim.
Doorknob

1
Tamam: P Bu bir atış oldu.
Conor O'Brien,

Yanıtlar:


4

Pyth, 34 bayt

.NjjNm*QTvz*2YjC:M++J"+|o"m"- -"QJ

Test odası

STDIN'de ayrılmış yeni satır argümanlarını alır.

:Her dikey dize türünü üç karakterden oluşturan, daha sonra gerektiğinde çoğaltan, yeni satırlara çevrilen ve birleştirilen bir yardımcı işlev kullanır .


11

Ruby, 71

->m,n{h=0;(?o+?+*(n-1)+?o).chars{|c|puts [?|+' '*m+?|]*h,c+?-*m+c;h=m}}

test programında ungolfed

f=->m,n{
  h=0                             #The number of | above the 1st rung is 0
  (?o+?+*(n-1)+?o).chars{|c|      #Make a string of all the rung ends o++...++o and iterate through it
    puts [?|+' '*m+?|]*h,         #draw h vertical segments |  ...  |
      c+?-*m+c                    #and a rung with the correct ends
    h=m                           #The number of | above all rungs except the 1st is m
  }
}


f[gets.to_i,gets.to_i]

Golf versiyonuyla ilgili ufak tefek sorunlar var gibi görünüyor: ;sonra ihtiyaç, sonra h=0boşluk gerekir puts. Ancak daha önce fazladan boşluk olduğu için puanınız sadece 1 karakter ile artar puts.
Manatwork

@ yönetim işleri, teşekkürler, düzeltildi. Bunun nasıl olduğunu bilmiyorum, golf oynamış olmalı ve sonra çalıştırmamalıyım.
Seviye Nehri St

9

CJam, 43 42 bayt

Skordan ayrılmıyorum. Ama ben Dennis değilim, değil mi?

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$

Giriş 2 boşlukla ayrılmış öğedir. İlk önce uzunluk

2 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

açıklama

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$
q~                                         e# read input
  :Z;                                      e# Record the size in Z and discard
     '-'o{[\Z*1$N]}:X~                     e# Create the initial line (and final). also creates a shorcut to do this later
           \                               e# Capture two arguments
            Z*                             e# The separator is repeated size times
              1$                           e# Repeat the first argument
                N                          e# Add newline
                                           e# X is a function to create line in a ladder
                      ['-_'+X\'|XZ*]       e# Design the repeating part
                                    @*     e# Repeat the pattern n times
                                      1>   e# Discard the initial
                                        1$ e# Since the final line is same than the initial, we just write it.
                                           e# Implicit printing

1
Bir soru olarak ifade etmeni sevdim. “Dennis değilim ... doğru mu?”
undergroundmonorail

7

JavaScript (ES6), 89

... tekrarla, tekrarla, tekrarla ...

(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

Ölçek

F=(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

// Less golfed
U=(n,m)=>
{
  var R=x=>x.repeat(m),
      a=R(' '),
      b=R(`|${a}|\n`);
      c=R('-'),
      d=`o${c}o\n`;
  m=n-1;
  return d+R(b+`+${c}+\n`)+b+d
}

function test() {
  var i=I.value.match(/\d+/g)
  if (i) O.textContent=F(+i[0],+i[1])
  console.log(i,I.value)
}  
 
test()
N,M: <input id=I value="3,5" oninput=test()>
<pre id=O></pre>


Bunun document.getElementById('elem').yerini alabileceğini bilmiyordum elem.! Bunun için +1, ancak lütfen, bu konuda bazı dokümanlar işaret eder misiniz?
F. Hauri,

2
@ F.Hauri neredeyse her tarayıcıda çalışır, ancak kaçınılması gerekir (eğlence için kodlama dışında). Bilgi ve bağlantılar stackoverflow.com/questions/3434278/…
edc65

6

C #, 1412 bayt

... ilk CodeGolf girişimi, kazanması muhtemel değil ama işte burada çalışıyoruz:

using System;

namespace Ascii_Ladders
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 0;
            int m = 0;

            Console.Write("Please enter Height: ");
            n = int.Parse(Console.ReadLine());
            Console.Write("Please Enter Width: ");
            m = int.Parse(Console.ReadLine());

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                Console.Write("-");
            }
            Console.WriteLine("o");

            for (int k = 0; k < n; k++)
            {
                for (int i = 0; i < m; i++)
                {
                    Console.Write("|");
                    for (int j = 0; j < m; j++)
                    {
                        Console.Write(" ");
                    }
                    Console.WriteLine("|");
                }
                if (k != n - 1)
                {
                    Console.Write("+");
                    for (int i = 0; i < m; i++)
                    {
                        Console.Write("-");
                    }
                    Console.WriteLine("+");
                }
            }

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                 Console.Write("-");
            }
            Console.WriteLine("o");

            Console.ReadKey();
        }
    }
}

9
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Kodunuzda daha fazla yardım almak isterseniz, kodunuzu kısaltmak için kaldırabileceğiniz çok fazla boşluk varsa , C # ile golf oynamaya ilişkin ipuçlarına göz atabilirsiniz .
Downgoat

Burada @ Doᴡɴɢᴏᴀᴛ ile aynı fikirdeyim. Potansiyel olarak sadece 533 bayta kadar golf yapabildim . Ama daha iyi olabilirdi. (Uyarı: C # ile programlamıyorum.)
user48538

Onu 314'e indirdimusing System;class P{static int m;static void Main(){int n = int.Parse(Console.ReadLine());m = int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser

3
Birkaç boşluğu kaçırdım, 310 ileusing System;class P{static int m;static void Main(){int n=int.Parse(Console.ReadLine());m=int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser

2
Yaklaşımında değişiklik olmadan 270 Aşağı kullandı: using C=System.Console;class P{static void Main(){int i,k,n=int.Parse(C.ReadLine()),m=int.Parse(C.ReadLine());System.Action<char,char> M=(x,y)=>C.WriteLine(x+new string(y,m)+x);M('o','-');for(k=0;k<n;k++){for(i=0;i<m;i++){M('|',' ');}if(k<n-1){M('+','-');}}M('o','-');}}. Burada, muhtemelen işlerin nasıl yapılacağını biraz değiştirerek, daha büyük olasılıkla daha fazla potansiyel var.
Joey

6

Julia, 87 bayt

f(n,m)=(g(x)=(b=x[1:1])x[2:2]^m*b*"\n";(t=g("o-"))join([g("| ")^m for i=1:n],g("+-"))t)

Bu, iki tam sayı kabul eden ve bir dize döndüren bir işlevdir.

Ungolfed:

function f(n::Int, m::Int)
    # Create a function g that takes a string of two characters and
    # constructs a line consisting of the first character, m of the
    # second, and the first again, followed by a newline.
    g(x) = (b = x[1:1]) * x[2:2]^m * b * "\n"

    # Assign t to be the top and bottom lines. Construct an array
    # of length n where each element is a string containing the
    # length-m segment of the interior. Join the array with the
    # ladder rung line. Concatenate all of this and return.
    return (t = g("o-")) * join([g("| ")^m for i = 1:n], g("+-")) * t
end

5

pb - 147 bayt

^t[B]>>[B]vw[T!0]{b[43]<[X]b[43]>w[B=0]{b[45]>}v[X-1]w[B=0]{b[124]^}v[X]t[T-1]}t[111]b[T]<w[X!0]{b[45]<}b[T]w[Y!0]{w[B!0]{^}b[124]^}b[T]^>>[B]vb[T]

Bu, haklar bakımından, pb'nin gerçekten iyi olması gereken bir tür zorluktur. Karakterlerle basit resimler çizmek pb'nin tam olarak ne için tasarlandığı. Ne yazık ki, bu sadece bir endişe dili sanırım.

Önce giriş uzunluğunu, ardından büyüklüğü alır. Girdi değeri biçiminde girdi alır, örneğin:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Bak, eğlenceli bir animasyon!

Yorumlarla:

^t[B]            # Save length to T
>>[B]v           # Go to X=size+1, Y=0

w[T!0]{          # While T is not 0:
    b[43]            # Write a '+'
    <[X]b[43]        # Write a '+' on the left side as well
    >w[B=0]{b[45]>}  # Travel back to the right '+', writing '-' on the way
    v[X-1]           # Go down by X-1 (== size)
    w[B=0]{b[124]^}  # Travel back up to the '+', writing '|' on the way
    v[X]             # Go down by X (== size + 1, location of next '+')
    t[T-1]           # Decerement T
}

t[111]           # Save 'o' to T (it's used 4 times so putting it
                 # in a variable saves bytes)

b[T]             # Write an 'o' (bottom right)

<w[X!0]{         # While not on X=0:
    b[45]<           # Travel left, writing '-' on the way
}

b[T]             # Write an 'o' (bottom left)

w[Y!0]{          # While not on Y=0:
    w[B!0]{^}        # Skip nonempty spaces
    b[124]           # Write a '|'
    ^                # Travel up
}

b[T]             # Write an 'o' (top left, replaces existing '+')

^>>[B]v          # Go back to where the size is saved and go to X=size+1, Y=0

b[T]             # Write an 'o' (top right, replaces existing '+')

5

Saf bash, 132 130 128 127 bayt

Evet ${p% *}, son yerine 1 bayt daha bırakabilirim , ancak bunu tercih ederim:

p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"

Numune:

ladders() {
    p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
    a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"
}

ladders 3 4
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

ladders 2 1
o--o
|  |
|  |
o--o

4

Haskell, 100 97 bayt

l#s=unlines$t:m++[t]where _:m=[1..l]>>["+"!"-"]++("|"!" "<$u);t="o"!"-";o!i=o++(u>>i)++o;u=[1..s]

Kullanım örneği:

*Main> putStr $ 4 # 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Nasıl çalışır:

l#s=unlines$t:m++[t]         -- concat top line, middle part and end line
                             -- with newlines between every line
  where                      -- where
  _:m=                       -- the middle part is all but the first line of
     [1..l]>>                -- l times
         ["+"!"-"]           --    a plus-dashes-plus line
         ++("|"!" "<$u)      --    followed by s times a bar-spaces-bar line

  t="o"!"-"                  -- very first and last line
  o!i=o++(u>>i)++o           -- helper to build a line
  u=[1..s]

Düzenleme: @ Hıristiyan Irwan 3 bayt bulundu. Teşekkürler!


-1 puan için m=init$[1..l]>>("|"!" "<$u)++["+"!"-"](_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
desen eşleştirme

Şaşırtıcı bir şekilde _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)çalışır
Akangka

@ HıristiyanIrwan: iyi benekli! Teşekkürler!
nimi

3

brainfuck - 334 bayt

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

Bunun çok daha kısa olmasını bekliyordum.

Bu , her birine gerektiği | (...) |gibi +----(...)----+baskı oyapan, üst ve alt kısımlar için bazı özel kasalar gibi görünen ve görünen bir "string" kurar .

8 bit hücreleri kullanan ve 0 hücresinden sola gitmenize izin veren bir tercüman gerektirir (negatif hücrelere veya döngü içine). Benim tecrübeme göre, bunlar en yaygın varsayılan ayarlardır.

Yorumlarla:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] Get m from input; make a copy
                      Turn it into m cells containing 1 with empty cells between

<----[>---<----]      Put 67 at the beginning (again with an empty cell between)

--[>[+>>]<<[<<]>++++++]  Add 43 to every nonempty cell

>[+.>>]               Add 1 to each cell and print it

-[<+>---]<+++++++    Put 92 after the last 45 (no empty cell!)

>>--[<+>++++++]      Put 43 immediately after the 92

->---[<------->+]    Put 234 after 43

++++++++++           And 10 after that

[<++<]             Add two to the 234; 92; the empty spaces; and left of the 111

+++++[>[++++++>>]<<[<<]>-] Add 30 to each 2; the 94; and the 236

>[-]>.-<<----[>>+++<<----] Erase leftmost 32; Print 111; subtract 68 from it

--[>+<--]>---        Put 124 where the 32 was

<<<<++++++++++.,     Print a newline; override the cell with n from input

[                    n times:

  >[>+>+<<-]>[<+>-]    Make a copy of m

  >[                   m times:

    <<<<                 Look for a flag at a specific cell

    [                    If it's there:

      >>>>>>[.>>]          Go to the 43; print it and every second cell after

      <<[<<]>>-            Clear the flag

    ]

    >>>>>[.>>]           Go to the 124; print it and every second cell after

    <<[<<]>              Go back to the copy of m

  -]

  <<<<+>               Plant the flag

-]

>>>>

[-]----[>---<----]>+ Erase the 124; add 68 to 43

.[>]                 Print it; then head to the end

<<<<<[.<<] Go to the last 45; print it; then print every second cell to the left


2

Jolf, 36 bayt

Burada dene!

ρpi,a+2J+2J"o-| "j"o(.+)o
o.+o'+$1+

açıklama

ρpi,a+2J+2J"o-| "j"o(.+)o\no.+o'+$1+
 pi              j                   repeat vertically j times
   ,a+2J+2J"o-| "                    a box with dimensions 2+J
ρ                 "o(.+)p\np.+o'     replace with regex
                                +$1+ with the -...-

2

Perl, 98 bayt

($n,$m)=@ARGV;print$h="o"."-"x$m."o\n",((("|".(" "x$m)."|\n")x$m.$h)x$n)=~s{o(-+)o(?=\n.)}{+$1+}gr

1
Mükemmel bir ilk cevap. Fakat +kodunuzda herhangi bir işaret görmüyorum , ara basamakların +her iki ucunda da işaretler olduğunu düşündünüz mü?
Level St Nehri

Çok güzel ifadeli yorumlar için teşekkür ederim - Ben kesinlikle artı işaretlerini aralık! Bana da biraz para harcadım; Hala onu nasıl kısaltabileceğimi düşünüyorum ... Bunları ihmal etmenin ($n,$m)=@ARGV;ve önceden ayarlanmış olduklarını varsaymanın yanı sıra - Ruhun içinde olup olmadığından emin değil. Bakmam gerekecek.
ZILjr

Soruda aksi belirtilmediği sürece, kural burada meta.codegolf.stackexchange.com/a/2422/15599 . Değişkenlerin ayarlanmış olduğunu varsayamazsınız, ancak yardımcı olursa, program yerine bir işlev yazabilirsiniz. Perl yapmıyorum ama sanırım seni kurtarabilir @ARGV. Ayrıca, birisine cevap verirken @ kullaniciadi eklemeyi unutma, böylece bir uyarı alırlar. Bu sizin göreviniz olduğu için yapmama gerek yok.
Seviye Nehri St

1

C, 122 bayt

f(int m,int n,char*s){int i=0,w=3+m++;for(;i<w*m*n+w;++i)*s++=i%w>m?10:" |-+-o"[!(i/w%m)*2+!(i%w%m)+!(i/w%(m*n))*2];*s=0;}

Çevrimiçi deneyin .


1

Tcl, 187 bayt

lassign $argv n w
set c 0
while { $c < [expr {($w * $n) + ($n + 2)}]} {if {[expr {$c % ($n + 1)}] == 0} {puts "o[string repeat "-" $w ]o"} else {puts "|[string repeat " " $w ]|"}
incr c}

Bu kod, komut satırına girdi argümanlarını içeren bir dosyaya koymak için yapılır. sırayla kutu ve genişlik sayısını belirtin.


1

PHP, 81 bayt

Doğrudan PHP komutunu çağırırken iletilen 2 argüman beklenir. Birincisi boyut, ikincisi ise adımların sayısı.

$R=str_repeat;echo$P="o{$R('-',$W=$argv[1])}o
",$R("|{$R(' ',$W)}|
$P",$argv[2]);

Bazı iyileştirmeler gerektirebilir.


0

Python 2, 94 bayt

def F(n,m):a,b,c,d='o|+-';r=[a+d*m+a]+([b+' '*m+b]*m+[c+d*m+c])*n;r[-1]=r[0];print'\n'.join(r)

'Ungolfed':

def F(n,m):
 # 'o---o'
 r = ['o'+'-'*m+'o']
 # ('|   |'*m+'+---+') n times
 r += (['|'+' '*m+'|']*m+['+'+'-'*m+'+'])*n
 # replace last +---+ with o---o
 r[-1] = r[0]
 print '\n'.join(r)


0

Pip -l , 35 bayt

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o

Çevrimiçi deneyin!

açıklama

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o
                                     a is length, b is size, s is space (implicit)
   sXb                               String containing b spaces
      RLa                            List containing a copies of that string
         JW'-                        Join on "-" and wrap the result in "-" as well
  Y                                  Necessary for operator precedence reasons
 ^                                   Split into a list of characters
(            )Xb                     String-repeat each character in the list b times
                                     This list represents the central columns of the ladder

                    '|Xb             String containing b pipe characters
                        RLa          List containing a copies of that string
                           J'+       Join on "+"
                   (          )WR'o  Wrap in "o"
                  ^                  Split into a list of characters
                                     This list represents the outer columns of the ladder

                WR                   Wrap the left list in the right list, vectorizing

Diğer bazı sürümler

Pyth'i yakalamak için birçok farklı yaklaşım denedim.

[Y'-XbWR'o;@>(sXbWR'|RLbPE'-XbWR'+RL:a)y]  41
Y^(t**b.1*:t**bX--a.1)" --"@yXbWR"|o+"@y   40
Y'|XbRLaJ'+YyWR'o;Z:sXbRLaJW'-RLbPEyAEy    39
t**:b(" |-o-+"<>2)@_@^t.1M$*Y[ttXa-1].1    39
J*Z:sXbRLaJW'-RLbWR:^('|XbRLaJ'+)WR'o      37
Y^$*Y[t**:btXa-1].1" --"@yXbWR"|o+"@y      37

t**bMerdivenin dikey düzenini oluşturmak için matematiği kullananlara özellikle düşkünüm :

        b           Size; e.g. 3
    t               Preset variable for 10
     **:            Set t to t**b (e.g. 1000)
           a        Length; e.g. 3
            -1      2
         tX         String-repeat (the new value of) t 2 times: 10001000
   [          ]     Put t and the above into a list: [1000; 10001000]
               .1   Append 1 to both of them: [10001; 100010001]
$*(              )  Fold on multiplication: 1000200020001

1000200020001Sonra desenleri oluşturmak için kullanılabilir o|||+|||+|||ove - - - -merdiven makyaj. Maalesef, bu yaklaşımın birleştirme / sarma yaklaşımından daha kısa olmasını sağlayamadım.

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.