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
n
jest dodatnia, przenieś znaki w ciągu do właściwychn
czasów. - Jeśli
n
jest ujemne, przesuń znaki w ciągu do lewej stronyn
. - Jeśli
n
wynosi zero, nie przesuwaj znaków w ciągu.
Po przesunięciu (z wyjątkiem, gdy n
wynosi 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
n
moż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ą
stdin
lub 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
stdout
lub 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 golf golfowy , więc wygrywa najkrótsze przesłanie (w bajtach).
JavaScript ( ES5 ),
5552 bajtówSkomentowano:
źródło
CJam, 5 bajtów
To całkiem proste.
Wypróbuj online tutaj
źródło
C, 93 bajty
Bardziej przejrzysta jest wersja argument-funkcja, która została zmodyfikowana, aby uczynić wersję wiersza polecenia-argument
Ten ma tylko 68 bajtów, co po prostu pokazuje, jak niekorzystne jest C przy przetwarzaniu argumentów wiersza poleceń.
Jeżeli przesunięcie,
n
jest dodatnie, tostrlen(s)-n%strlen(s)
jest to przesunięcie, a jeślin
jest ujemne, to jest przesunięcie-n%strlen(s)
. Teprintf
odciski od offsetuc
, do końca łańcucha, a następnie ostatecznec
znaków od początku.Przykłady:
źródło
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ą.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?n
globalny. 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?v[2]-v[1]-1
zstrlen(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.Python 3, 45 bajtów
Trzon programu to
Cała reszta to po prostu niezdarna praca z I / O.
źródło
ABA 17
przypadku testowym i generalnie byłoby|n| > length of string
n=int(input())%len(s);
, to zadziała dla liczb całkowitych większych niż długość łańcucha, ale wymaga 7 dodatkowych znakówK,
87 bajtówIstnieje 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 argumentux
zrobi to, co chcemy: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:
źródło
|
, obrócenie tego i ponowne odwrócenie przyniosłoby taki sam rezultat? Jeśli tak, możesz odciąć postać.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.
Wyjaśnienie:
To działa, ponieważ ciąg i lista indeksowanie w PIP jest cykliczny:
"Hello"@9 == "Hello"@4 == "o"
.źródło
rs , 180 znaków
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.źródło
Java, 167
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:
źródło
enum S{; ... }
?enum
można tego użyć!Integer.parseInt
może byćnew Integer
(-5 bajtów); in%=l;
można je usunąć, jeśli zmieniszr[0].substring(n)+
nar[0].substring(n%=l)+
(-2 bajty). Możesz także podać, że jest to Java 6, ponieważ w Javie 7 lub wyższej wyliczenie zmain
-method nie jest już możliwe.PHP> = 7.1, 88 bajtów (nie konkuruje)
Przypadki testowe
źródło
Japt , 2 bajty
Wypróbuj online
źródło
Casio Basic, 27 bajtów
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,n
jako argumenty.źródło
05AB1E , 6 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Ponieważ 05AB1E ma tylko wbudowane funkcje Obróć raz w prawo / lewo , a nie Obróć
N
ilość w prawo / lewo , pętlęlength + input
ilość razy i obracam tyle razy w prawo.Na przykład:
10 + -3 = 7
w prawo, w wyniku czegoting...Tes
.11 + 5 = 16
razy w prawo, w wyniku czegoworldHello
.źródło
Julia 0.6 , 31 bajtów
Wypróbuj online!
źródło
Stax , 2 bajty
Uruchom i debuguj
źródło
Perl 5 +
-palF
, 26 bajtówWypróbuj online!
źródło