Obróć kolumnę


28

Biorąc pod uwagę liczbę całkowitą k i blok tekstu lub tablicę 2d, że wewnętrzne tablice mogą mieć nierówne długości (które przypominają blok tekstu), obróć każdy znak lub element w k- tej kolumnie w górę lub w dół do następnej pozycji to istnieje.

Przykład

Obróć 20. kolumnę następującego tekstu (na podstawie 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.

Wydajność:

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.

Obracanie k- tej kolumny tego samego wejścia, gdzie 35 < k <42 dałoby tekst wejściowy bez zmian.

Zasady

  • Możesz użyć surowego tekstu, tablicy wierszy, 2d tablicy znaków lub dowolnego rozsądnego formatu do przedstawienia danych. Możesz także używać typów danych innych niż znaki.
  • Liczba możliwych wartości typu danych elementów musi wynosić co najmniej 20, jeśli długość kodu zależy od tego, w przeciwnym razie co najmniej 2. Może to być podzbiór znaków lub innych wartości obsługiwanych w typie rodzimym.
  • Spacje i wszelkiego rodzaju wartości zerowe są po prostu wartościami normalnymi, jeśli dopuścisz je na wejściu. Możesz także po prostu wykluczyć je w typie elementu.
  • Zmiana reguły: możesz wstawiać krótsze tablice ogólną wartością domyślną (taką jak spacje), jeśli wolisz używać tablic o równej długości do przechowywania danych.
  • k może być oparty na 0 lub na 1. Gwarantujemy, że znajduje się w najdłuższej linii na wejściu (co oznacza, że ​​na wejściu znajduje się co najmniej jedna niepusta linia).
  • Możesz wybrać, czy ma się obracać w górę, czy w dół.
  • Albo po prostu obróć jedną pozycję, albo obróć n pozycji, gdzie n jest dodatnią liczbą całkowitą podaną na wejściu.
  • Najkrótszy kod wygrywa.

Odpowiedzi:


8

APL (Dyalog Extended) , 9 bajtów SBCS

Pełny program Monituje stdin dla bloku tekstu 2D, następnie k (oparty na 0 lub oparty na 1, w zależności od bieżącego ustawienia APL), a następnie n . Pozytywne n obraca się w górę, ujemne n obraca się w dół.

Domena składa się z jednej z następujących czynności:

  1. wszystkie znaki Unicode, z wyjątkiem spacji , pozostawiając 1114111 dozwolonych wartości, które są większe niż wymagane 20.

  2. wszystkie liczby, z wyjątkiem 0 , pozostawiając około 2 129 dozwolonych wartości, czyli więcej niż wymagane 20.

Ponieważ APL wymaga, aby bloki 2D były prostokątne, dane wejściowe muszą być wypełnione spacjami / zerami. Można to zrobić automatycznie, wpisując po lewej stronie listy ciągów / list numerycznych.

⎕⌽@≠@⎕⍢⍉⎕

Wypróbuj online! (pozorne spacje są w rzeczywistości spacjami niełamającymi)

 monit o blok tekstu

⍢⍉ podczas transpozycji:

@⎕ zastosuj następujące w wierszu wejściowym:

  @≠ w elementach innych niż ich prototyp (miejsce na znaki, zero na cyfry):

   ⎕⌽ obróć kroki „wejściowe” w lewo

APL (Dyalog Unicode) , 22+ bajtów SBCS

Ta wersja pozwala na pełny zestaw znaków przy użyciu zer jako identyfikowalnego elementu wypełniającego.

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

Wypróbuj online!

To oczywiście oznacza, że ​​zera nie są dozwolone w argumentach numerycznych. Odpowiedni program dla wszystkich liczb miałby trzy wystąpienia 0zastąpione przez, ' 'a zatem używałby spacji jako wypełnienia:

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

Jeśli naprawdę chcemy pełnego zakresu (nawet mieszanki) zarówno znaków, jak i liczb, moglibyśmy użyć null jako wypełnienia:

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

I wreszcie, jeśli chcielibyśmy uwzględnić wartości zerowe i obiekty w domenie wejściowej, moglibyśmy zdefiniować klasę wypełnienia i użyć jej wystąpień jako wypełnień:

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

Teraz oficjalnie zadeklaruj to (i nowe odpowiedzi jak ten) jako prawidłową odpowiedź. Przepraszam, jeśli zbytnio cię to niepokoiło.
jimmy23013

Krótszy niż wersji zerowej: n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬. Może mógłbyś dodać modded w swoim rozszerzeniu, aby pomóc w dalszym grze w golfa (ale nie jestem do końca pewien, jak przydatne są).
jimmy23013

@ jimmy23013 Tak, myślałem o tym, ale potem nie można pobrać list dowolnie zagnieżdżonych rzeczy. Ten ostatni jest najlepszym rozwiązaniem, zwłaszcza jeśli Ci Isą zlokalizowane tak, aby nie zanieczyszczać:{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
Adam

11

Python 2 , 111 110 109 99 98 96 94 bajtów

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)]

Wypróbuj online!

Pobiera dane wejściowe jako listę wierszy i kolumny z indeksem 0 i zwraca listę ciągów znaków.

Kolumna jest obracana w górę 1.

-11 bajtów, dzięki Jo King


7

Java 8, 107 106 135 107 bajtów

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 bajtów do naprawy błędu ..

0-indeksowane; obraca się w dół jak w przykładzie.
Wprowadzanie jako macierz znaków; modyfikuje macierz znaków zamiast zwracać nową, aby zapisać bajty.

Wypróbuj online.

Wyjaśnienie:

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
Zauważyłem tylko, że zakładasz, że w pierwszym wierszu jest wystarczająca liczba znaków - char p=m[0][k]- jeśli nie, czy nie spowoduje to wyjątku? Dobra robota btw. Pokonujesz moją próbę C # z dużym marginesem :)
dana

@dana Ah, cholera, masz rację .. Prawdopodobnie biję cię o tak dużą marżę, ponieważ przypadkowo przyjmuję takie założenie. Spróbuję to naprawić.
Kevin Cruijssen

1
@dana Naprawiono, dziękuję za zauważenie.
Kevin Cruijssen

2
@dana I znowu do 107. ;)
Kevin Cruijssen

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

7

Zsh , 94 87 78 74 69 bajtów

-7 bajtów poprzez zamianę na arytmetyczną trójskładnikową, -9 bajtów poprzez zmianę znaku w miejscu (TIL), -4 bajtów poprzez wprowadzenie indeksu na standardowe wejście i ciągi jako argumenty, -5 bajtów przy użyciu łańcucha zamiast tablicy do przechowywania obracających się znaków.

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 Wypróbuj online!

Oto klucze do uruchomienia tej odpowiedzi:

  • $array[0]lub $string[0]jest zawsze pusty
  • $array[n]lub $string[n]jest pusty, jeśli n jest większe niż długość tablicy / łańcucha
  • array[i]=club string[i]=czastąpi element / znak.
  • W $[$#s<i?0:++j], jjest nie zwiększane jeśli $#s<i.

W pierwotnej 94-bajtowej odpowiedzi pojawił się interesujący problem dotyczący <<<drukowania. Musiałem użyć echodo obejścia tego:

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

Powód tego można zobaczyć tutaj:

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

Ciągi tutaj są uruchamiane w podpowłokach, ponieważ są podawane jako stdin do innego programu. Jeśli nie podano żadnego programu, jest on domyślnie przekazany do cat. Możesz to zobaczyć za pomocą <<< $_. <<< $ZSH_SUBSHELLjest podobny do echo $ZSH_SUBSHELL | cat. Ponieważ musimy zwiększać j, nie możemy znajdować się w podpowłoce.


6

R , 62 bajty

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

Wypróbuj online!

Pobiera dane wejściowe jako wypełnioną spacjami macierz znaków. Obraca się w górę. Wszystko dzięki Kirill L. !

R , 74 bajty

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

Wypróbuj online!

To zgłoszenie wyprzedza limit linii wyściełanych.

Aliasy substrtutaj nie zadziała, ponieważ dzwonimy substri substr<-na pierwszej linii.

I / O jako lista linii bez wypełnienia; obraca się w górę.


Ponieważ konsensus pozwala modyfikować dane wejściowe, możemy zrobić tę szaloną rzecz
Kirill L.

Również PO złagodzone zasady, dzięki czemu możliwe jest teraz do pracy z miejsca wyściełane matryc, coś jak ten
Kirill L.

@KirillL. Nie sądzę, że R przechodzi przez odniesienie, więc prawdopodobnie nie możemy tego robić; uderza mnie, że działa to tylko wtedy, gdy argument jest nazwany Lw środowisku nadrzędnym. Jednak z przyjemnością zaktualizuję wypełnienie przestrzeni!
Giuseppe

Ach, rozumiem, masz rację. Wpadłem na ten pomysł, patrząc na moją odpowiedź Ruby (która oszczędza w ten sposób cały 1 bajt :)), ale w tej sytuacji języki rzeczywiście zachowują się inaczej.
Kirill L.

5

C # (interaktywny kompilator Visual C #) , 82 bajty

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

Wypróbuj online!

Podziękowania dla @ASCIIO tylko za sugestię, foreachktóra doprowadziła do oszczędności 12 bajtów!

-8 bajtów dzięki @someone!
-1 bajt dzięki @EmbodimentofIgnorance!



Może 183, jeśli używasz ints zamiast znaków
Data ważności

@ExpiredData ew int zamiast char
tylko ASCII

szkoda, że ​​nie możesz użyć, foreachponieważ jest w odwrotnej kolejności :(
tylko ASCII,

1
Służy dynamicdo scalania deklaracji i zapisywania 2 bajtów (nigdy wcześniej tego nie widziałem!) Wypróbuj online!
mój zaimek to monicareinstate

4

Rubinowy , 57 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako tablicę wierszy a. Obraca tekst w dół o pozycję 0 k. Zwraca przez modyfikację wejścia a.


3

05AB1E , 21 bajtów

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

Zdecydowanie można jeszcze zagrać w golfa ..

0-indeksowane; wejście i wyjście zarówno jako lista ciągów.
Obraca się w dół jak w przykładzie, ale <można go zastąpić, >aby obrócić w górę.

Wypróbuj online (stopka dołącza do listy nowymi wierszami, usuń ją, aby zobaczyć rzeczywiste wyniki listy).

Wyjaśnienie:

ʒ  }             # 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 bajtów

Rozwiązanie:

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

Wyjaśnienie:

Nie wiem, czy ja czegoś brakuje ... 0 indeksu, obraca się (zmienić 1się -1za obrót w dół)

{.[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 bajtów

Oparte na 0 z wejściem i wyjściem jako ciąg wielu linii. Obraca w górę o 1.

Musi być krótsza metoda!

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

Spróbuj

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

Nie przyjrzałem się uważnie komentarzom i nowym regułom (więc może gdzieś wspomniano, że jest teraz dozwolone, a nie było wcześniej), ale czy można pominąć spacje na początkowym wejściu? Powiedzmy, że zmieniasz indeks wejściowy na 6, twoja odpowiedź pominie miejsce line withw pierwszej linii i Rotate hereczwartej linii, podczas gdy większość pozostałych odpowiedzi również obróci tę przestrzeń.
Kevin Cruijssen

@KevinCruijssen, jestem trochę zdezorientowany wszystkimi dodatkowymi zasadami i dodatkami, ale jeśli jest to problem, wygląda na to, że mogę to obejść, nie dopuszczając spacji na wejściu. Myślę.
Kudłaty

1
Myślę, że ” Ta część rzeczywiście tak odpowiedziałabym, haha. Nie mam już pojęcia, co jest obowiązkowe i opcjonalne, ale myślę, że rzeczywiście można pominąć spacje na wejściu i wyjściu; Myślę, że możesz policzyć spacje lub nie; i myślę, że możesz użyć próbnych spacji w danych wyjściowych, czy nie; itp. W sumie dość mylące. Ach cóż ..
Kevin Cruijssen

3

Galaretka , 16 bajtów

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

Dyadyczny link akceptujący listę linii (listy znaków nie zawierające znaków nowej linii) po lewej stronie i liczbę całkowitą po prawej stronie, która zwraca listę linii.

Wypróbuj online! (stopka dzieli się na nowe linie, wywołuje łącze i ponownie dołącza do nowych linii)

W jaki sposób?

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 bajtów

k ma indeks 0, obróć w dół

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

TIO


2

Perl 6 , 38 33 bajtów

Modyfikuje tablicę w miejscu (reguły nie zabraniają)

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

Wypróbuj online!


@ żartowanie Na początku myślałem, że przechowywanie go zamiast wysyłania byłoby trochę oszustwem, ale ponownie czytając zasady, nie ma żadnych rzeczywistych warunków do wyjścia, więc… hura. Wykonywanie (…) (…), aby uzyskać 31, tak jak na pewno, wydaje się być oszustwem, ponieważ skutecznie wyciąga połączenie z bloku, ale nadal można to zrobić, gdy 33 przekazuje je jednocześnie za jednym razem, więc „ Idę z tym.
user0721090601

ah ups, wkleiłem niewłaściwy link. masz jednak to, co chcę skomentować. Curry wejściowe jest jednak całkowicie w porządku (choć w tym przypadku nie działa), a modyfikacja argumentu przekazywanego przez referencję jest standardową forą dozwolonych danych wejściowych
Jo King

2

JavaScript (Node.js) , 52 bajty

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

Wypróbuj online!

-7 bajtów dzięki Shaggy!

Nie widziałem jeszcze odpowiedzi JavaScript! Port mojej odpowiedzi w C #.


63 bajty . Prawdopodobnie można dalej grać w golfa.
Kudłaty

@Shaggy - nice :) przez większość czasu widzę odpowiedzi JS robiące różne szalone rzeczy. Pomyślałem, że tym razem dam temu szansę, odkąd mam strategię.
dana

1
Och, ładnie grał w golfa! :)
Shaggy

2

Węgiel drzewny , 34 28 21 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera tablicę ciągów jako dane wejściowe. 0-indeksowane. Edycja: Teraz to PeekDirectionnaprawiono, mogę bezpośrednio nim manipulować. Wyjaśnienie:

θ

Wydrukuj ciągi wejściowe.

Jη⁰

Przejdź na górę kolumny, aby ją obrócić.

≔ΦKDLθ↓℅ιζ

Wyodrębnij komórki, które zostały wydrukowane.

UMζ§ζ⊖κ

Zastąp każdą wydrukowaną komórkę wartością poprzedniej komórki (cyklicznie). Dogodnie wartości komórek są odczytywane w czasie PeekDirectionpołączenia, więc fakt, że MapCommandpołączenie zapisuje nowe wartości w komórkach, nie ma znaczenia.


1

Pip -rn , 32 bajty

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

Indeksowane 0, obraca się w dół. Wypróbuj online!

Filtruje, aby znaleźć indeksy wszystkich wierszy, które są wystarczająco długie, aby uczestniczyć w rotacji. Następnie zapętla te rzędy, zamieniając odpowiedni znak w każdym rzędzie zmienną temp s. Ponowne odwiedzanie pierwszego wiersza na końcu ponownie zamienia wartość manekina.


1

Galaretka , 19 bajtów

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

Wypróbuj online!

1-indeksowany. Obraca się w dół. Monadyczny link, który jako pierwszy argument przyjmuje wyściełaną prawą listę łańcuchów galaretki (listę list znaków), a k jako drugi. Spacje są zabronione na wejściu, z wyjątkiem poprawnego wypełniania, ale wszystkie inne znaki są dozwolone.

Jak zaimplementowano w TIO, stopka dzieli pojedynczy ciąg znaków na listę ciągów i wstawia go do prawej, ale jest to dla wygody; jak rozumiem, wynik tego kroku jest dozwolony dla głównego łącza zgodnie z regułami.


1

GFortran , 199 bajtów

-20 mniej więcej czytając ze standardowego wejścia, a nie pliku
-14 , używając niejawnych liczb całkowitych dla i, k, n
-4 przez usunięcie spacji i::

Wymaga od użytkownika wprowadzenia ki npierwszego wiersza, w którym kkolumna ma zostać obrócona, a nliczba wierszy tekstu. Kolejne dane wejściowe to wiersze tekstu do obrócenia. Pisanie tego było trudne! Fortran jest taki pedantyczny!

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 bajtów

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

Wypróbuj wersję online bez golfa

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.