Penguasa Interval Sewenang-wenang

25

Buat program yang membutuhkan panjang dan daftar interval dan output penggaris dengan panjang itu untuk setiap interval menggunakan karakter menggambar garis ┌ ┬ ┐ │ ╵

  • Baris pertama dari output harus dimulai dengan tanda centang untuk 0 dengan dan diakhiri dengan tanda centang untuk panjang dengan , dengan yang digunakan untuk setiap karakter di antaranya. Akan ada total length+1 karakter gambar garis di baris pertama ini.
  • Centang harus diperpanjang secara vertikal dengan penambahan setengah karakter menggunakan dan berdasarkan interval input.
  • Interval terdaftar dari terkecil ke terbesar, relatif terhadap interval sebelumnya. Untuk menguraikan:
    • Interval pertama memberitahu berapa banyak kutu dasar (baris pertama - satu karakter per kutu) berada dalam interval kedua-terkecil (interval terkecil adalah 1). Misalnya, [3] akan memperpanjang setiap centang ketiga dengan setengah karakter.
    • Interval kedua dan selanjutnya dalam hal interval terkecil berikutnya. Misalnya [3, 5] akan memperpanjang setiap tick dasar ke-15 dengan karakter penuh dan [3, 5, 2] akan memperpanjang setiap tick dasar ke-30 dengan karakter setengah.
    • Sub-interval 1 adalah valid dan efektif berarti bahwa garis interval terakhir diperpanjang oleh karakter penuh dan bukan setengah karakter.
  • Contoh kasus uji harus membantu menjelaskan cara kerjanya.

Contoh / Kasus Uji

3, []:

┌┬┬┐

9, [3]:

┌┬┬┬┬┬┬┬┬┐
╵  ╵  ╵  ╵

30, [5, 2]:

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│    ╵    │    ╵    │    ╵    │

32, [4, 2, 2, 2]:

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│   ╵   │   ╵   │   ╵   │   ╵   │
│               ╵               │

48, [5, 3, 2]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│    ╵    ╵    │    ╵    ╵    │    ╵    ╵    │
╵                             ╵

24, [7, 3]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│      ╵      ╵      │

17, [3, 2, 1]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│  ╵  │  ╵  │  ╵
╵     ╵     ╵

1, [23, 19, 13, 11, 7, 5, 3, 2, 1]

┌┐
│
│
│
│
╵

Aturan / Catatan Lainnya

  • Input dan output dapat menggunakan format apa pun yang nyaman
  • Penguasa tidak harus berakhir pada tanda centang utama
  • Daftar interval mungkin kosong
  • Zeroth tick selalu dalam semua interval.
  • Anda dapat mengasumsikan panjang dan interval penggaris akan selalu menjadi bilangan bulat positif kurang dari 120
  • Trailing whitespace baik-baik saja, tetapi memimpin whitespace tidak baik.
  • Setiap ruang tetap-tunggal-lebar diizinkan sebagai karakter spasi jika Anda, karena alasan tertentu, ingin menggunakan sesuatu selain ruang ASCII.

Selamat Golf!

Beefster
sumber
Untuk hasil, bisakah saya mencetak baris pertama, lalu mengembalikan daftar kolom?
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance, aku akan mengatakan tidak untuk itu. Output harus konsisten.
Beefster
Bisakah kita mengambil karakter menggambar kotak dari pengodean byte tunggal (asalkan ada yang mengandung karakter yang diperlukan)?
Οurous
" format apa pun yang nyaman " - dapatkah kita menerima daftar interval dengan urutan terbalik?
ngn
@ Ngn: Saya tidak mengerti mengapa tidak. Jika itu entah bagaimana membantu Anda, lakukanlah.
Beefster

Jawaban:

5

JavaScript (Node.js) , 123 byte

l=>g=([p,q,...t],h='┌'.padEnd(l,'┬')+`┐
`)=>p?h+g(t,h.replace(/\S/g,c=>'╵│ '[c>'╴'||++i%p?2:i/p%q<1|0],i=-1)):h

Cobalah online!

Gunakan fungsi ini sebagai f(20)([5, 2]).


Terima kasih Arnauld, menghemat 4 byte.

tsh
sumber
3

Perl 6 , 130 122 102 92 byte

-10 byte terima kasih kepada nwellnhof!

{'┌'~'┬'x$^a-1~'┐',|map {[~] <<' ' │>>[:1[$_ X%%@_]for 0..$a]},batch [\*] @^b: 2}

Cobalah online!

Ah ya, jauh lebih pendek dari metode saya sebelumnya. Ini adalah blok kode anonim yang mengembalikan daftar baris.

Penjelasan:

{                                                   }   # Anonymous code block
 '┌'~'┬'x$^a-1~'┐',     # Return the first line
 |[\*] @^b          # Get the cumulative product of the input list
              .batch(2) # And split it into pairs
  .map:{                                      }  # Map each pair to
                                    for 0..$a    # For each interval
                        :1[$_ X%%@_]    # Whether it is divisible by none of the pair, one of the pair, or both
            <<' ' │>>[                     ]      # Map to a list of characters
        [~]        # And join
Jo King
sumber
3

Dyalog APL, 66 64 58 52 byte

{'┌┐'@0⍵@0⍉('┬│',⎕UCS 9589)/⍤11,⍉0 2⊤⊥¨⍨0=(⍵+1)⍴⍳⍺}

Cobalah online!

¯2 ¯8 ¯14 bytes berkat ngn !

dzaima
sumber
∊'┌'(1↓⍵⍴'┬')'┐'->'┌┬┐'/⍨2⍵2-1
ngn
@ ngn terima kasih! Ini adalah jenis golf yang cukup dimengerti tetapi saya tidak pernah tahu untuk mengantisipasi atau mengetahui kegunaan
dzaima
akhirnya, saya berhasil mempersingkat bagian paling kanan sedikit ... +⌿0=(×\⍺)∘.|⍳1+⍵-> ⊥¨⍨0=(⍵+1)⍴⍳⌽⍺. menerima dalam urutan terbalik telah diizinkan secara eksplisit sekarang, jadi Anda juga dapat menghapus
ngn
('┌┬┐'/⍨2⍵2-1)->'┌┬┐'[2,⍨×⍳⍵]
ngn
atau bahkan lebih baik: ('┌┬┐'/⍨2⍵2-1)⍪⍉->'┌┐'@0⍵@0⍉'┬',
ngn
2

Python 3 , 173 172 byte

def f(w,n):
 print('┌'+'┬'*~-w+'┐');R=r=range(w+1)
 for i,j in zip(*[iter(n+[0])]*2):a=r[::i];r=j*[0]and a[::j];print(''.join(' ╵│'[(v in a)+(v in r)]for v in R))

Cobalah online!

TFeld
sumber
2

05AB1E , 51 byte

ÝεyIηPÖO2‰•5·W4•2äç×SI¯Qiεõ}}•áΣ=Yô•3äçy¹QyĀ+èš}ζJ»

Tidak terlalu senang dengan I¯Qiεõ}}pekerjaan-sekitar untuk daftar input kosong .. Dan pasti bisa bermain golf di beberapa bagian lain juga ..

CATATAN: Menggunakan bilangan bulat terkompresi yang dikonversi ke karakter yang diperlukan, karena menggunakan karakter yang diperlukan secara langsung berarti saya harus menghitung seluruh program dalam UTF-8, meningkatkannya terlalu banyak untuk semua karakter bawaan 05AB1E juga.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ý             # Create a list in the range [0, first (implicit) input-integer]
 ε            # Map each value `y` to:
   Iη         #  Get the prefixes of the second input-list
     P        #  Get the product of each prefix
  y   Ö       #  Check for each if its evenly dividing the value `y`
       O      #  Take the sum of that
        2    #  And then the divmod 2
  5·W4      #  Push compressed integer 94749589
        2ä    #  Split into two equal-sized parts: [9474,9589]
          ç   #  Convert each to a character: ["│","╵"]
           ×  #  Repeat each based on the divmod 2 result
            S #  And convert it to a flattened list of characters
  I¯Qi   }    #  If the second input-list was empty:
      εõ}     #   Map each list to an empty string
              #   (for some reason `€õ` doesn't work here..)
  •áΣ=Yô•     #  Push compressed integer 948495169488
         3ä   #  Split into three equal-sized parts: [9484,9516,9488]
           ç  #  Convert each to a character: ["┌","┬","┐"]
  y¹Q         #  Check if the value `y` is equal to the first input-integer
              #  (1 if truthy; 0 if falsey)
     yĀ       #  Check if the value `y` is NOT 0 (1 if truthy; 0 if falsey)
       +      #  Add both checks together
        è     #  Use it to index into the list ["┌","┬","┐"]
         š    #  And prepend the result in front of the other characters
            # After the map: zip/transpose; swapping rows and columns (with space filler)
   J          # Join every inner list together to a single string
    »         # Join the lines with newline delimiter (and output implicitly)

Lihat tip tambang 05AB1E ini (bagian Cara mengompres bilangan bulat besar? ) Untuk memahami mengapa •5·W4•ada 94749589dan •áΣ=Yô•tidak 948495169488.

Kevin Cruijssen
sumber
×Sbisa jadiи
Magic Gurita Guci
@ MagicOctopusUrn Saya pertama kali berpikir begitu juga pada awalnya, tetapi tidak sayangnya (coba saja dengan salah satu kasus uji lainnya dengan daftar yang tidak kosong). sиStidak bekerja, tapi sayangnya itu satu byte lebih lama daripada lebih pendek. Itu karena bilangan bulat berada di tumpukan pertama, dan string setelahnya. Dengan ×itu tidak masalah apakah itu int,stringatau string,int, tetapi dengan иitu mengharapkan string,int.
Kevin Cruijssen
Oh begitu, orang yang satu ini membingungkan hah. Pekerjaan yang bagus untuk itu, jujur ​​saja, saya menghabiskan 10 menit hanya mencoba untuk mencari tahu apa yang sedang terjadi, ketinggalan berita buruk tentang и! Itu bagus untuk diketahui di masa depan, saya belum pernah melihatnya digunakan sebelum salah satu jawaban Anda yang lain.
Magic Gurita Guci
2

Arang , 50 byte

≔EηΠ…η⊕κη⪫┐┌×┬⊖θ↙↓EE⊕θΣEη¬﹪ιλ⁺×│⊘ι×╵﹪ι²‖

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Karakter kotak-gambar memiliki representasi 3 byte di Charcoal, jadi string di atas hanya 40 karakter. Penjelasan:

≔EηΠ…η⊕κη

Hitung produk kumulatif dari interval.

⪫┐┌×┬⊖θ↙

Cetak baris pertama tanda centang. Karakter kiri dan kanan adalah jalan yang salah karena hasilnya tercermin kemudian.

↓EE⊕θΣEη¬﹪ιλ⁺×│⊘ι×╵﹪ι²

Hitung jumlah interval yang merupakan faktor dari setiap tanda centang. Hasilkan string s dari setengah panjangnya dan tambahkan untuk panjang aneh. Cetak setiap string ke bawah dengan string berikutnya dalam kolom sebelumnya, yaitu urutan terbalik.

Refleksikan semuanya untuk mendapatkan penggaris dalam urutan kiri-ke-kanan.

Neil
sumber
2

Emacs Lisp , 303 byte

(defun f(a)(princ'┌)(dotimes(i(1-(car a)))(princ'┬))(princ'┐)(let((m 1))(while(cadr a)(let((q(caadr a))(w (cadadr a)))(princ"\n")(dotimes(i(1+(car a)))(cond((if w(= 0(mod i(* m q w))))(princ'│))((= 0(mod i (* m q)))(princ'╵))(t(princ" "))))(setq m(* m q(if w w 1)))(setcdr a`(,(cddadr a)))))))

Gunakan fungsi ini sebagai (f '(30 (5 2))).

Versi lebih mudah dibaca:

(defun f (a)
  (princ '┌)
  (dotimes (i (1- (car a)))
    (princ '┬))
  (princ '┐)
  (let ((m 1))
    (while (cadr a)
      (let ((q (caadr a)) (w (cadadr a)))
    (princ "\n")
    (dotimes (i (1+ (car a)))
      (cond ((if w (= 0 (mod i (* m q w))))
        (princ '│))
       ((= 0 (mod i (* m q)))
        (princ '╵))
       (t
        (princ " "))))
    (setq m (* m q (if w w 1)))
    (setcdr a `(,(cddadr a)))))))
adl
sumber
2

Jelly ,  42  41 byte

‘Rm×\}Ṭ€+2/
⁽!ṣ;“½¥÷I‘ÄỌṙ-;⁶
Ḷ¬;.Ḥ~W;ñị¢Y

Program lengkap.
Cobalah online!

Atau lihat test-suite
Catatan: kode ini telah diubah dari program lengkap - ñ(tautan selanjutnya sebagai angka dua) telah diganti dengan (tautan pada indeks 1 sebagai angka dua) untuk memungkinkannya dipanggil beberapa kali oleh catatan kaki .

Bagaimana?

‘Rm×\}Ṭ€+2/ - Link 1, lower interval tick types: length; intervals  e.g. 7; [3,2]
‘           - increment length                                           8
 R          - range                                                      [1,2,3,4,5,6,7,8]
     }      - use right argument for this monad as if it were a dyad:
   ×\       -   cumulative reduce by multiplication                      [3,6]
  m         - modulo slice (vectorises)                                  [[1,4,7],[1,7]]
      Ṭ€    - untruth €ach                               [[1,0,0,1,0,0,1],[1,0,0,0,0,0,1]]
        +2/ - pairwise reduce with addition                              [[2,0,0,1,0,0,2]]
            -   -- yielding a list of types for each row of characters below the first
            -      where 0 is a space, 1 is a short tick-mark and 2 is a long tick-mark

⁽!ṣ;“½¥÷I‘ÄỌṙ-;⁶ - Link 2, make character set: no arguments
⁽!ṣ              - literal 9474
    “½¥÷I‘       - list of code-page indices   = [10,4,28,73]
   ;             - concatenate              [9474,10,4,28,73]
          Ä      - cumulative addition      [9474,9484,9488,9516,9589]
           Ọ     - to characters            "│┌┐┬╵"
            ṙ-   - rotate left by -1        "╵│┌┐┬"
               ⁶ - literal space character  ' '
              ;  - concatenate              "╵│┌┐┬ "

Ḷ¬;.Ḥ~W;ñị¢Y - Main link: length, L; intervals, I
Ḷ            - lowered range         [ 0, 1, 2, ..., L-1]
 ¬           - logical Not           [ 1, 0, 0, ..., 0]
   .         - literal 0.5
  ;          - concatenate           [ 1, 0, 0, ..., 0, 0.5]
    Ḥ        - double                [ 2, 0, 0, ..., 0, 1]
     ~       - bitwise NOT           [-3,-1,-1, ...,-1,-2]
      W      - wrap that in a list  [[-3,-1,-1, ...,-1,-2]]
        ñ    - call next Link (1) as a dyad (f(L, I))
       ;     - (left) concatenated with (right)
          ¢  - call last Link (2) as a nilad (f())
         ị   - (left) index into (right)  (1-indexed and modular)
           Y - join with newline characters
             - implicit print
Jonathan Allan
sumber
1

Ruby , 126 byte

->l,i{y=1;[?┌+?┬*~-l+?┐]+i.each_slice(2).map{|j,k|x=y*j;y=k&&x*k;(0..l).map{|z|'│╵ '[(z%x<=>0)+(k ?z%y<=>0:1)]}*''}}

Cobalah online!

Tampak agak bertele-tele dengan semua each_slicehal itu, tetapi akan dilakukan untuk saat ini, kecuali saya berhasil menemukan pendekatan golf.

Mengambil input luntuk panjang dan iuntuk interval, mengembalikan array string.

Kirill L.
sumber
1

R , 175 170 byte

function(l,i,`&`=rep)rbind(c('┌','┬'&l-1,'┐'),if(i)sapply(rowSums(!outer(0:l,cumprod(i),`%%`)),function(j,x=j%/%2,y=j%%2)c('│'&x,'╵'&y,' '&(1+sum(1|i))/2-x-y)))

Cobalah online!

Mengambil interval kosong sebagai 0, mengembalikan matriks karakter. TIO link menampilkan output yang tercetak cantik.

Kirill L.
sumber
1

Haskell , 167 164 149 byte

n%l=unlines$("┌"++([2..n]>>"┬")++"┐"):[do p<-[0..n];let(j#a)b|1>p`rem`product(take j l)=a|1>0=b in(i-1)#(i#"│"$"╵")$" "|i<-[1,3..length l]]

Cobalah online! Pendekatan golf sedikit berbeda oleh Οurous .


n%l|let c=take(n+1).cycle;m&(x:y:r)=c('│':init([1..y]>>(m*x)!" "++"╵"))++'\n':(m*x*y)&r;m&[x]=c$'╵':(m*x)!" ";m&e=[]='┌':n!"┬"++"┐\n"++1&l
n!s=[2..n]>>s

Cobalah online! Masih ada beberapa redudansi yang sepertinya dapat dieksploitasi, tetapi sejauh ini mereka menahan semua upaya bermain golf lebih lanjut.


Solusi 167 byte sebelumnya adalah sama, terlepas dari penanganan baris baru dan mungkin sedikit lebih baik dibaca:

n%l=unlines$('┌':n!"┬"++"┐"):(take(n+1)<$>1&l)
n!s=[2..n]>>s
m&(x:y:r)=cycle('│':init([1..y]>>(m*x)!" "++"╵")):(m*x*y)&r
m&[x]=[cycle$'╵':(m*x)!" "]
m&e=[]

Cobalah online!

Laikoni
sumber
1
Pendekatan yang berbeda pada 158 byte ( Coba online! ), Mungkin dapat dipersingkat lebih sedikit karena saya tidak berbicara bahasa Haskell dengan baik.
Οurous
@ Berair Terima kasih!
Laikoni
1

PowerShell , 152 byte

param($t,$i)"┌$('┬'*--$t)┐"
$i|%{$s=++$s*$_-1;$p=".(.{$s}|.*$)"
if($r){$r-replace$p,'│$1';rv r}else{$r=' '*($t+2)-replace$p,'╵$1'}}
if($r){$r}

Cobalah online!

Belum dibuka:

param($ticks,$intervals)
"┌$('┬'*--$ticks)┐"                         # implicit output
$intervals|%{
    $step=++$step*$_-1
    $pattern=".(.{$step}|.*$)"
    if($row){
        $row-replace$pattern,'│$1'          # implicit output
        Remove-Variable row
    }else{
        $row=' '*($ticks+2)-replace$pattern,'╵$1'
    }
}
if($row){$row}                              # implicit output
mazzy
sumber
1
Kamu benar. 1) Saya tidak melihat aturan yang memungkinkan mengekor baris baru di akhir. 2) dan saya tidak suka kode itu terkadang menambahkan baris baru di akhir, dan terkadang tidak. :)
mazzy
0

C # (Visual C # Interactive Compiler) , 204 byte

a=>b=>{Write("┌"+"┐\n".PadLeft(++a,'┬'));for(int i=1;;i++,WriteLine())for(int j=0;j<a;){var m=b.Select((c,d)=>b.Take(d+1).Aggregate((e,f)=>e*f)).Count(c=>j++%c<1);Write(m<1|i>m?" ":m<2?"╵":"|");}}

Cobalah online!

Output, tetapi macet di loop tak terbatas.

Perwujudan Ketidaktahuan
sumber
0

Bersih , 221 201 195 162 byte

import StdEnv
$n l=[["┌":repeatn(n-1)"┬"]++["┐"]:[[if(?(i-1))if(?i&&l%(i,i)>[])"│""╵"" "\\p<-[0..n],let?j=1>p rem(prod(l%(0,j)))
]\\i<-[1,3..length l]]]

Cobalah online!

Mengembalikan daftar daftar karakter UTF-8 (sebagai string, karena Clean tidak memiliki dukungan UTF-8 bawaan).

Bekerja dengan membuat baris pertama, kemudian mengambil produk dari awalan daftar yang disediakan dalam kelompok dua, dan memeriksa tanda yang akan ditarik berdasarkan apakah produk membagi posisi karakter saat ini.

Tidak Disatukan:

$ n l
    = [
        ["┌": repeatn (n - 1) "┬"] ++ ["┐"]:
        [
            [
                if(? (i - 1))
                    if(? i && l%(i, i) > [])
                        "│"
                        "╵"
                    " "
                \\ p <- [0..n]
                , let
                    ? j = 1 > p rem (prod (l%(0, j)))
            ]
            \\ i <- [1, 3.. length l]
        ]
    ]
Suram
sumber