Flippign Lettesr Aroudn

33

Di chat, kita sering cepat-typers dan tidak benar-benar melihat urutan dari huruf sebelum posting pesan. Karena kita malas, kita membutuhkan program yang secara otomatis menukar dua huruf terakhir dengan kata-kata kita, tetapi karena kita tidak ingin merespons terlalu terlambat, kodenya harus pendek.

Tugas Anda, jika Anda ingin menerimanya, adalah menulis program yang membalik dua huruf terakhir dari setiap kata dalam string yang diberikan (sehingga kata Thanskberubah menjadi Thanks). Sebuah kata adalah urutan dua atau lebih huruf dalam alfabet bahasa Inggris yang dibatasi oleh satu spasi.

  • String / daftar karakter yang Anda terima sebagai input dijamin hanya berisi karakter dan spasi alfabet (ASCII [97 - 122], [65 - 90] dan 32).

  • Anda dapat mengambil input dan memberikan output melalui metode standar apa pun , dalam bahasa pemrograman apa pun , sambil memperhatikan bahwa celah ini dilarang secara default.

  • Output mungkin memiliki satu trailing space dan / atau satu trailing newline.

  • Input akan selalu berisi kata-kata saja (dan spasi yang sesuai) dan akan terdiri dari setidaknya satu kata.

Ini adalah kode-golf, jadi pengiriman terpendek (skor dalam byte), dalam setiap bahasa menang!

Uji kasus

Perhatikan bahwa string dikelilingi dengan tanda kutip untuk keterbacaan.

Input -> Output

"Thansk" -> "Terima kasih"
"Youer welcoem" -> "Terima kasih kembali"
"Ini apel" -> "Ini appel"
"Flippign Lettesr Aroudn" -> "Membalik Surat Sekitar"
"tAtUaN chALlEneg dengan swappde lettesR" -> "teHd chALlEnge dengan bertukar letteRs"

Atau, untuk kenyamanan test suite, berikut adalah input dan output yang sesuai secara terpisah:

Bahasa thans
Selamat datang
Ini sebuah apel
Flippign Lettesr Aroudn
TANTANGAN KITA SENDIRI DENGAN SENDIRI
Terima kasih
Sama-sama
Ini si appel
Membalik Surat Sekitar
BEGITU DARAH DENGAN KETERBUKAAN bertukar

Terima kasih kepada DJMcMayhem untuk judulnya. Ini awalnya CMC .

Tuan Xcoder
sumber
Bisakah kita menampilkan serangkaian kata-kata?
Shaggy
@Shaggy Tidak, output harus berupa string (atau daftar karakter secara default)
Mr. Xcoder
Bolehkah kami meminta spasi tambahan pada setiap input?
FlipTack
@FlipTack Itu diizinkan di versi awal, tapi saya telah menghapus aturan itu sebelum ada jawaban yang akan menggunakan yang telah diposting. (sebagian karena beberapa pengguna dalam obrolan memberi tahu saya bahwa saya membuat ini terlalu mudah sebaliknya, dan saya setuju dengan mereka). Tidak, itu tidak diizinkan.
Tn. Xcoder
1
@Fabian Sebuah kata adalah urutan dua huruf atau lebih
Tn. Xcoder

Jawaban:

16

V , 4 5 byte

òeXp

Cobalah online!

|| menunjukkan kursor

Buffer dimulai dengan |w|ord and more wordsdan kursor berada pada karakter pertama.

Secara rekursif ò

pergi ke emenemukan kata

wor|d| and more words

hapus Xkarakter di sebelah kiri kursor

wo|d| and more words

ptempelkan di atas karakter berikutnya

wod|r| and more words

Akhir yang tersirat ò, ulangi proses yang sama dengan kata lain sampai akhir buffer tercapai

Kritixi Lithos
sumber
2
Bahasa yang tepat untuk tugas :)
DJMcMayhem
Apakah maksud Anda "Berulang kali" dan bukannya "Secara Rekursif"?
NieDzejkob
@NieDzejkob Wiki V menggunakan kata "secara rekursif" untuk menggambarkan òperintah github.com/DJMcMayhem/V/wiki/Normal-Mode-Commands
Kritixi Lithos
10

Jelly , 7 byte

Ḳœ?@€2K

Tautan monadik yang mengambil dan mengembalikan daftar karakter

Cobalah online!

Bagaimana?

Ḳœ?@€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
sumber
Itu penyalahgunaan permutasi yang bagus. Alternatif
Tn. Xcoder
@ Mr.Xcoder Ḳ2œ?ЀKjuga berfungsi dan menggunakan satu quick.
Dennis
7

Brain-Flak , 122 byte

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

Cobalah online!

Bahasa terburuk untuk pekerjaan itu :)

Dapat dibaca Versi yang sedikit lebih mudah dibaca:

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

    {
        {}
        <>

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

        (<>)
    }
    {}

    ({}<>)<>

}<>

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

{

    ({}<>)
    <>
}<>
DJMcMayhem
sumber
Saya tidak percaya ini lebih lama dari versi Brainfuck ...
Pureferret
@pureferret Brain-flak cenderung lebih panjang dari brainfuck. Sebagian besar penyebabnya membutuhkan dua byte per perintah primitif, di mana brain-flak membutuhkan dua.
DJMcMayhem
7

Haskell , 40 byte

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

Cobalah online! Contoh penggunaan: (f=<<).words $ "abc xyz"hasil "acb xzy ".

Laikoni
sumber
Jadi, Anda mengatakan bahwa pendekatan terpendek adalah gabungan kedua pendekatan tersebut? > _ <
totallyhuman
6

Python 3 , 50 byte

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

Cobalah online!

Jawaban ini menyalahgunakan perilaku cetak Python 3: Banyak argumen dicetak dengan satu spasi di antaranya. Tentu saja, kita tidak bisa hanya memberikan beberapa argumen karena kita tidak tahu berapa banyak kata yang akan dimasukkan dalam input. Jadi kami menggunakan operator percikan . Pada dasarnya

print(*[a,b,c])

persis sama dengan

print(a,b,c)

Penyalahgunaan yang membuat program lengkap ternyata lebih pendek dari fungsi / lambda di mana kita harus menggunakan ' '.joinatau yang serupa.

DJMcMayhem
sumber
Sepertinya Python 2 menyimpan 2 byte dengan menulis for w in input().split():print w[:-2]+w[:-3:-1],. Dalam Python 3, mengekstraksi dua karakter terakhir akan bekerja dengan baik print(*(''.join(a)+c+b for*a,b,c in input().split()))kecuali yang aperlu dibuat kembali menjadi string.
xnor
5

Matlab (R2016b), 51 50 byte

Disimpan 49 50 (!) Byte berkat @Giuseppe.

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

Dan jawaban saya sebelumnya:

Matlab (R2016b), 100 byte

(Hanya untuk bersenang-senang: P)

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

Penjelasan:

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
sumber
1
satu kata karakter tidak dapat terjadi, karena sebuah kata didefinisikan setidaknya dua karakter.
Giuseppe
akan regexprepbekerja di sini? Sesuatu seperti regexprep(a,'(\w*)(\w)(\w)','\1\3\2')?
Giuseppe
D = Ini. Apakah. Epik! Saya pikir Anda harus memposting jawaban ini, karena sama sekali berbeda dari saya. Satu-satunya hal adalah bahwa Matlab mereferensikan korek api dengan $1, dan tidak \1, jadi itu akan terjadi regexprep(a,'(\w*)(\w)(\w)','$1$3$2').
Thiago Oleinik
1
Anda harus mempostingnya sebagai jawaban terpisah / dalam jawaban ini; itu selalu baik untuk melihat apakah suatu regex akan membantu atau tidak pada tantangan string! Selain itu, saya jelas tidak mengerti mesin regex MATLAB, jadi tidak adil bagi saya untuk mengambil kredit untuk itu.
Giuseppe
1
function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')masih byte lebih pendek!
Giuseppe
5

C,  62   58  54 byte

Terima kasih kepada @Dennis karena telah menghemat  empat  delapan byte!

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

Cobalah online!

Steadybox
sumber
ah, swap berbasis xor
Snowbody
4

Prolog (SWI) , 60 byte

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

Cobalah online!

Penjelasan

Pertama kita mendefinisikan kasus dasar:

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

Ini berarti bahwa dua huruf terakhir akan selalu ditukar.

Lalu kami menentukan apa yang terjadi jika kami berada tepat di sebelah spasi:

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

Dua string cocok jika tepat sebelum spasi, huruf-huruf sebelum spasi diganti dan sisanya jika string cocok. Kami kemudian gunakan !untuk memotong.

Kasus terakhir kami adalah jika kami tidak berada di sebelah spasi, dua huruf pertama harus cocok.

p([A|U],[A|Y]):-p(U,Y).
Wisaya Gandum
sumber
4

Bahasa Wolfram , 117 byte

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

Cobalah online!

Diterapkan ke string uji.

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
sumber
4
Selamat datang di PPCG!
Steadybox
@Steadybox Terima kasih.
Edmund
4

R , 111 51 41 byte

Atas perkenan @Giuseppe, sebuah pendekatan regex yang menghancurkan metode lama saya keluar dari air.

cat(gsub("(.)(.)\\b",'\\2\\1',scan(,"")))
rturnbull
sumber
1
regex jauh lebih efisien di sini: Coba online!
Giuseppe
(Bukannya saya tidak menghargai nyali yang dibutuhkan untuk melakukan pendekatan manipulasi string murni di R)
Giuseppe
@ Giuseppe Wow, kerja bagus! Saya telah mengeditnya dalam jawaban saya, meskipun jika Anda lebih suka untuk membuat jawaban Anda sendiri, silakan!
rturnbull
1
nah, jangan khawatir tentang itu. Saya bermain golf 10 byte lagi: porting pendekatan regex lain, dan 70 byte dari pendekatan lama Anda
Giuseppe
4

APL (Dyalog Classic) , 28 byte

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

⎕MLdan ⎕IOkeduanya 1,

Cobalah online!

Penjelasan

  • ... (,⊂⍨⊣=,) ... Membagi (sambil menjaga perbatasan, dan menambahkan perbatasan ke awal) ...
  • ... ⍞ ... input ...
  • ... ' ' ... ... di ruang angkasa.
  • ... ( ... )¨ ... Kemudian, untuk setiap elemen itu:
    • ... , ... Menggabungkan ...
    • ... (¯2↓⊢) ... ... setiap item kecuali dua yang terakhir ...
    • ... 2↑⌽ ... ... dengan kebalikan dari dua elemen terakhir.
  • 1↓∊ ... Akhirnya, kembalikan semua kecuali elemen pertama dari hasil yang diratakan.
Zacharý
sumber
kembalikan semua kecuali yang pertama
Adám
3

Haskell , 45 byte

-2 byte terima kasih kepada H.PWiz.

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

Cobalah online!

benar-benar manusiawi
sumber
3

J , 20 19 11 byte

Kredit ke @Bolce Bussiere

1&A.&.>&.;:

Cobalah online!

       &.;:      on words
    &.>          on each
  A.             apply the permutation
1&               number 1, swap the last two elements
FrownyFrog
sumber
1
13 Bytes dengan(1&A.&.>)&.;:
Bolce Bussiere
@ BolceBussiere sempurna
FrownyFrog
Bisakah Anda menambahkan penjelasan? Ingin tahu apakah saya bisa mem-port-nya ke K untuk mengurangi jumlah byte memalukan dari solusi saya!
streetster
3

Alice , 24 byte

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

Cobalah online!

Penjelasan

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

Ini membentuk sebuah loop di mana tubuh loop adalah potongan Ordinal linear dan kami mengeksekusi ' odalam mode Kardinal antara setiap dua iterasi loop. Yang terakhir hanya mencetak spasi.

Membuka struktur zigzag dari kode Ordinal, badan loop linear sebenarnya terlihat seperti ini:

iR*' %e10xRo.n$@

Hancurkan ini:

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
sumber
Hanya memperhatikan bahwa swap huruf dapat dilakukan dalam tiga byte ( h~Z) alih-alih empat ( e10x), tapi saya tidak melihat cara untuk menyesuaikan tata letak untuk benar-benar menyimpan byte secara keseluruhan dengan itu.
Martin Ender
2

brainfuck , 109 100 byte

Sunting: tidak harus menangani satu kata kata

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

Cobalah online!

Mencetak spasi tambahan

Bagaimana itu bekerja

,[>++++[-<-------->],] 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

Versi sebelumnya, 109 byte

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

Cobalah online!

Jo King
sumber
1

PHP , 119 107 byte

Sunting: terima kasih sepenuhnya kepada manusia

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

Cobalah online!

Zerquix18
sumber
1
Tidak bisakah Anda membuat $wordnama variabel karakter tunggal?
totallyhuman
@totallyhuman Yup! Saya menulis versi lengkap dan kemudian mengompresnya, tetapi tidak menyadarinya. Terimakasih.
Zerquix18
Tag terbuka PHP dapat dihilangkan dalam jawaban yang menghemat 6 byte.
Daniel W.
Saya ingin tahu apakah fgets(STDIN)dapat dihilangkan atau diganti $xjuga, seperti tidak semua jawaban menghitung input untuk jawaban mereka
Daniel W.
trim()seharusnya tidak perlu.
Titus
1

Haskell , 41 byte

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

Cobalah online!

Output dengan spasi tambahan.

Yang berulang ' ':rterlihat boros. Tetapi a%(b:t@(' ':r))=b:a:tpanjangnya sama dan a%(b:t)|' ':_<-t=b:a:tsatu byte lebih panjang.


Haskell , 41 byte

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

Cobalah online!

Tidak
sumber
1

sed , 20 17 + 1 (-r) = 18 byte

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

Cobalah online!

Noskcaj
sumber
TIO Link tidak cocok dengan kode Anda yang diposting. TIO link lebih panjang beberapa byte.
Xcali
Ups, perbaiki tautan
Noskcaj
Anda bisa menghapus |$. Itu tidak melakukan apa-apa. (Untuk itu untuk melakukan apa yang Anda harapkan Anda butuhkan (.)(.)(\b|$), tapi itu tidak perlu karena \bsudah cocok dengan akhir string.)
Jordan
Ups, dimaksudkan untuk menyingkirkan itu. Terima kasih,
Noskcaj
1

PHP, 65 byte

membutuhkan PHP 7.1 (atau lebih baru)

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

mengambil kalimat sebagai argumen baris perintah terpisah. Jalankan dengan -nr.


bekerja pada string tunggal, 77 +1 byte :

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

Jalankan sebagai pipa dengan -nR.


... atau coba online .

Titus
sumber
1

Java 8, 35 byte

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

Port of @TaylorScott Google Sheets menjawab , setelah saya bermain golf dua byte. EDIT: Saya melihat sekarang ini adalah port jawaban Neil 's Retina setelah dua byte golf saya.

Penjelasan:

Cobalah 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
sumber
1

Google Sheets, 33 Bytes

Fungsi lembar kerja anonim yang mengambil input dari sel A1dan output ke sel panggilan

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

-2 Bytes Terima kasih kepada @KevinCruijssen untuk penggunaan (.)lebih(\w)

Taylor Scott
sumber
Keduanya (\w)bisa bermain golf (.)jika saya tidak salah. The \bsudah merupakan indikasi untuk mencari kata-kata saja. (Meskipun tidak sepenuhnya yakin, tetapi berfungsi di Jawa.)
Kevin Cruijssen
@KevinCruijssen - Anda benar sekali, bisa saja. Terima kasih!
Taylor Scott
1

JavaScript (Node.js) , 38 36 32 byte

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

Cobalah online!

Pendekatan RegExp dengan hormat @Giuseppe (meskipun saya memikirkan ini secara independen), dengan asumsi kata-kata dipisahkan oleh hanya satu ruang

-2 untuk hanya mempertimbangkan 1 ruang dan menambahkan ruang tambahan

-4 Terima kasih @Shaggy

Shieru Asakoto
sumber
Tidak masalah jika ada lebih banyak ruang, saya pikir
l4m2
@ l4m2 Tetapi jika ada lebih banyak ruang maka akan menjadi 38 untuk s=>s.replace(/(.)(.)( +|$)/g,"$2$1$3").
Shieru Asakoto
@ l4m2 BTW jawaban asli saya adalahs=>s.replace(/(.)(.)(\s|$)/g,"$2$1$3")
Shieru Asakoto
ab abc abcd abcde abcdef Apakah ab_, bc_, cd_, de_, ___, ef_,___
l4m2
1
F=s=>s.replace(/(.)(.)(?!\w)/g,"$2$1")panjang yang sama
l4m2
1

K (oK) , 23 22 byte

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

Cobalah online!

Contoh:

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

Penjelasan:

Solusi Port of FrownyFrog untuk menghemat 1 byte .

Saya akan kembali ke sini.

" "/{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 " "

Solusi sebelumnya:

  • " "/-2{(x_y),|x#y}'" "\ 23 byte
streetster
sumber
1

05AB1E , 7 byte

#vy`sðJ

Cobalah online!

-1 terima kasih kepada Magic Octopus Mm .

Mencetak satu spasi tambahan.

Erik the Outgolfer
sumber
Ini adalah 11 byte
Daniel W.
2
@DanFromGermany Tidak, 05AB1E memiliki halaman kode yang dapat direpresentasikan sebagai 8 byte.
Erik the Outgolfer
Bisakah Anda menjalankan program yang direpresentasikan dalam 8 byte?
Daniel W.
@DanFromGermany Ya, interpreter 05AB1E dapat menjalankan program ini dari file dalam pengkodean 05AB1E.
Erik the Outgolfer
1
@MagicOctopusUrn Ini bukan daftar, ini setelah `.
Erik the Outgolfer
0

SNOBOL4 (CSNOBOL4) , 136 119 byte

	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

Cobalah online!

Mencetak dengan spasi tambahan. Anda tahu Anda telah melakukan sesuatu yang salah ketika sebuah bahasa adalah backronym untuk StriNg Oriented dan symBOlic Language dan kode Anda lebih panjang dari Brain-Flak :( sekarang ini sedikit lebih baik.

Line Bmengambil Idan mengganti (alphabetic characters saved as Y)(some number of spaces)dengan string kosong.

Baris berikut ekstrak 2 karakter terakhir Ysebagai Zdan menggantikan mereka sebagai Zterbalik, maka merangkai baris berikutnya O, Ydan karakter spasi tunggal.

Akhirnya, ia mencetak ketika Itidak lagi cocok dengan pola yang diperlukan sesuai B.

Giuseppe
sumber