Bazı ASCII kutuları çizin


19

İki negatif olmayan tamsayı listesi alın ve aşağıda tanımlandığı gibi bir ASCII kutusu çıkarın.

  • Köşeler ve kavşaklar artıdır: +(ASCII kodu 43)
  • Dikey çizgiler çubuklardır |(ASCII kodu 124)
  • Yatay çizgiler eksidir -(ASCII kodu 45)

İlk giriş listesi, her artı işareti arasındaki eksi sayısını yatay yönde belirtir.

İkinci giriş listesi, her artı işareti arasındaki çubuk sayısını dikey yönde belirtir.

Birkaç örnekle açıklamak daha kolaydır:

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

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


------------------
1 0 3 0 2 0
2 1 0 0

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

Açıklamalar:

  • Giriş sırası ve biçimi isteğe bağlıdır
  • Yalnızca kutular yazdırılmalı / görüntülenmelidir, ancak bir boşluk veya satırsonu kabul edilir.
  • Daha uygunsa, isteğe bağlı olarak tüm giriş değerlerine 1 ekleyebilirsiniz. İkinci bir örnek daha sonra olacaktır: 2 3; 2 3.

Bu kod golf, yani bayt en kısa kod kazanmak.


Yanıtlar:


5

MATL , 25 22 21 bayt

'|-+ '2:"1tiYsQ(]E!+)

1Eklenen girdileri (meydan okuma tarafından izin verilir) kullanır.

Çevrimiçi deneyin!

açıklama

Kod başlangıçta 1son sonuçta boşluk olmayan karakterlerin sütun indekslerini içeren bir dizi oluşturur , 0aksi takdirde. Dolayısıyla, ilk girdi [2 1 4 1 3 1]( [1 0 3 0 2 0]0 tabanlı formatta olacaksa) bu dizi

1 0 1 1 0 0 0 1 1 0 0 1 1

Sıfırların çalışma uzunluğunun girdiyle nasıl ilişkili olduğuna dikkat edin. Özellikle, bu dizi aşağıdaki gibi inşa edilmiştir:

  1. Diziyi tek bir şekilde başlatın 1.
  2. Girdinin kümülatif toplamını hesaplayın ve ekleyin 1. Bu örnekte verir [3 4 8 9 12 13].
  3. Adım 2 tarafından 1verilen (1 tabanlı) dizinlerle girişlere atayarak diziyi adım 1'den genişletin . Ara girişler otomatik olarak olarak ayarlanır 0.

Benzer bir dizi, satırlar için oluşturulur. İkinci giriş [3 2 1 1](veya [2 1 0 0 ])

1 0 0 1 0 1 1 1

Şimdi ikinci dizi ile çarpılır 2, aktarılır ve birinciye yayınla eklenir. Bu 2D diziyi verir

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

Dizeye endeksleme '|-+ ', nihai sonucu bir 2D karakter dizisi olarak verir. Dizin oluşturma modüler ve 1 tabanlı olduğundan, dizin 0son öğeye (boşluk) karşılık gelir.

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string

6

Python 2, 117 Bayt

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

İdeone üzerinde deneyin.

Bundan çok fazla beklememek. Gerçekten basit, her şeyi bir araya getirmek için sadece python birleşimlerini ve dize çarpımını kullanır.


6

JavaScript (ES6), 83 bayt

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

Çıktıda iki son satır vardır.


Vay. Benzer cevaplar hemen hemen aynı zamanda yayınlandı. ;)
Arnauld

(Yine de beni 2 dakika ve 2 byte yendin.)
Arnauld

@Arnauld Demonuzda zaman kaybettiniz ;-)
Neil

Evet, sanırım. ^^ İlginç bir şekilde, sürümüm iki arka çizgiyle 81 bayt olacaktır.
Arnauld


1

Pyth, 45 bayt

AQj.i*hlH]Js.i*hlG\+m*d\-G-mjb*d]XJ"+-""| "Hk

STDIN üzerinde virgülle ayrılmış iki listenin girdisini alan ve sonucu basan bir program.

Muhtemelen burada yapılması gereken bazı golf var.

Çevrimiçi deneyin

Açıklama sonra gelecek


1

Haskell, 55 bayt

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

gİki giriş listesini alan ve çıktı satırlarını içeren bir liste döndüren bir işlevi tanımlar


0

PowerShell v2 +, 89 bayt

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

Dang, JavaScript'i yakalayabileceğimi sanmıyorum.

Girdi alır $ave $baçık diziler olarak. Değişkeni $x, döngü $ave bazı dize birleşimine göre kutuların üst satırı olarak ayarlar . Parens içinde kapsüllenir, bu yüzden boru hattına yerleştirilir. Sonra, $bher yineleme boru hattına iki dizgi koyarız - aynı stil dizesi ancak boşluklarla ve |tire ile ve +ve $x. Bu dizelerin tümü Write-Output, program tamamlandığında örtük olarak ve aralarında varsayılan yeni satır olacak şekilde boru hattından toplanır .

Örnekler

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+

0

Ruby, 66 bayt

->x,y{d=->c,m,z=x{c+z.map{|w|m*w}*c+c+$/}
d[d[?+,?-],d[?|,' '],y]}

0

Jöle , 30 26 bayt

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

TryItOnline'da test edin

Nasıl?

Alınan girdi iki listenin bir listesidir [vertical, horizontal]ve artan seçeneği kullanır
- bu nedenle örnek 3 alır [[3,2,1,1], [2,1,4,1,3,1]]
Bunların her biri daha sonra sırasıyla rowType veya rowCharacterType'ı gösteren bir boole dizisine dönüştürülür, örn [[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
. Kutular, rowType ve rowCharacterType kombinasyonları tarafından tanımlanan karakterler - yani bir rowType ya birini ya "+-"da "| "rowCharacterType bu iki karakterden birini tanımlar.

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
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.