Putar kolom


28

Dengan bilangan bulat k dan salah satu blok teks, atau larik 2d yang array dalamnya mungkin memiliki panjang yang tidak sama (yang menyerupai blok teks), putar setiap karakter atau elemen di kolom k ke atas atau ke bawah ke posisi berikutnya yang ada.

Contoh

Putar kolom ke-20 dari teks berikut (berbasis 1):

A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.

This is not enough.
Wrapping around to the first line.

Keluaran:

A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv

This is not enough.
Wrapping around to .he first line.

Memutar kolom k -th dari input yang sama di mana 35 < k <42 akan menghasilkan teks input tidak berubah.

Aturan

  • Anda dapat menggunakan teks mentah, array baris, array karakter 2d, atau format apa pun yang wajar untuk mewakili data. Anda juga dapat menggunakan tipe data selain karakter.
  • Jumlah nilai yang mungkin dari tipe data elemen harus minimal 20 jika panjang kode Anda bergantung padanya, jika tidak setidaknya 2. Ini bisa berupa subset dari karakter atau nilai-nilai lain yang didukung dalam tipe asli.
  • Spasi dan segala jenis nilai nol hanyalah nilai normal, jika Anda mengizinkannya dalam input. Anda juga bisa mengecualikan mereka dalam jenis elemen.
  • Perubahan aturan: Anda diizinkan untuk mengisi array yang lebih pendek dengan nilai default generik (seperti spasi), jika Anda lebih suka menggunakan array dengan panjang yang sama untuk menyimpan data.
  • k bisa berbasis 0 atau berbasis 1. Itu dijamin berada di dalam baris terpanjang di input (menyiratkan input memiliki setidaknya satu baris non-kosong).
  • Anda dapat memilih apakah itu berputar ke atas atau ke bawah.
  • Entah hanya memutar satu posisi, atau rotate n posisi di mana n adalah bilangan bulat positif yang diberikan pada input.
  • Kode terpendek menang.

Jawaban:


8

APL (Dyalog Extended) , 9 byte SBCS

Program lengkap. Meminta stdin untuk blok teks 2D, lalu k (berbasis 0 atau 1, tergantung pada pengaturan APL saat ini), lalu n . Positif n putar ke atas, negatif n putar ke bawah.

Domain terdiri dari salah satu dari berikut ini:

  1. semua karakter Unicode, kecuali spasi , meninggalkan 1114111 nilai yang diizinkan, yang lebih dari yang dibutuhkan 20.

  2. semua angka, kecuali 0 , menyisakan sekitar 2 129 nilai yang diizinkan, yang lebih dari yang dibutuhkan 20.

Karena APL membutuhkan blok 2D menjadi persegi panjang, input harus diisi dengan spasi / nol. Ini dapat dilakukan secara otomatis dengan memasukkan di sebelah kiri daftar string / daftar numerik.

⎕⌽@≠@⎕⍢⍉⎕

Cobalah online!(ruang yang tampak sebenarnya adalah ruang yang tidak melanggar)

 meminta blok teks

⍢⍉ sementara ditransformasikan:

@⎕ terapkan yang berikut ini pada baris input'th:

  @≠ pada elemen yang berbeda dari prototipe mereka (ruang untuk karakter, nol untuk angka):

   ⎕⌽ putar "input" langkah ke kiri

APL (Dyalog Unicode) , 22+ byte SBCS

Versi ini memungkinkan karakter penuh diatur dengan menggunakan nol sebagai elemen isian yang dapat diidentifikasi.

0~¨⍨↓⍉⎕⌽@(0≠⊢)@⎕⍉↑0,¨⎕

Cobalah online!

Ini tentu saja berarti bahwa nol tidak diperbolehkan dalam argumen numerik. Program yang sesuai untuk semua angka akan memiliki tiga kejadian 0diganti oleh ' 'dan dengan demikian menggunakan ruang sebagai isian:

' '~¨⍨↓⍉⎕⌽@(' '≠⊢)@⎕⍉↑' ',¨⎕

Jika kita benar-benar menginginkan rentang penuh (bahkan campuran) karakter dan angka, kita dapat menggunakan null sebagai isian:

n~¨⍨↓⍉⎕⌽@(n≠⊢)@⎕⍉↑⎕,¨⍨n←⎕NULL

Dan akhirnya, jika kita ingin memasukkan nulls dan objek dalam domain input, kita bisa mendefinisikan kelas isian dan menggunakan contoh-contoh ini sebagai isian:

~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEWFIX':Class C' ':EndClass'

Sekarang secara resmi nyatakan ini (dan jawaban baru seperti ini) sebagai jawaban yang valid. Maaf jika ini terlalu mengganggu Anda.
jimmy23013

Lebih pendek dari versi nol Anda: n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬. Mungkin Anda bisa menambahkan modded di ekstensi Anda untuk membantu golf lebih lanjut (tapi saya tidak yakin seberapa berguna mereka).
jimmy23013

@ jimmy23013 Ya, saya memikirkan hal itu, tetapi kemudian tidak dapat mengambil daftar hal-hal yang bersarang secara sewenang-wenang. Yang terakhir adalah solusi akhir, terutama jika Cdan Idilokalkan agar tidak mencemari:{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
Adám

11

Python 2 , 111 110 109 99 98 96 94 byte

lambda a,n:[l[:n]+(l[n:]and[L[n]for L in a[i:]+a if L[n:]][1]+l[n+1:])for i,l in enumerate(a)]

Cobalah online!

Mengambil input sebagai daftar baris dan kolom indeks-0, dan mengembalikan daftar string.

Kolom diputar hingga 1.

-11 byte, terima kasih kepada Jo King


7

Java 8, 107 106 135 107 byte

k->m->{int s=m.length,i=-1;for(char p=0,t;i<s;t=m[i%s][k],m[i%s][k]=p<1?t:p,p=t)for(;m[++i%s].length<=k;);}

+29 byte untuk perbaikan bug ..

0 diindeks; berputar seperti contohnya.
Input sebagai karakter-matriks; memodifikasi char-matrix bukannya mengembalikan yang baru untuk menghemat byte.

Cobalah online.

Penjelasan:

k->m->{                 // Method with integer and char-matrix parameters and no return-type
  int s=m.length,       //  Amount of lines in the matrix `s`
      i=-1;             //  Index-integer `i`, starting at -1
  for(char p=0,         //  Previous-character, starting at 0
           t;           //  Temp-char, uninitialized
      i<s               //  Loop as long as `i` is smaller than `s`:
      ;                 //    After every iteration:
       t=m[i%s][k],     //     Set the temp to the `k`th character of the `i`'th line
       m[i%s][k]=       //     Replace the `k`'th character of the `i`'th line with:
         p<1?           //      If `p` is still 0:
          t             //       Set it to the temp we just set
         :              //      Else:
          p,            //       Set it to the previous-character instead
       p=t)             //     And then replace `p` with the temp for the next iteration
    for(;m[++i          //   Increase `i` by 1 before every iteration with `++i`,
             %s].length //   And continue this loop until the length of the `i`'th line
           <=k;);}      //   is smaller than or equal to the input `k`

1
Satu hal yang saya perhatikan adalah Anda membuat asumsi bahwa baris pertama memiliki cukup karakter - char p=m[0][k]- jika tidak, bukankah ini akan melempar pengecualian? Kerja bagus btw. Anda mengalahkan upaya C # saya dengan margin besar :)
dana

@dana Ah, sial, kau benar .. Aku mungkin mengalahkanmu dengan margin sebesar ini karena aku tidak sengaja membuat asumsi itu .. Akan mencoba memperbaikinya.
Kevin Cruijssen

1
@dana Tetap, terima kasih telah memperhatikan.
Kevin Cruijssen

2
@dana Dan kembali ke 107 lagi. ;)
Kevin Cruijssen

1
nknkint p=0,t;pm[i%s][k]=(char)(p<1?t:p)

7

Zsh , 94 87 78 74 69 byte

-7 byte dengan mengubah ke ternary aritmatika, -9 byte dengan mengubah karakter di tempat (TIL), -4 byte dengan memasukkan indeks pada stdin dan string sebagai argumen, -5 byte dengan menggunakan string sebagai ganti array untuk menyimpan karakter yang berputar.

read i
for s;c+=$s[i]
c=$c[-1]$c
for s;s[i]=$c[$[$#s<i?0:++j]]&&<<<$s

Old Old Old Old Cobalah online!

Berikut adalah kunci untuk membuat jawaban ini berfungsi:

  • $array[0]atau $string[0]selalu kosong
  • $array[n]atau $string[n]kosong jika n lebih besar dari panjang array / string
  • array[i]=catau string[i]=cakan mengganti elemen / karakter.
  • Dalam $[$#s<i?0:++j], jini tidak bertambah jika $#s<i.

Dalam jawaban 94 byte asli, ada masalah menarik yang saya temui terkait penggunaan <<<untuk mencetak. Saya harus menggunakan echountuk menyiasatinya:

for s;echo $s[0,i-1]$c[$[$#s<i?0:++j]]${s:$i}

Alasannya bisa dilihat di sini:

echo $ZSH_SUBSHELL   # prints 0
<<< $ZSH_SUBSHELL    # prints 1

String di sini dijalankan dalam subkulit karena mereka diberikan sebagai stdin ke program lain. Jika tidak ada program yang diberikan, secara implisit diberikan kepada cat. Anda dapat melihat ini dengan <<< $_. <<< $ZSH_SUBSHELLmirip dengan echo $ZSH_SUBSHELL | cat. Karena kita perlu kenaikan j, kita tidak bisa dalam subkulit.


6

R , 62 byte

function(L,n){L[A,n]<-rep(L[A<-L[,n]!=' ',n],2)[1+1:sum(A)];L}

Cobalah online!

Mengambil input sebagai matriks karakter dengan spasi. Putar ke atas. Semua berkat Kirill L. !

R , 74 byte

function(L,n){substr(L[A],n,n)=rep(substr(L[A<-nchar(L)>=n],n,n),2)[-1]
L}

Cobalah online!

Pengajuan ini lebih dulu dari batas jatah empuk.

Mengasingkan di substrsini tidak akan berhasil karena kami menelepon substrdan substr<-di baris pertama.

I / O sebagai daftar garis non-empuk; berputar ke atas.


Sejak konsensus memungkinkan memodifikasi input, kita dapat melakukan hal gila ini
Kirill L.

Juga, OP melonggarkan aturan, sehingga sekarang mungkin untuk bekerja dengan matriks ruang-empuk, semacamnya ini
Kirill L.

@ KirillL. Saya tidak berpikir bahwa R lewat referensi sehingga kami mungkin tidak diizinkan untuk melakukan itu; itu mengejutkan saya bahwa ini hanya berfungsi jika argumen tersebut dinamai Ldalam lingkungan induk. Saya dengan senang hati akan memperbarui ke ruang-padding!
Giuseppe

Ah, begitu, kamu benar. Saya datang dengan ide ini melihat jawaban Ruby saya (yang menyimpan 1 byte keseluruhan dengan cara ini :)), tetapi bahasa memang berperilaku berbeda dalam situasi ini.
Kirill L.

5

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

k=>a=>{var c='0';a.Where(b=>b.Count>k&&((b[k],c)=(c,b[k])).c>0).ToList()[0][k]=c;}

Cobalah online!

Kredit ke @ ASCIIHanya untuk saran foreachyang menghasilkan penghematan 12 byte!

-8 Bytes berkat @someone!
-1 byte terima kasih kepada @EmbodimentofIgnorance!



Mungkin 183 jika menggunakan ints bukan karakter
Expired Data

@ExpiredData ew int bukan char
ASCII-only

Sayang sekali Anda tidak dapat menggunakan foreachkarena ini adalah urutan sebaliknya :(
ASCII-satunya

1
Gunakan dynamicuntuk menggabungkan deklarasi dan menyimpan 2 byte (Saya belum pernah melihat ini sebelumnya!) Cobalah online!
kata ganti saya adalah monicareinstate

4

Ruby , 57 byte

->a,k{b=a.map{|i|i[k]}-[p];c=-2;a.map{|i|i[k]&&=b[c+=1]}}

Cobalah online!

Mengambil input sebagai array garis a. Putar teks ke bawah pada posisi berbasis 0 k. Kembali dengan memodifikasi input a.


3

05AB1E , 21 byte

ʒg‹}U¹εXyk©diX®<èIèIǝ

Pasti bisa bermain golf lagi ..

0 diindeks; input dan output keduanya sebagai daftar string.
Berputar ke bawah seperti contoh, tetapi <dapat diganti dengan >untuk memutar ke atas.

Cobalah online (footer bergabung dengan daftar oleh baris baru, hapus untuk melihat output daftar yang sebenarnya).

Penjelasan:

ʒ  }             # Filter the (implicit) input-list by:
 g               #  Where length of the current string
                #  is larger than the (implicit) input-integer
    U            # Pop and store this filtered list in variable `X`
¹ε               # Map over the first input-list again:
  Xyk            #  Get the index of the current string in variable `X`
     ©           #  Store it in the register (without popping)
      di         #  If the index is not -1, so the current string is present in variable `X`
        X®<è     #   Get the (index-1)'th string in variable `X`
            Iè   #   Get the character at the index of the input-integer
              Iǝ #   And insert it at the index of the input-integer in the current string

3

K4 , 41 byte

Larutan:

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]}

Penjelasan:

Tidak yakin jika saya melewatkan sesuatu ... 0 indeks, putar ke atas (ubah 1ke -1untuk untuk memutar ke bawah)

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]} / the solution
{                                       } / lambda taking implicit x and y
 .[x; ;:;                              ]  / index apply assignment back into x
         .q.rotate[1;                 ]   / left rotate 1 character
                           (       ; )    / two item list
                                    y     / index to rotate
                               #:'x       / count (#:) each (') input
                             y<           / index less than ?
                            &             / indexes where true
                         i:               / assign to variable w
                     x .                  / index into x
     i                                    / indexes we saved as i earlier

3

Japt v2.0a0, 18 byte

Berbasis 0 dengan input & output sebagai string multi-line. Rotasi oleh 1.

Pasti ada metode yang lebih pendek!

yÈr\S_Y¦V?Z:°TgXrS

Cobalah

yÈr\S_Y¦V?Z:°TgXrS     :Implicit input of string U & integer V
y                      :Transpose
 È                     :Pass each line X at 0-based index Y through the following function & transpose back
  r                    :  Replace
   \S                  :  RegEx /\S/g
     _                 :  Pass each match Z through the following function
      Y¦V              :    Test Y for inequality with V
         ?Z:           :    If true, return Z, else
            °T         :    Increment T (initially 0)
              g        :    Index into
               XrS     :    X with spaces removed

Saya belum melihat dari dekat pada komentar dan aturan baru (jadi mungkin di suatu tempat disebutkan itu diizinkan sekarang, sementara itu tidak sebelumnya), tetapi apakah itu diizinkan untuk melewati ruang input awal? Katakanlah Anda mengubah indeks input ke 6, jawaban Anda akan melewati spasi di line withdi baris pertama dan di Rotate heredi baris keempat, sedangkan sebagian besar jawaban lain akan memutar ruang itu juga.
Kevin Cruijssen

@KevinCruijssen, saya agak bingung dengan semua aturan tambahan & kelonggaran tetapi, jika ini adalah masalah, sepertinya saya bisa mengatasinya dengan tidak memberikan spasi pada input. Kupikir.
Shaggy

1
" Aku pikir " Bagian ini memang bagaimana aku juga akan merespons, haha. Saya tidak tahu apa yang wajib dan opsional lagi, tetapi saya pikir Anda memang bisa memilih untuk menghilangkan spasi di dalam dan output; Saya pikir Anda dapat memilih untuk menghitung spasi atau tidak; dan saya pikir Anda dapat menggunakan ruang percobaan dalam output atau tidak; dll. Semua agak membingungkan. Ah well ..
Kevin Cruijssen

3

Jelly , 16 byte

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦"

Sebuah dyadic Link yang menerima daftar garis (daftar karakter yang tidak mengandung karakter baris baru) di sebelah kiri dan integer di sebelah kanan yang mengembalikan daftar garis.

Cobalah online!(footer membagi pada baris baru, memanggil Tautan, dan bergabung dengan baris baru lagi)

Bagaimana?

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦" - Link: lines L; index I        e.g. example in question; 20
z⁷               - transpose L with filler '\n'       ['AAART\nTW', '   oh\nhr', ...]
  ⁹ị             - Ith item                           'am\nv.\n\nt'
    Ỵ            - split at newlines                  ['am', 'v.', '', 't']
         Ʋ       - last four links as a monad - i.e. f(X):
     F           -   flatten                          'amv.t'
       -         -   -1
      ṙ          -   rotate left by                   'tamv.'
        ṁ        -   mould like X                     ['ta', 'mv', '', '.']
          Y      - join with newlines                 'ta\nmv\n\n.'
                 -   -- call this C
           ⁸     - chain's left argument, L
               " - zip with - i.e. [f(L1,C1), f(L2,C2), ...]:
              ¦  -   sparse application...
             ⁹   -   ...to indices: chain's right argument, I
            ṛ    -   ...of: right argument, Cn

2

perl 5 (-p ), 75 byte

k adalah 0-diindeks, putar ke bawah

s/.*//;$r="^.{$&}";s/
//;/$r(.)/;$c=$1;s/$r\K.(?=(?s:.)*?$r(.)|)/$1||$c/gme

TIO


2

Perl 6 , 38 33 byte

Mengubah array pada tempatnya (aturan tidak diijinkan)

{@^a.grep(*>$^b+1)[*;$b].=rotate}

Cobalah online!


@ bercanda Pada awalnya saya pikir menyimpannya daripada mengeluarkannya akan sedikit curang, tetapi membaca ulang aturan, tidak ada ketentuan aktual untuk keluaran jadi ... hore. Melakukan (...) (...) untuk mendapatkan 31 seperti yang Anda lakukan tampaknya curang, karena secara efektif mengangkat panggilan keluar dari blok, tetapi masih dapat dilakukan dengan 33 melewati mereka secara bersamaan dengan satu panggilan jadi saya ' Aku akan pergi dengan itu.
user0721090601

ah oops, saya menempel tautan yang salah. Anda mendapatkan apa yang saya maksud untuk berkomentar. Input currying baik-baik saja meskipun (meskipun tidak bekerja dalam kasus ini), dan memodifikasi argumen yang disahkan oleh referensi adalah standar untuk input yang diizinkan
Jo King

2

JavaScript (Node.js) , 52 byte

k=>a=>a.filter(b=>b[k]&&([b[k],a]=[a,b[k]]))[0][k]=a

Cobalah online!

-7 byte berkat Shaggy!

Belum melihat jawaban JavaScript! Port jawaban C # saya.


63 byte . Mungkin bisa bermain golf lebih lanjut.
Shaggy

@ Shaggy - bagus :) sebagian besar waktu saya melihat jawaban JS melakukan segala macam hal gila. Kupikir kali ini aku akan mencobanya karena aku punya strategi.
dana

1
Oh, golf dengan baik! :)
Shaggy

2

Arang , 34 28 21 byte

θJη⁰≔ΦKDLθ↓℅ιζUMζ§ζ⊖κ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil array string sebagai input. Diindeks 0. Sunting: Sekarang PeekDirectionsudah diperbaiki, saya bisa memanipulasi secara langsung. Penjelasan:

θ

Cetak string input.

Jη⁰

Lompat ke atas kolom yang akan diputar.

≔ΦKDLθ↓℅ιζ

Ekstrak sel yang telah dicetak.

UMζ§ζ⊖κ

Ganti setiap sel yang dicetak dengan nilai sel sebelumnya (secara siklus). Nilai sel mudah dibaca pada saat PeekDirectionpanggilan sehingga fakta bahwa MapCommandpanggilan menulis nilai-nilai baru ke dalam sel tidak masalah.


1

Pip -rn , 32 byte

POgY#(g@_)>aFI,#gFiyAE@ySsg@i@ag

Diindeks 0, berputar ke bawah. Cobalah online!

Filter untuk menemukan indeks semua baris yang cukup panjang untuk berpartisipasi dalam rotasi. Kemudian lompati baris-baris itu, bertukar karakter yang sesuai pada setiap baris dengan variabel temp s. Mengunjungi baris pertama lagi di akhir menukar nilai boneka kembali.


1

Jelly , 19 byte

ZnÄ×$ịḟ¹ṙ-;ɗɗʋ€⁹¦⁶Z

Cobalah online!

1-diindeks. Putar ke bawah. Tautan monadik yang menggunakan daftar string Jelly yang benar (daftar daftar karakter) sebagai argumen pertama dan k sebagai argumen kedua. Spasi dilarang di input kecuali sebagai padding kanan, tetapi semua karakter lain diizinkan.

Seperti yang diterapkan pada TIO, footer membagi input string tunggal menjadi daftar string dan bantalan kanan, tetapi ini untuk kenyamanan; seperti yang saya pahami, hasil dari langkah itu adalah input yang diizinkan untuk tautan utama sesuai aturan.


1

GFortran , 199 byte

-20 atau lebih dengan membaca dari stdin daripada file
-14 dengan menggunakan bilangan bulat implisit untuk i, k, n
-4 dengan menghilangkan spasi dan::

Membutuhkan pengguna untuk memasukkan kdan npada baris pertama, di mana kkolom untuk memutar, dan njumlah baris teks. Input selanjutnya adalah baris teks yang akan diputar. Sungguh menyakitkan menulis! Fortran sangat hebat!

character(99),allocatable::A(:);character(1)r,s
read(*,*)k,n;allocate(A(n))
do i=1,n;read(*,'(A)')A(i);r=A(i)(k:k)
if(r.ne.''.or.r.ne.' ')then;A(i)(k:k)=s;s=r;endif;enddo
A(1)(k:k)=s;print'(A)',A;end

0

T-SQL, 195 byte

WITH C as(SELECT rank()over(order by i)r,sum(1)over()c,*FROM @t
WHERE len(x)>=@)SELECT
isnull(stuff(c.x,@,1,substring(e.x,@,1)),t.x)FROM @t t
LEFT JOIN c ON t.i=c.i
LEFT JOIN c e ON e.r%c.c+1=c.r

Cobalah secara online versi ungolfed

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.