Buka di semua arah

14

Memasukkan:

Sebuah benang

Keluaran:

1) Pertama-tama kita ambil karakter hapus pada akhir input-string sampai kita dibiarkan dengan panjang yang persegi (yaitu 1, 4, 9, 16, 25, 36, dll.)
Jadi abcdefghijklmnopqrstuvwxyz(panjang 26) menjadi abcdefghijklmnopqrstuvwxy( panjang 25).

2) Lalu kita menempatkan ini dalam kotak, satu baris pada satu waktu, dari kiri ke kanan:

abcde
fghij
klmno
pqrst
uvwxy

3) Kami melipatnya di keempat arah, seperti ini (kami terus membuka sampai 'blok' terlipat tidak memiliki karakter dalam untuk dibuka lagi):

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Beberapa hal yang perlu diperhatikan, ketika kita melipat ke luar, pada dasarnya kita mencerminkan seperti ini (angka ditambahkan sebagai klarifikasi, yang mewakili 'indeks' dalam contoh ini):

Ketika kami melipat sisi kiri:

 123    to:   321 123
fghij         ihgf   j

Ketika kita melipat sisi kanan:

 123    to:    123 321
fghij         f   jihg

Saat kami melipat ke atas:

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

Ketika kita melipat ke bawah:

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

Aturan tantangan:

  • Anda dapat berasumsi bahwa input akan selalu memiliki setidaknya 1 karakter (yang juga akan menjadi output).
  • Format output fleksibel, sehingga Anda dapat mencetak ke STDOUT atau STDERR; kembali sebagai string-array / daftar atau karakter 2D-array; string tunggal dengan baris baru; dll.
  • Input hanya akan berisi karakter alfanumerik ( a-zA-Z0-9)
  • Anda juga dapat menggunakan karakter non-alfanumerik untuk mengisi spasi di dan / atau di sekitar keluaran ASCII-art, seperti titik ..
  • Ruang trailing dan satu garis baru trailing adalah opsional.
  • Kami terus membuka sampai blok luar yang terlipat tidak memiliki lagi pusat untuk dibuka.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a
Kevin Cruijssen
sumber
ada kesalahan dalam tes untuk "BagaimanaAtas TentangAtauBerikutnyaKecukupanApa Yang JugaAndaAvenSquareInsteadOfOddOneAndExceed64Chars": 'h' -> 'i' di dekat bagian bawah output
ngn

Jawaban:

5

SOGL V0.12 , 75 byte

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

Coba Di Sini!

Ini mengharapkan input pada stack, jadi untuk kemudahan penggunaan saya tambahkan ,di awal. Itu bisa menimbulkan masalah jika input hanya berisi angka jadi di sini ada test-suite untuk itu.

70 byte √lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚juga berfungsi, tetapi karena saya baru sekarang menerapkan string dan dokumentasi tidak menyebutkan bahwa itu akan mempengaruhi panjangnya saya tidak akan menghitungnya.

Penjelasan:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically
dzaima
sumber
Versi 70 byte Anda valid karena tidak bersaing bukan lagi hal .
Shaggy
@ Shaggy Versi 75 byte hanya valid karena itu seperti sebelumnya tantangan ini hanya bekerja pada angka. Alasan mengapa saya tidak menghitung versi 75 byte adalah karena saya merasa seperti itu jatuh di bawah celah menambahkan built-in hanya untuk tantangan
dzaima
4

Arang , 120 109 byte

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κꧧεκ⁺μκ↷A⮌EεEε§ξν嶻A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

Cobalah online! Catatan yang telah diubah dan tautannya mencerminkan hal ini. Penjelasan:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

Menghitung h = int(sqrt(len(q))). ( Floorbelum diterapkan ...)

Fη⊞υ✂θ×ιη

Ekstrak hirisan panjang hdari input. (Sebenarnya saya tidak repot memotong irisan memanjang h.) Saya menggunakan forloop daripada Mapkarena saya perlu Assignhasil dari Mapsuatu tempat dan ini tidak biasa ketika berurusan dengan a Slice.

F⁴«

Berlangsung terjadi 4 kali, sekali untuk setiap arah (bawah, kanan, atas, kiri sebagai kode). Variabel loop untuk loop ini adalah i.

   Aυε

Ambil salinan string yang diiris.

   J⁰¦⁰

Langsung kembali ke asal kanvas sehingga setiap buka dimulai dengan h-dengan hkotak di tempat yang sama.

   F÷⁺¹η²«

Ulangi (h+1)/2kali; sekali untuk masing-masing buka, ditambah sekali untuk kotak asli. Variabel loop untuk loop ini adalah k.

          F⁴«

Ulangi 4 kali, sekali untuk setiap sisi dari bujur sangkar. (Saya tidak menggunakan variabel loop l.)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

Cetak satu sisi kotak yang tidak dilipat. Karena ini adalah yang kterungkap, sisi kotak adalah h-2k, dan mengambil karakter kdari tepi kotak asli.

Pivot siap mencetak sisi persegi berikutnya.

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

Putar string yang diiris. (Ya, itu a ξ. Saya tidak sering menggunakannya!) EηJuga akan berfungsi untuk bagian luar Map. Rotasi juga memiliki efek samping yang nyaman untuk memotong lebar array h.

             ¶»

Setelah mencetak sisi, kursor bergerak dari tepi kotak. Mencetak satu karakter lebih sedikit gagal untuk kotak sisi 1 dan kurang golfy. Setelah sebelumnya diputar, mencetak baris baru dengan mudah memindahkan kursor kembali ke sudut.

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

Balikkan kotak secara vertikal atau horizontal sesuai kebutuhan.

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

Hitung perpindahan ke buka berikutnya.

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

Pindahkan secara horizontal atau vertikal ke buka berikutnya sebagaimana mestinya.

Berikut ini tautan ke versi 97-byte yang diperoleh dengan memanfaatkan semua fitur Arang terbaru termasuk Floor: Coba online! Tautan adalah untuk mengucapkan versi kode.

Neil
sumber
Apakah Anda yakin ini berhasil? TIO sepertinya memunculkan kesalahan.
LyricLy
@ Bahricly Bah, saya pikir saya pintar, tetapi gagal untuk benar-benar memeriksa apakah itu berhasil. Saya akan mengembalikan perubahan.
Neil
1
Omong kosong lupa membuat pelampung bekerja dalam irisan oops
ASCII
@ Hanya ASCII Tidak membantu saya, saya harus memotong ke integer sebelum mengalikannya.
Neil
Baik. Yah saya menambahkan lantai segera sehingga tidak akan banyak masalah: P
ASCII-satunya