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

Spikatrix
źródło

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

Optymalizator
źródło
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
    )
nderscore
źródło
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

Optymalizator
źródło
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
CL-
źródł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.

Klamka
źródł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!"
JohnE
źródło
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".

DLosc
źródł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.

kirbyfan64sos
źródło
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));
    }
}
Jack Ammo
źródło
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

PHP> = 7.1, 88 bajtów (nie konkuruje)

for([,$s,$t]=$argv;$t;)$s=$t<0?substr($s,1).$s[!$t++]:$s[-1].substr($s,!$t--,-1);echo$s;

Przypadki testowe

Jörg Hülsermann
źródło
Dlaczego „niekonkurujący”?
Spikatrix
@CoolGuy Użyta wersja PHP jest budowana po rozpoczęciu pytania
Jörg Hülsermann
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.

NumberManiac
źródło
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.
Kevin Cruijssen
źródło