Przesuwaj znaki w ciągu


12

W tym wyzwaniu musisz przesunąć znaki w wprowadzonym ciągu n razy i wyprowadzić przesunięty ciąg

Wejście

Dane wejściowe będą najpierw zawierać ciąg znaków. W następnym wierszu będzie występować liczba całkowita, która oznacza n.

Wynik

  • Jeśli njest dodatnia, przenieś znaki w ciągu do właściwych nczasów.
  • Jeśli njest ujemne, przesuń znaki w ciągu do lewej strony n.
  • Jeśli nwynosi zero, nie przesuwaj znaków w ciągu.

Po przesunięciu (z wyjątkiem, gdy nwynosi zero), wydrukuj przesunięty ciąg.

Notatki

  • Ciąg nie będzie pusty lub null.
  • Ciąg nie będzie dłuższy niż 100 znaków i będzie zawierać tylko znaki ASCII w zakresie (spacja) do ~(tylda) (kody znaków od 0x20 do 0x7E włącznie). Zobacz tabelę ASCII w celach informacyjnych.
  • Zmiana jest cykliczna.
  • Liczba nmoże być dodatnia, ujemna lub zero.
  • n będzie zawsze większa lub równa -1000 i mniejsza lub równa 1000
  • Możesz przyjmować dane wejściowe za pomocą stdinlub z argumentów wiersza poleceń
  • Przesunięty ciąg musi być wyprowadzany w stdout(lub najbliższym odpowiedniku)
  • Możesz napisać pełny program lub funkcję, która pobiera dane wejściowe i wyjściowe z ciągu stdoutlub najbliższego odpowiednika

Przypadki testowe

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

Punktacja

To jest , więc wygrywa najkrótsze przesłanie (w bajtach).

Odpowiedzi:


5

Pyth, 4 bajty

.>zQ

Jest to prawie podobne do mojej 5-bajtowej wersji CJam, z tym wyjątkiem, że Pyth jako operator wejściowy autoewaluacji Q.

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

Wypróbuj online tutaj


Dokładnie takie samo rozwiązanie jak to :-)
— Spikatrix

@CoolGuy Jest dość prosty. Chociaż nie widziałem tego w piaskownicy ..
— Optymalizator

Z jakiegoś powodu wydaje się już nie działać. Oto działająca alternatywa, również 4 bajty.
— hakr14

3

JavaScript ( ES5 ), 55 52 bajtów

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

Skomentowano:

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 bajtów

llim>

To całkiem proste.

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

Wypróbuj online tutaj


1
Czy byłoby to objęte wbudowanymi funkcjami?
— LegionMammal978

@ LegionMammal978 Jest to wbudowana funkcja. Ale OP nie ogranicza użycia wbudowanych ins
— Optymalizator

1
Wbudowane funkcje są standardowymi lukami .
— LegionMammal978

4
@ LegionMammal978 wskazujesz na odpowiedź, która ma prawie 50-50 głosów w górę / w dół. To nie jest decyzja społeczności.
— Optymalizator

2

C, 93 bajty

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

Bardziej przejrzysta jest wersja argument-funkcja, która została zmodyfikowana, aby uczynić wersję wiersza polecenia-argument

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

Ten ma tylko 68 bajtów, co po prostu pokazuje, jak niekorzystne jest C przy przetwarzaniu argumentów wiersza poleceń.

Jeżeli przesunięcie, njest dodatnie, to strlen(s)-n%strlen(s)jest to przesunięcie, a jeśli njest ujemne, to jest przesunięcie -n%strlen(s). Te printfodciski od offsetu c, do końca łańcucha, a następnie ostateczne cznaków od początku.

Przykłady:

$ ./rotstr „Witaj świecie!” 5
orld! Witaj w
$ ./rotstr „Testowanie ...” -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr „12345” 0
12345
$ ./rotstr „ABA” 17
BECZEĆ
$ ./rotstr „Witaj świecie!” -16
o świecie! Piekło

To nie działa zgodnie z oczekiwaniami. Kiedy v[2]jest "1", kod po prostu wyświetla ciąg bez żadnych modyfikacji. I tylko "~~~"i "12345"działa. Reszta daje złe wyniki. Gdyby wszyscy obrócili się jeszcze raz, byłoby to zgodne z prawdą.
— Spikatrix

Przetestowałem to z gcc i (z niewielką modyfikacją main(a,v,n)-> n;main(a,v)) clang na Linuksie i działa zgodnie z oczekiwaniami. Do gcc używam wersji 5.1.0 i kompiluję gcc -o rotstr rotstr.c. Z jakiego kompilatora korzystasz?
— CL

Próbowałem też tworzyć nglobalny. Ten sam problem. Kompilowałem za pomocą gcc file.c -o file. Używam GCC 4.8.1 w systemie Windows. Czy w twoim kodzie jest jakieś nieokreślone zachowanie?
— Spikatrix

Wymiana v[2]-v[1]-1z strlen(v[1])może zrobić różnicę, to jedyne miejsce, mogę myśleć o czymś subtelnym dzieje. Niestety nie mam dostępu do komputera z systemem Windows do przetestowania.
— CL

Tak. Kod zadziałał, kiedy to zmieniłem.
— Spikatrix

2

Python 3, 45 bajtów

s=input();n=int(input());print(s[-n:]+s[:-n])

Trzon programu to

s[-n:]+s[:-n]

Cała reszta to po prostu niezdarna praca z I / O.


2
Nie udaje się to w ostatnim ABA 17przypadku testowym i generalnie byłoby|n| > length of string
— Sp3000

jeśli użyjesz n=int(input())%len(s);, to zadziała dla liczb całkowitych większych niż długość łańcucha, ale wymaga 7 dodatkowych znaków
— JPMC

2

K, 8 7 bajtów

{|x!|y}

Istnieje już prymitywna funkcja „rotate” ( !), która wykonuje uogólnienie tej operacji dla list. Ciągi K to listy znaków, więc ma to zastosowanie. Specyfikacja sprzyja jednak nieco CJamowi i Pythowi, ponieważ obrót K obraca się w przeciwnym kierunku do pożądanego. Zawijanie !funkcji i negowanie niejawnego argumentu xzrobi to, co chcemy:

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

Nieco krótsze podejście, sugerowane przez kirbyfan64sos, polega na usunięciu nawiasów i negacji na rzecz odwrócenia string ( |) przed i po rotacji.

Gdyby nie to niedopasowanie impedancji, rozwiązanie byłoby proste

!

Nazywany identycznie:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
Czy odwrócenie struny za pomocą |, obrócenie tego i ponowne odwrócenie przyniosłoby taki sam rezultat? Jeśli tak, możesz odciąć postać.
— kirbyfan64sos

Słuszna uwaga! To powinno działać.
— JohnE

1

Pip, 10 bajtów

Być może można by to jeszcze poprawić. Jednak dla języka bez operatora shift 10 bajtów nie jest złe.

a@_M-b+,#a

Wyjaśnienie:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

To działa, ponieważ ciąg i lista indeksowanie w PIP jest cykliczny: "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 znaków

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

Demo na żywo .

Większość z nich polega na odwróceniu ciągu, jeśli liczba wejściowa jest ujemna. Wykorzystałem fakt, że tylko niektóre znaki ASCII są poprawnymi danymi wejściowymi i wykorzystałem tabulację na swoją korzyść.

Zauważ, że musiałem trochę oszukać: ponieważ rs jest modyfikatorem tekstu w jednym wierszu, musiałem użyć go <number> <text>jako formatu wejściowego.


1

Java, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

Pobiera dane wejściowe za pomocą wiersza polecenia.

dość zabawne, pierwotnie przypadkowo odwróciłem sposób, w jaki sznurek miał być przesunięty. Ale naprawienie tego błędu było krótsze, aby pomnożyć n przez -1, a następnie poprawnie napisać logikę.

rozszerzony:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

Dlaczego masz enum S{; ... }?
— Spikatrix

1
Zdecydowałem się napisać pełny program, ponieważ 9 bajtów tak naprawdę nie miało wielkiego znaczenia. Jest to również przypomnienie, gdy spoglądam wstecz i wolę enum S {; ...} niż klasę S {...}, ponieważ (mimo że zajmują tę samą liczbę bajtów w tym przykładzie), jeśli kiedykolwiek potrzebuję instancji tej klasy zajmuje jeszcze jeden bajt w wersji enum: enum S {X; ...}. Pomaga to, jeśli chcę zadeklarować metodę lub zmienną w klasie bez konieczności używania słowa kluczowego static lub jawnego tworzenia nowego obiektu klasy.
— Jack Ammo

Łał! Ładny. Nigdy nie wiedziałem, że enummożna tego użyć!
— Spikatrix

Wiem, że minęły już dwa lata, odkąd to opublikowałeś, ale możesz zagrać w golfa kilka rzeczy. Integer.parseIntmoże być new Integer(-5 bajtów); i n%=l;można je usunąć, jeśli zmienisz r[0].substring(n)+na r[0].substring(n%=l)+(-2 bajty). Możesz także podać, że jest to Java 6, ponieważ w Javie 7 lub wyższej wyliczenie z main-method nie jest już możliwe.
— Kevin Cruijssen

zbyt leniwy, aby zawracać sobie głowę edycją, ale szczególnie ceniony za oszczędności.
— Jack Ammo



1

Casio Basic, 27 bajtów

StrRotate s,s,-n:Print s

Jak się okazuje, w Casio ClassPad jest wbudowana odpowiednia funkcja! Ale dlatego działa odwrotnie-n .

24 bajty dla kodu, 3 bajty do podania s,njako argumenty.


1

05AB1E , 6 bajtów

DgI+FÁ

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

Ponieważ 05AB1E ma tylko wbudowane funkcje Obróć raz w prawo / lewo , a nie Obróć Nilość w prawo / lewo , pętlę length + inputilość razy i obracam tyle razy w prawo.

Na przykład:

  • „Testowanie ...” i -3 będą się obracać 10 + -3 = 7 w prawo, w wyniku czegoting...Tes .
  • „Witaj świecie”, a 5 będzie obracać 11 + 5 = 16razy w prawo, w wyniku czego worldHello.



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.