Przekręcanie słów!
Podany ciąg i dodatnia liczba całkowita. Musisz przekręcić sznurek, tam iz powrotem.
Przykład wejścia / wyjścia
Wkład
Programming Puzzles & Code Golf
4
Wydajność
Prog
mmar
ing
zzuP
les
oC &
de G
flo
Wkład
Dane wejściowe mogą być pobierane przez STDIN lub argument funkcji. Dane wejściowe będą składać się z łańcucha i dodatniej liczby całkowitej, n . Liczba całkowita określa długość każdej skręconej linii.
Sznurek jest skręcony tam iz powrotem. Dane wejściowe HELLO, WORLD!
i 5 wyglądałyby następująco:
Wydajność
Wynikiem będzie skręcony tekst. Może nie zawierać żadnych spacji. Jeśli wejściowa długość ciągu nie jest podzielna przez długość linii, dodaj spację, aż linia zostanie wypełniona:
Przykład tego:
Wkład
Hello, World!
5
Dane wyjściowe (zwróć uwagę na białe znaki na samym końcu)
Hello
roW ,
ld!
Odpowiedzi:
Pyth,
1915Wstępnie wypełnia ciąg, a następnie odwraca linię podczas drukowania. Dopełnienie jest równe rozmiarowi pudełka, ale ostatni wiersz po pocięciu wejścia jest odrzucany.
Wypróbuj tutaj
źródło
CJam, 19 bajtów
Przykład wprowadzania:
Objaśnienia
źródło
Snowman 1.0.1 , 91 bajtów
Lub wszystko w jednym wierszu (w przypadku estetyki, a dokładniej antyestetyki), kosztem 2 bajtów:
Jest to o wiele za krótko, jak na Bałwana. (Jest to jednak prawdopodobnie najkrótszy możliwy; grałem w golfa dość długo).
Ma to jedno zastrzeżenie: zakończy się z błędem (ale nadal będzie generować prawidłowe wyjście) w 50% przypadków, gdy ostatni wiersz nie zostanie odwrócony. (Jest tak, ponieważ używam
ag
do grupowania elementów tablicy w grupy po dwie, aby móc odwrócić każdy inny, ale nie sprawdzam, czy ostatni element ma oba oczekiwane elementy, więc spróbuje uzyskać dostęp do nieistniejącego elementu, jeśli liczba linii jest nieparzysta).Nieskluczone / wyjaśnienie:
źródło
Python 2, 60
Pobiera
n
postacie od początkus
, drukując je w kierunku nad
przemian między1
i-1
. Aby wstawić odstępy w ostatnim wierszu,s
jest on wypełnianyn
spacjami na końcu, zanim zostanie pocięty, co wpływa na to tylko wtedy, gdy ma mniej niżn
znaków.Rozwiązanie rekurencyjne uratowałoby znak (59), z tym wyjątkiem, że pozostawia on końcowy znak nowej linii, co jest niedozwolone.
źródło
Haskell ,
8375 bajtówProsta
chunksOf
implementacja z funkcją „bierz i upuszczaj”, stosując do wyjścia parzystą lub nieparzystą liczbę zwrotów.Dzięki @BMO za pięć bajtów i @ ØrjanJohansen za trzy bajty!
Wypróbuj online!
źródło
cycle
zapisanych 5 bajtów, spróbuj online!g
i wymieniającn
il
: Wypróbuj online!Utknął ,
42414038 bajtówTo trochę za długo, prawdopodobnie postaram się więcej zagrać w golfa!
Dane wejściowe powinny być jak
"string"|n
.Wyjaśnienie:
źródło
Haskell, 108 bajtów
To trochę długie, Jezu. Oto jest w akcji:
źródło
let
wyrażenia?let
instrukcja dwa w jednym oddzielona średnikiem - zwykle używasz znaków nowej linii i wcięć, ale Haskell pozwala także na pisanielet a=b; c=d in expr
.(%) :: String -> String -> String
zamiastIO ()
.Python 2, 109 bajtów
Musiałem dodać dopełnienie ze spacjami, aby ostatni wiersz był poprawny.
Wypróbuj tutaj
źródło
Lua,
918888848382 bajtówStara wersja:
Nowa wersja:
źródło
O, 60 bajtów
Mój pierwszy program O, i to długi!
Demo na żywo.
źródło
Perl, 87 bajtów
Stara wersja (drukuje końcowy znak nowej linii):
Ciąg jest przekazywany jako argument funkcji bez końcowego znaku nowej linii. Zadzwoń tak:
źródło
Świnka, 86 bajtów
Chociaż usunięcie pierwszego „,!” Może być o 2 bajty krótsze. znaki w instrukcji R (odczytane ze STDIN); który dodaje znak powrotu karetki między wejściem a wyjściem. Gdyby tego nie było, dane wyjściowe są technicznie poprawne, ale pierwszy wiersz pojawiłby się w łańcuchu wejściowym. [[Standardowy terminal Mumpa, którego używam, nie ma lokalnego echa. ]] Na miejscu jest test:
Zauważ również, że faktycznie istnieje klawisz powrotu karetki / Enter pomiędzy „123” a „6” na końcu wejścia. [[Lokalne echo ponownie. ]]
Jeśli ktoś jest zainteresowany, mogę opisać, co się dzieje z kodem; ale zdaję sobie sprawę, że nie ma tam wielu entuzjastów świnki ... :-)
źródło
PowerShell, 102 bajty
Wywoływany w następujący sposób (jeśli zapisany w pliku
CodeGolf55051.ps1
)Poprzednie próby
(dłuższy lub nieprawidłowy)
PowerShell, 110 bajtów
PowerShell, 111 bajtów
Wyjaśnienie
PowerShell, 180 bajtów
PowerShell, 196 bajtów
Wyjaśnienie
(
{...}
w powyższych komentarzach jest tak naprawdę{0}|{1}|{2}
; postawiam{...}
na lepszą czytelność.PowerShell, 120 bajtów (nieprawidłowy)
źródło
param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}
które doprowadzi cię do 108.[$r]
indeks końcowy na[-not$r]
... w przeciwnym razie pierwsza linia odczytuje odwrotność (tj. Od prawej do lewej) niż w podanych przykładach. W przeciwnym razie naprawdę szybkie wykonanie!n
jest dodatnia, i mamy gwarancję, że długość łańcucha nie jest ujemna (z definicji), co oznacza, że(($i-$l%$i)%i)
jest to równoważne z($i-$l%$i)
zapisaniem czterech znaków.(-$l)%$i
. Nie wiem skąd to się wzięło. Interesujące jest jednak to, że nie jest to równoważne, chociaż powinno być. To najwyraźniej dziwactwo tego, jak PowerShell (między innymi językami) implementuje funkcję modulo, która różni się od tego, czego oczekiwałem ja (jako matematyka) lub Wolfram-Alpha. Najwyraźniej będziesz musiał trzymać się dłuższej wersji. Referencyjny dowód ->((y-x%y)%y) ==> ((y%y)-(x%y%y))%y ==> ((0)-(x%y))%y ==> (-x%y)%y ==> (-x)%y
Clojure, 83 bajty,
87 bajtów,79 bajtówkilka poprawek po komentarzach poniżej, dziękuję Ørjan .
Wypróbuj online!
Clojure wydaje się często niestety nieobecny w odpowiedziach na golfa z kodem. Z pewnością nie może konkurować długością bajtów z językami golfowymi, ale myślę, że całkowita nieobecność jest nieco nieuzasadniona.
Wyjaśnienie:
s
dzieląc go na sekwencję list znaków, których listy mają długośćn
. Ostatnia porcja zostanie wypełniona spacjami na długośćn
za pomocą zwróconej „kolekcji padów”, z(repeat " ")
której zwraca nieskończoną leniwą sekwencję spacji#(..)
)#(or %)
która działa jak funkcja tożsamości i odwrotna (tj.[#(or %) reverse #(or %) reverse ...]
) zwracana przez cykl .#(apply ...)
:identity
lubreverse
naprzemiennie na fragmencie. Odbywa się to za pomocą(% %2)
wyrażenia, które wywołuje funkcję wysłaną jako pierwszy argument do funkcji anonimowej [tj.identity
Lubreverse
] przy użyciu drugiego argumentu [tj. Porcji] do funkcji anonimowej jako argumentu wywołania.(apply str ...)
aby przekonwertować listę znaków na ciąg znakówjedną sztuczką, której tu używamy, jest to, że wiele funkcji clojure, takich jak
map
przyjmowanie dowolnej liczby zbiorów jako argumentów, tj.(map f coll1 coll2 coll3 ...)
gdy funkcja f musi zaakceptować tyle argumentów, ile jest zbiorów. W tym przypadku wysyłamy dwie kolekcje, kolekcję naprzemiennych odwołań do funkcji i podzielony ciąg.źródło
ld!
.fn
lubdefn
jest w porządku.) Z drugiej strony twoja funkcja może po prostu zwrócić wynik, zamiast go wydrukować.APL (Dyalog Unicode) , 19 bajtów
Wypróbuj online!
Wziął
⊢∘⌽\
sztuczkę z genialnej odpowiedzi NNG na wyzwanie boustrophedonise .Po uświadomieniu sobie, że moje przesyłanie zrywa z liniami z wiodącymi nowymi liniami, dodałem jeszcze dwa bajty. Poniżej znajduje się starsze zgłoszenie.
APL (Dyalog Unicode) , 17 bajtów
Wypróbuj online!
źródło
Python 3,
110108107103 bajty(patrząc na inne odpowiedzi), z
rjust
:95939290 bajtówźródło
PHP, 135 bajtów
Pobiera dwa argumenty wiersza polecenia, jak pokazano za pomocą
$argv
.źródło
CoffeeScript, 131 bajtów
To wydaje się za długie.
źródło
Julia, 104 bajty
Nie golfowany:
źródło
Python 3, 101 bajtów
Wypróbuj tutaj
źródło
q, 46
.
źródło
{-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}
(49 bajtów). Dzięki za inspirację! :)Q,
6456 bajtów{}
to funkcja, którą należy wywołać jako{}[x;y]
.x
będzie ciąg.y
będzie długością wynikowych linii.Test:
edycja : Użyto krótszych funkcji inspirowanych inną q odpowiedzią @tmartin
źródło
Python 2,
8275 bajtówNie mogłem skomentować @willem, ale zmniejszyłem jego kod.
Spróbuj tutajSpróbuj tutajźródło
Perl, 72 bajty
70 bajtów plus 2 bajty dla
-p0
.Próbny:
Zauważ, że dane wejściowe odczytane ze STDIN nie mogą kończyć się nową linią (to kosztuje 2 dodatkowe bajty).
Wyjaśnienie:
źródło
JavaScript ES6, 123 bajty
Wywołaj za pomocą
t(input_string, twist_length)
, która zwraca ciąg wyjściowy.źródło
Perl 5 , 51 bajtów
Wypróbuj online!
źródło
Ruby, 80
Demo online: http://ideone.com/w6o8PI
źródło
Coffeescript, 151 bajtów
Za dużo = (
źródło
Bash,
8374Dzieje się to naprzemiennie między
cat
irev
dla podciągów pierwszego argumentu o długości drugiego argumentu.Zastosowane specjalne zmienne obejmują
${#1}
(długość łańcucha$1
)((i/$2%2))
(wyrażenia arytmetycznego podzielenie incrementor$i
przez$2
czym przy jego modulo aby określić kurs vs parzysty, co podyktowane czy po użyciurev
)${1:i:$2}
(substring$1
rozpoczynania od pozycji$i
o długości$2
).źródło
bash
odpowiedzi, którą dopiero co widziałem. Mamy efektywnie tę samą logikę. ... właściwie odpowiedź viktorahlström pozwoliła mi zgolić kolejne 9 znaków.JavaScript ES6, 113 bajtów
Tylko mój trzask na własne pytanie. Dodają spacje, dzięki czemu można je podzielić
n
, w ten sposób po prostu dzielą się i cofają.źródło