Flippign Lettesr Aroudn

33

Na czacie, jesteśmy często fast-typerów i tak naprawdę nie wyglądają w porządku z literami przed wysłaniem wiadomości. Ponieważ jesteśmy leniwi, potrzebujemy programu, który automatycznie zamienia dwie ostatnie litery w naszych słowach, ale ponieważ nie chcemy odpowiedzieć zbyt późno, kod musi być krótki.

Twoim zadaniem, jeśli chcesz je zaakceptować, jest napisanie programu, który odwraca dwie ostatnie litery każdego słowa w danym ciągu (tak więc słowo Thanskzamienia się w Thanks). Słowo to sekwencja dwóch lub więcej liter alfabetu angielskiego ograniczonej przez pojedynczego miejsca.

  • Ciąg / lista znaków otrzymywanych jako dane wejściowe gwarantuje, że zawierają tylko znaki alfabetu i spacje (ASCII [97–122], [65–90] i 32).

  • Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe za pomocą dowolnej standardowej metody , w dowolnym języku programowania , zwracając uwagę, że te luki są domyślnie zabronione.

  • Dane wyjściowe mogą mieć jedną końcową spację i / lub jedną końcową nową linię.

  • Dane wejściowe zawsze będą zawierać tylko słowa (i odpowiadające im białe znaki) i będą zawierać co najmniej jedno słowo.

To jest golf golfowy, więc wygrywa najkrótsze zgłoszenie (w bajtach), w każdym języku!

Przypadki testowe

Zauważ, że ciągi są otoczone cudzysłowami dla czytelności.

Wejście -> Wyjście

„Thansk” -> „Thanks”
„Youer welcoem” -> „Youre welcome”
„This is a apple” -> „Thsi si na appel”
„Flippign Lettesr Aroudn” -> „Flipping Letters Around”
„ODD CHALLENEG Z SWAPDE LETRES” -> „TE ODD CHALLENGE Z WYMIENIONYMI LITERAMI”

Lub, dla wygody zestawu testów, tutaj osobno wejścia i odpowiadające im wyjścia:

Thansk
Witaj
To jest jabłko
Flippign Lettesr Aroudn
ODD CHALELEEG Z SWAPDE LETRES
Dzięki
Nie ma za co
To jest appel
Przerzucanie liter
CHODZI ODD CHALENGE Z WYMIENIONYMI LITERAMI

Dzięki DJMcMayhem za tytuł. To był pierwotnie CMC .

Pan Xcoder
źródło
Czy możemy wypisać tablicę słów?
Kudłaty
@Shaggy Nie, wyjście musi być łańcuchem (lub domyślnie listą znaków)
Mr. Xcoder
Czy możemy poprosić o końcowe miejsce na każdym wejściu?
FlipTack,
@FlipTack To było dozwolone w początkowej wersji, ale usunąłem tę regułę przed każdą z opublikowanych odpowiedzi, które mogłyby jej użyć. (częściowo dlatego, że niektórzy użytkownicy czatu powiedzieli mi, że w przeciwnym razie robię to zbyt łatwo i zgadzam się z nimi). Nie, to niedozwolone.
Pan Xcoder,
1
@Fabian Słowo to ciąg dwóch lub więcej liter
Pan Xcoder

Odpowiedzi:

16

V , 4 5 bajtów

òeXp

Wypróbuj online!

|| oznacza kursor

Bufor zaczyna się od, |w|ord and more wordsa kursor znajduje się na pierwszym znaku.

Rekurencyjnie ò

przejdź do edrugiego słowa

wor|d| and more words

usuń Xznak po lewej stronie kursora

wo|d| and more words

pzatrzymaj to nad kolejną postacią

wod|r| and more words

Niejawne zakończenie ò, powtarzaj ten sam proces dla innych słów, aż do osiągnięcia końca bufora

Kritixi Lithos
źródło
2
Właściwy język dla zadania :)
DJMcMayhem
Masz na myśli „Wielokrotnie” zamiast „Rekurencyjnie”?
NieDzejkob
@NieDzejkob V wiki używa słowa „rekurencyjnie” do opisania òpolecenia github.com/DJMcMayhem/V/wiki/Normal-Mode-Commands
Kritixi Lithos
10

Galaretka , 7 bajtów

Ḳœ?@€2K

Monadyczny link pobierający i zwracający listy znaków

Wypróbuj online!

W jaki sposób?

Ḳœ?@€2K - Link: list of characters
Ḳ       - split at spaces
     2  - literal two
    €   - for €ach:
   @    -   with sw@pped arguments:
 œ?     -     nth permutation (the 2nd permutation has the rightmost elements swapped)
      K - join with spaces
Jonathan Allan
źródło
To miłe nadużycie permutacji. Alternatywa
Pan Xcoder,
@ Mr.Xcoder Ḳ2œ?ЀKdziała również i używa jednego szybkiego.
Dennis
7

Brain-Flak , 122 bajty

{(({})[((((()()){}){}){}){}])((){[()](<{}>)}{}){{}<>(({}({}))[({}[{}])])(<>)}{}({}<>)<>}<>(({}({}))[({}[{}])]){({}<>)<>}<>

Wypróbuj online!

Najgorszy język do pracy :)

Czytelna Nieco bardziej czytelna wersja:

{
    (({})[((((()()){}){}){}){}])((){[()](<{}>)}{})

    {
        {}
        <>

        (({}({}))[({}[{}])])

        (<>)
    }
    {}

    ({}<>)<>

}<>

(({}({}))[({}[{}])])

{

    ({}<>)
    <>
}<>
DJMcMayhem
źródło
Nie mogę uwierzyć, że jest to dłuższe niż wersja Brainfuck ...
Pureferret
@pureferret Flak mózgowy jest zwykle dłuższy niż pieprzenie mózgu. Głównie dlatego, że wymaga dwóch bajtów na prymitywną komendę, przy czym uderzenie mózgu wymaga dwóch.
DJMcMayhem
7

Haskell , 40 bajtów

(f=<<).words
f[a,b]=b:a:" "
f(x:r)=x:f r

Wypróbuj online! Przykład użycia: (f=<<).words $ "abc xyz"plony "acb xzy ".

Laikoni
źródło
Więc mówisz mi, że najkrótsze podejście polega na połączeniu obu podejść? > _ <
totalnie ludzki,
6

Python 3 , 50 bajtów

print(*(w[:-2]+w[:-3:-1]for w in input().split()))

Wypróbuj online!

Ta odpowiedź narusza zachowanie drukowania w Pythonie 3: Wiele argumentów jest drukowanych z pojedynczą spacją między nimi. Oczywiście nie możemy po prostu podać wielu argumentów, ponieważ nie wiemy, ile słów będzie na wejściu. Więc używamy operatora ikona . Gruntownie

print(*[a,b,c])

jest dokładnie taka sama jak

print(a,b,c)

Nadużycie, które powoduje, że pełny program okazuje się krótszy niż funkcja / lambda, w której musielibyśmy użyć ' '.joinlub coś podobnego.

DJMcMayhem
źródło
Wygląda na to, że Python 2 zapisuje 2 bajty, pisząc for w in input().split():print w[:-2]+w[:-3:-1],. W Pythonie 3 wyodrębnienie dwóch ostatnich znaków działałoby dobrze, z print(*(''.join(a)+c+b for*a,b,c in input().split()))wyjątkiem tego, że anależy przekształcić w ciąg znaków.
xnor
5

Matlab (R2016b), 51 50 bajtów

Zaoszczędź 49 50 (!) Bajtów dzięki @Giuseppe.

function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')

I moja poprzednia odpowiedź:

Matlab (R2016b), 100 bajtów

(Dla zabawy: P)

function s(a),a=regexp(a,' ','split');for i=1:length(a),fprintf('%s ',a{i}([1:end-2 end end-1])),end

Wyjaśnienie:

function s(a) % Defining as a function...
a=regexp(a,' ','split'); % Splits the input string at the spaces
for i=1:length(a) % Loops through each word
    fprintf('%s ',a{i}([1:end-2 end end-1])) % And prints everything with the last two characters swapped.
end
Thiago Oleinik
źródło
1
słowa składające się z jednego znaku nie mogą się zdarzyć, ponieważ słowo jest zdefiniowane jako co najmniej dwa znaki.
Giuseppe,
będzie regexpreptu pracować? Coś takiego regexprep(a,'(\w*)(\w)(\w)','\1\3\2')?
Giuseppe,
D = To. Było. Epicki! Myślę, że powinieneś opublikować tę odpowiedź, ponieważ jest ona całkowicie inna od mojej. Jedyną rzeczą jest to, że Matlab odwołuje się do dopasowań $1, a nie \1, więc tak by było regexprep(a,'(\w*)(\w)(\w)','$1$3$2').
Thiago Oleinik,
1
powinieneś opublikować go jako osobną odpowiedź / w tej odpowiedzi; zawsze dobrze jest sprawdzić, czy wyrażenie regularne pomogłoby w wyzwaniu łańcuchowym! Poza tym najwyraźniej nie rozumiem silnika wyrażeń regularnych MATLAB, więc nie byłoby w porządku, żebym wziął za to zasługę.
Giuseppe,
1
function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')to kolejny bajt krótszy!
Giuseppe
5

C,  62   58  54 bajtów

Dzięki @Dennis za zapisanie  czterech  ośmiu bajtów!

f(char*s){s[1]>32||(*s^=s[-1]^=*s^=s[-1]);*++s&&f(s);}

Wypróbuj online!

Steadybox
źródło
ah, swap oparty na xor
Snowbody
4

Prolog (SWI) , 60 bajtów

[A,B]+[B,A].
[A,B,32|U]+[B,A,32|Y]:-U+Y,!.
[A|U]+[A|Y]:-U+Y.

Wypróbuj online!

Wyjaśnienie

Najpierw określamy przypadek podstawowy:

p([A,B],[B,A]).

Oznacza to, że dwie ostatnie litery zawsze będą zamieniane.

Następnie określamy, co się stanie, jeśli znajdziemy się tuż obok miejsca:

p([A,B,32|U],[B,A,32|Y]):-p(U,Y),!.

Dwa ciągi pasują do siebie, jeśli tuż przed spacją litery są zamieniane, a reszta, jeśli pasują do siebie. Następnie używamy !do cięcia.

Naszym ostatnim przypadkiem jest to, że jeśli nie znajdujemy się obok spacji, dwie pierwsze litery muszą się zgadzać.

p([A|U],[A|Y]):-p(U,Y).
Kreator pszenicy
źródło
4

Wolfram Language , 117 bajtów

StringReplace[RegularExpression["\\b[[:alpha:]]{2,}\\b"]:>StringDrop[StringInsert["$0",StringTake["$0",{-1}],-3],-1]]

Wypróbuj online!

Stosowany do ciągów testowych.

StringReplace[
  RegularExpression["\\b[[:alpha:]]{2,}\\b"] :> 
   StringDrop[StringInsert["$0", StringTake["$0", {-1}], -3], -1]] /@
 {"Thansk", "Youer welcoem", "This is an apple", 
  "Flippign Lettesr Aroudn", "tHe oDd chALlEneg wiht swappde lettesR"} // Column
Thanks
Youre welcome
Thsi si na appel
Flipping Letters Around
teH odD chALlEnge with swapped letteRs
Edmund
źródło
4
Witamy w PPCG!
Steadybox
@Steadybox Thanks.
Edmund,
4

R , 111 51 41 bajtów

Dzięki uprzejmości @Giuseppe, metody wyrażenia regularnego, która wyrzuca moją starą metodę z wody.

cat(gsub("(.)(.)\\b",'\\2\\1',scan(,"")))
rturnbull
źródło
1
Wyrażenia regularne są tutaj znacznie wydajniejsze: Wypróbuj online!
Giuseppe,
(nie, że nie doceniam odwagi potrzebnej do wykonania czystego podejścia do manipulowania strunami w R)
Giuseppe
@Giuseppe Wow, dobra robota! Zredagowałem je w mojej odpowiedzi, choć jeśli wolisz, abyś sam udzielił odpowiedzi, śmiało!
rturnbull
1
nie martw się o to. Grałem w golfa o kolejne 10 bajtów: przeniesienie innego podejścia wyrażenia regularnego i 70 bajtów twojego starego podejścia
Giuseppe
4

APL (Dyalog Classic) , 28 bajtów

1↓∊((¯2↓⊢),2↑⌽)¨' '(,⊂⍨⊣=,)⍞

⎕MLi ⎕IOto zarówno 1,

Wypróbuj online!

Wyjaśnienie

  • ... (,⊂⍨⊣=,) ... Podziel (zachowując granice i dodając granicę na początku) ...
  • ... ⍞ ... wejście ...
  • ... ' ' ... ... w kosmosie.
  • ... ( ... )¨ ... Następnie do każdego elementu tego:
    • ... , ... Połącz ...
    • ... (¯2↓⊢) ... ... każdy element oprócz dwóch ostatnich ...
    • ... 2↑⌽ ... ... z odwrotnością dwóch ostatnich elementów.
  • 1↓∊ ... Na koniec zwróć wszystko oprócz pierwszego elementu spłaszczonego wyniku.
Zacharý
źródło
zwróć wszystkie oprócz pierwszego
Adám
3

Haskell , 45 bajtów

-2 bajty dzięki H.PWiz.

(r.g.r=<<).words
g(x:y:z)=' ':y:x:z
r=reverse

Wypróbuj online!

całkowicie ludzki
źródło
3

J , 20 19 11 bajtów

Podziękowania dla @Bolce Bussiere

1&A.&.>&.;:

Wypróbuj online!

       &.;:      on words
    &.>          on each
  A.             apply the permutation
1&               number 1, swap the last two elements
FrownyFrog
źródło
1
13 bajtów z(1&A.&.>)&.;:
Bolce Bussiere
@BolceBussiere perfect
FrownyFrog
Czy możesz dodać wyjaśnienie? Zastanawiam się, czy mogę przenieść go do K, aby zmniejszyć krępującą liczbę bajtów mojego rozwiązania!
streetster
3

Alice , 24 bajty

/0RR'.%$1\' o
\ix*o ne@/

Wypróbuj online!

Wyjaśnienie

/...\' o
\.../

Tworzy to pętlę, w której ciało pętli jest liniowym fragmentem porządkowym, i wykonujemy ' ow trybie kardynalnym między każdą dwiema iteracjami pętli. Ten ostatni po prostu drukuje przestrzeń.

Po rozwinięciu zygzakowatej struktury kodu porządkowego, liniowy korpus pętli wygląda tak:

iR*' %e10xRo.n$@

Podział tego:

i     Read all input. On subsequent iterations, this will push an empty string.
R     Reverse.
*     Join. On the first iteration, this joins the input to an implicit empty string,
      which does nothing. On subsequent iterations, it will join the empty string to
      the word on top of the string, thereby getting rid of the empty string.
' %   Split around spaces. On the first iteration, this will split the input
      into individual words. On subsequent iterations, this does nothing.
e10   Push "10".
x     Use this to permute the (reversed) word on top of the stack. In
      particular, the word is rearranged with the same permutation that is
      required to sort the string "10", which means the first two letters
      get swapped (which correspond to the last two letters of the actual
      word).
R     Reverse the swapped word.
o     Print it.
.n$@  If there are no words left on the stack, terminate the program.
Martin Ender
źródło
Zauważyłem, że zamiana liter może odbywać się w trzech bajtach ( h~Z) zamiast w czterech ( e10x), ale nie widzę sposobu na dostosowanie układu, aby faktycznie zaoszczędzić bajt.
Martin Ender
2

pieprzenie mózgu , 109 100 bajtów

Edycja: nie musisz obsługiwać słów z jedną literą

,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[->>+<<]>[[-<+>]>]<<[>+>+>]-<]>>>>>>>[.>]

Wypróbuj online!

Drukuje spację końcową

Jak to działa

,[>++++[-<-------->],] Puts input on the tape and subtracts 32 from each character
                       This separates each word

>+[- Start the loop
   <[>++++[<++++++++>-]<[->>+<<]<] Add 32 to each letter of the word
                                   Skip this on the first iteration for the last word

   <<[->>+<<]>[[-<+>]>] Swaps the last two letters of the word
   <<[>+>+>]- If there is another word to the left continue loop
              Also set up to add a space to the end of the word
 <] End loop
 >>>>>>>[.>] Print the modified string

Poprzednia wersja, 109 bajtów

,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[[->>+<<]>[[-<+>]>]<<[<]]>[>]<[>+>+>]-<]>>>>>>[.>]

Wypróbuj online!

Jo King
źródło
1

PHP , 119 107 bajtów

Edycja: dzięki całkowicie ludzkiej

<?php foreach(explode(" ",trim(fgets(STDIN)))as$w)echo substr($w,0,strlen($w)-2).strrev(substr($w,-2))," ";

Wypróbuj online!

Zerquix18
źródło
1
Nie możesz zrobić $wordnazwy zmiennej jednoznakowej?
całkowicie ludzki,
@totallyhuman Yup! Napisałem pełną wersję, a następnie ją skompresowałem, ale tego nie zauważyłem. Dzięki Ci.
Zerquix18,
Otwarte znaczniki PHP można pominąć w odpowiedzi, oszczędzając Ci 6 bajtów.
Daniel W.
Zastanawiam się, czy fgets(STDIN)można je pominąć lub zastąpić $x, tak jak nie wszystkie odpowiedzi liczą dane wejściowe do ich odpowiedzi
Daniel W.
trim()powinno być niepotrzebne.
Tytus
1

Haskell , 41 bajtów

foldr(%)" "
a%(b:' ':r)=b:a:' ':r
a%s=a:s

Wypróbuj online!

Wyjścia z końcową spacją.

Powtarzające się ' ':rwygląda na marnotrawstwo. Ale a%(b:t@(' ':r))=b:a:tma tę samą długość i a%(b:t)|' ':_<-t=b:a:tjest o jeden bajt dłuższy.


Haskell , 41 bajtów

f(a:b:t)|t<"A"=b:a:f t|1>0=a:f(b:t)
f e=e

Wypróbuj online!

xnor
źródło
1

sed , 20 17 + 1 (-r) = 18 bajtów

s/(.)(.)\b/\2\1/g

Wypróbuj online!

Noskcaj
źródło
Łącze TIO nie pasuje do opublikowanego kodu. Łącze TIO jest kilka bajtów dłuższe.
Xcali,
Ups, naprawiono link
Noskcaj,
Możesz usunąć |$. Nic nie robi. (Aby zrobić to, czego oczekujesz, będziesz potrzebować (.)(.)(\b|$), ale nie jest to konieczne, ponieważ \bjuż pasuje do końca łańcucha.)
Jordan
Ups, chciał się tego pozbyć. Dzięki,
Noskcaj,
1

PHP, 65 bajtów

wymaga PHP 7.1 (lub nowszego)

for(;$s=$argv[++$i];$s[-1]=$s[-2],$s[-2]=$c,print"$s ")$c=$s[-1];

przyjmuje zdanie jako osobne argumenty wiersza poleceń. Uruchom z -nr.


praca na pojedynczym ciągu, 77 + 1 bajtów :

foreach(explode(" ",$argn)as$s){$c=$s[-1];$s[-1]=$s[-2];$s[-2]=$c;echo"$s ";}

Uruchom jako potok z -nR.


... lub wypróbuj je online .

Tytus
źródło
1

Java 8, 35 bajtów

s->s.replaceAll("(.)(.)\\b","$2$1")

Port odpowiedzi na Arkusze Google @TaylorScott , po tym jak grałem w golfa dwa bajty. EDYCJA: Widzę, że jest to teraz port odpowiedzi Retina Neila po moich dwóch golfed bajtów.

Wyjaśnienie:

Wypróbuj online.

s->                           // Method with String as both parameter and return-type
   s.replaceAll("(.)(.)       //  Replace any two characters,
                       \\b",  //  with a word-boundary after it (space or end of String)
                "$2$1")       //  With the two characters swapped
Kevin Cruijssen
źródło
1

Arkusze Google, 33 bajty

Anonimowa funkcja arkusza roboczego, która pobiera dane wejściowe z komórki A1i dane wyjściowe do komórki wywołującej

=RegExReplace(A1,"(.)(.)\b","$2$1

-2 bajty Dzięki @KevinCruijssen za korzystanie z (.)over(\w)

Taylor Scott
źródło
Oba (\w)można zagrać w golfa, (.)jeśli się nie mylę. Jest \bto już wskazówka, aby szukać tylko słów. (Nie do końca jednak pewne, ale działa w Javie.)
Kevin Cruijssen
@KevinCruijssen - Masz całkowitą rację, może być. Dziękuję Ci!
Taylor Scott
1

JavaScript (Node.js) , 38 36 32 bajtów

s => s.replace (/ (.) (.) (| $) / g, „$ 2 $ 1 $”) 
s=>s.replace(/(.)(.)\b/g,"$2$1")

Wypróbuj online!

Podejście do RegExp dzięki uprzejmości @Giuseppe (chociaż myślałem o tym niezależnie), zakładając, że słowa są oddzielone tylko jedną spacją

-2 za rozważenie tylko 1 spacji i dodanie spacji końcowej

-4 Dzięki @Shaggy

Shieru Asakoto
źródło
Myślę, że nie ma znaczenia, czy jest więcej przestrzeni
l4m2
@ l4m2 Ale jeśli jest więcej miejsc, to będzie to 38 za s=>s.replace(/(.)(.)( +|$)/g,"$2$1$3").
Shieru Asakoto,
@ l4m2 BTW moją oryginalną odpowiedzią byłos=>s.replace(/(.)(.)(\s|$)/g,"$2$1$3")
Shieru Asakoto
ab abc abcd abcde abcdef Czy ab_, bc_, cd_, de_, ___, ef_,___
l4m2
1
F=s=>s.replace(/(.)(.)(?!\w)/g,"$2$1")ta sama długość
l4m2
1

K (oK) , 23 22 bajtów

" "/{x@prm[!#x]1}'" "\

Wypróbuj online!

Przykład:

" "/{x@prm[!#x]1}'" "\"Hello World"
"Helol Wordl"

Wyjaśnienie:

Rozwiązanie Port of FrownyFrog w celu zaoszczędzenia 1 bajtu .

Wrócę do tego.

" "/{prm[x]1}'" "\ / the solution
              " "\ / split input on " "
    {       }'     / apply lambda to each
     prm[x]        / permute input x
           1       / and take the 2nd result
" "/               / join with " "

Poprzednie rozwiązanie:

  • " "/-2{(x_y),|x#y}'" "\ 23 bajty
streetster
źródło
1

05AB1E , 7 bajtów

#vy`sðJ

Wypróbuj online!

-1 dzięki Magicznej Ośmiornicy Urn .

Drukuje jedną spację końcową.

Erik the Outgolfer
źródło
This is 11 bytes
Daniel W.
2
@DanFromGermany No, 05AB1E has a code page in which this can be represented as 8 bytes.
Erik the Outgolfer
Can you run the program represented in 8 bytes?
Daniel W.
@DanFromGermany Yes, the 05AB1E interpreter can run this program from a file in the 05AB1E encoding.
Erik the Outgolfer
1
@MagicOctopusUrn It's not a list though, it's after `.
Erik the Outgolfer
0

SNOBOL4 (CSNOBOL4), 136 119 bytes

	I =INPUT
B	I SPAN(&LCASE &UCASE) . Y ARBNO(' ') =:F(O)
	Y RPOS(2) REM . Z =REVERSE(Z)
	O =O Y ' '	:(B)
O	OUTPUT =O
END

Try it online!

Prints with a trailing space. You know you've done something wrong when a language is a backronym for StriNg Oriented and symBOlic Language and your code is longer than Brain-Flak :( now it's slightly better.

Line B takes I and replaces (alphabetic characters saved as Y)(some number of spaces) with the empty string.

The following line extracts the last 2 characters of Y as Z and replaces them as Z reversed, then the next line concatenates O, Y, and a single space character.

Finally, it prints when I no longer matches the required pattern in line B.

Giuseppe
źródło