Flippign Lettesr Aroudn


33

Trong trò chuyện, chúng ta thường là những người đánh máy nhanh và không thực sự nhìn vào thứ tự các chữ cái trước khi đăng một tin nhắn. Vì chúng tôi lười biếng, chúng tôi cần một chương trình tự động hoán đổi hai chữ cái cuối cùng trong các từ của chúng tôi, nhưng vì chúng tôi không muốn trả lời quá muộn, nên mã phải ngắn.

Nhiệm vụ của bạn, nếu bạn muốn chấp nhận nó, là viết một chương trình lật hai chữ cái cuối của mỗi từ trong một chuỗi đã cho (để từ đó Thanskbiến thành Thanks). Một từ là một chuỗi gồm hai hoặc nhiều chữ cái trong bảng chữ cái tiếng Anh được phân định bởi một khoảng trắng.

  • Chuỗi / danh sách các ký tự bạn nhận làm đầu vào được đảm bảo chỉ chứa các ký tự và khoảng trắng chữ cái (ASCII [97 - 122], [65 - 90] và 32).

  • Bạn có thể nhận đầu vào và cung cấp đầu ra thông qua bất kỳ phương thức tiêu chuẩn nào , trong bất kỳ ngôn ngữ lập trình nào , trong khi lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

  • Đầu ra có thể có một dấu cách và / hoặc một dòng mới.

  • Đầu vào sẽ luôn chỉ chứa các từ (và khoảng trắng tương ứng) và sẽ bao gồm ít nhất một từ.

Đây là môn đánh gôn, vì vậy bài nộp ngắn nhất (tính bằng byte), trong mỗi ngôn ngữ sẽ thắng!

Các trường hợp thử nghiệm

Lưu ý rằng các chuỗi được bao quanh với dấu ngoặc kép để dễ đọc.

Đầu vào -> Đầu ra

"Phạn" -> "Cảm ơn"
"Youer Welcoem" -> "Youre welcome"
"Đây là một quả táo" -> "Thsi si na appel"
"Flippign Lettesr Aroudn" -> "Lật thư xung quanh"
"tHe oDd chALlEneg wiht swappde lettesR" -> "teH odD chALlEnge với letteRs hoán đổi"

Hoặc, để thuận tiện cho bộ thử nghiệm, đây là các đầu vào và đầu ra tương ứng của chúng một cách riêng biệt:

Tiếng Phạn
Chào mừng bạn
Đây là quả táo
Flippign Lettesr Aroudn
tHe oDd chALlEneg wiht swappde lettesR
Cảm ơn
Không có gì
Thsi si na appel
Lật thư xung quanh
teH odD chALlEnge với letteRs hoán đổi

Cảm ơn DJMcMayhem cho tiêu đề. Đây ban đầu là một CMC .


Chúng ta có thể xuất ra một loạt các từ?
Shaggy

@Shaggy Không, đầu ra phải là một chuỗi (hoặc danh sách các ký tự theo mặc định)
Ông Xcoder

Chúng tôi có thể yêu cầu một không gian dấu trên mỗi đầu vào?
FlipTack

@FlipTack Nó được cho phép trong phiên bản đầu tiên, nhưng tôi đã xóa quy tắc đó trước bất kỳ câu trả lời nào sẽ sử dụng đã được đăng. (một phần vì một số người dùng trong trò chuyện đã nói với tôi rằng tôi đang làm điều này quá dễ dàng và tôi đồng ý với họ). Không, nó không được phép.
Ông Xcoder

1
@Fabian Một từ là một chuỗi gồm hai hoặc nhiều chữ cái
Ông Xcoder

Câu trả lời:


16

V , 4 5 byte

òeXp

Hãy thử trực tuyến!

|| biểu thị con trỏ

Bộ đệm bắt đầu bằng |w|ord and more wordsvà con trỏ ở ký tự đầu tiên.

Đệ quy ò

đi đến emột từ

wor|d| and more words

xóa Xký tự bên trái con trỏ

wo|d| and more words

paste nó qua nhân vật tiếp theo

wod|r| and more words

Kết thúc ngầm định ò, lặp lại quá trình tương tự cho các từ khác cho đến khi kết thúc bộ đệm


2
Các ngôn ngữ phù hợp với nhiệm vụ :)
DJMcMayhem

Bạn có nghĩa là "Lặp đi lặp lại" thay vì "đệ quy"?
NieDzejkob

@NieDzejkob V wiki sử dụng từ "đệ quy" để mô tả òlệnh github.com/DJMcMayhem/V/wiki/N
normal

10

Thạch , 7 byte

Ḳœ?@€2K

Một liên kết đơn và lấy danh sách các ký tự

Hãy thử trực tuyến!

Làm sao?

Ḳœ?@€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

Đó là một sự lạm dụng tốt đẹp của hoán vị. Thay thế
Ông Xcoder

@ Mr.Xcoder Ḳ2œ?ЀKcũng hoạt động và sử dụng một cách nhanh chóng.
Dennis

7

Brain-Flak , 122 byte

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

Hãy thử trực tuyến!

Ngôn ngữ tồi tệ nhất cho công việc :)

Có thể đọc được phiên bản Hơi dễ đọc hơn:

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

    {
        {}
        <>

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

        (<>)
    }
    {}

    ({}<>)<>

}<>

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

{

    ({}<>)
    <>
}<>

Tôi không thể tin rằng phiên bản này dài hơn phiên bản Brainfuck ...
Pureferret

@pureferret Brain-flak có xu hướng dài hơn brainfuck. Chủ yếu là vì nó đòi hỏi hai byte cho mỗi lệnh nguyên thủy, trong đó flak não yêu cầu hai byte.
DJMcMayhem



6

Python 3 , 50 byte

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

Hãy thử trực tuyến!

Câu trả lời này lạm dụng hành vi in ​​của Python 3: Nhiều đối số được in với một khoảng trắng giữa chúng. Tất nhiên, chúng ta không thể đưa ra nhiều đối số vì chúng ta không biết có bao nhiêu từ sẽ được nhập vào. Vì vậy, chúng tôi sử dụng toán tử splat . Về cơ bản

print(*[a,b,c])

giống hệt như

print(a,b,c)

Lạm dụng làm cho một chương trình đầy đủ trở nên ngắn hơn một hàm / lambda nơi chúng ta phải sử dụng ' '.joinhoặc một cái gì đó tương tự.


Có vẻ như Python 2 tiết kiệm 2 byte bằng cách viết for w in input().split():print w[:-2]+w[:-3:-1],. Trong Python 3, trích xuất hai ký tự cuối cùng sẽ hoạt động tốt print(*(''.join(a)+c+b for*a,b,c in input().split()))ngoại trừ việc acần phải được làm lại thành một chuỗi.
xnor

5

Matlab (R2016b), 51 50 byte

Đã lưu 49 50 byte (!) Nhờ @Giuseppe.

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

Và câu trả lời trước của tôi:

Matlab (R2016b), 100 byte

(Chỉ vì niềm vui của nó: P)

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

Giải trình:

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

1
một từ ký tự không thể xảy ra, vì một từ được định nghĩa có ít nhất hai ký tự.
Giuseppe

sẽ regexpreplàm việc ở đây? Một cái gì đó như thế regexprep(a,'(\w*)(\w)(\w)','\1\3\2')nào?
Giuseppe

D = Cái này. Đã. Sử thi! Tôi nghĩ bạn nên đăng câu trả lời này, vì nó hoàn toàn khác với tôi. Điều duy nhất là Matlab tham chiếu các trận đấu với $1, và không \1, vì vậy nó sẽ như vậy regexprep(a,'(\w*)(\w)(\w)','$1$3$2').
Thiago Oleinik

1
bạn nên đăng nó dưới dạng một câu trả lời riêng biệt / trong câu trả lời này; luôn luôn tốt để xem liệu một regex sẽ giúp hay không trong một thách thức chuỗi! Ngoài ra, tôi rõ ràng không hiểu công cụ regex của MATLAB, vì vậy sẽ không công bằng cho tôi khi lấy tín dụng cho nó.
Giuseppe

1
function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')vẫn còn một byte ngắn hơn!
Giuseppe


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.

Hãy thử trực tuyến!

Giải trình

Đầu tiên chúng ta xác định trường hợp cơ sở:

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

Điều này có nghĩa là hai chữ cái cuối cùng sẽ luôn được hoán đổi.

Sau đó, chúng tôi xác định những gì sẽ xảy ra nếu chúng tôi ở ngay bên cạnh một không gian:

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

Hai chuỗi khớp nhau nếu ngay trước một khoảng trắng các chữ cái trước khoảng trắng được hoán đổi và phần còn lại nếu các chuỗi khớp nhau. Chúng tôi sau đó sử dụng !để cắt.

Trường hợp cuối cùng của chúng tôi là nếu chúng tôi không ở cạnh một khoảng trắng, hai chữ cái đầu tiên cần khớp.

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

4

Ngôn ngữ Wolfram , 117 byte

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

Hãy thử trực tuyến!

Áp dụng cho các chuỗi thử nghiệm.

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

4
Chào mừng đến với PPCG!
Steadybox

@Steadybox Cảm ơn.
Edmund

4

R , 111 51 41 byte

Biếu không của @Giuseppe, một cách tiếp cận regex thổi phương pháp cũ của tôi ra khỏi nước.

cat(gsub("(.)(.)\\b",'\\2\\1',scan(,"")))

1
regex hiệu quả hơn nhiều ở đây: Hãy thử trực tuyến!
Giuseppe

(không phải là tôi không đánh giá cao sự can đảm cần có để thực hiện một cách tiếp cận thao tác chuỗi thuần túy trong R)
Giuseppe


@Giuseppe Wow, làm tốt lắm! Tôi đã chỉnh sửa chúng thành câu trả lời của mình, mặc dù nếu bạn muốn tự trả lời, vui lòng tiếp tục!
rturnbull

1
không, đừng lo lắng về nó Tôi đã đánh gôn thêm 10 byte: chuyển một cách tiếp cận regex khác và 70 byte cho cách tiếp cận cũ của bạn
Giuseppe

4

APL (Dyalog Classic) , 28 byte

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

⎕ML⎕IOđều 1,

Hãy thử trực tuyến!

Giải trình

  • ... (,⊂⍨⊣=,) ... Tách (trong khi giữ đường viền và nối thêm đường viền vào đầu) ...
  • ... ⍞ ... đầu vào ...
  • ... ' ' ... ... tại các không gian.
  • ... ( ... )¨ ... Sau đó, đến từng yếu tố của điều đó:
    • ... , ... Kết nối ...
    • ... (¯2↓⊢) ... ... tất cả các mục ngoại trừ hai ...
    • ... 2↑⌽ ... ... với sự đảo ngược của hai yếu tố cuối cùng.
  • 1↓∊ ... Cuối cùng, trả lại tất cả trừ phần tử đầu tiên của kết quả làm phẳng.

trả lại tất cả trừ cái đầu tiên
Adám



3

J , 20 19 11 byte

Tín dụng cho @Bolce Bussiere

1&A.&.>&.;:

Hãy thử trực tuyến!

       &.;:      on words
    &.>          on each
  A.             apply the permutation
1&               number 1, swap the last two elements

1
13 Byte với(1&A.&.>)&.;:
Bolce Bussiere 31/12/17

@BolceBussiere hoàn hảo
FrownyFrog

Bạn có thể thêm một lời giải thích? Tự hỏi liệu tôi có thể chuyển nó sang K để giảm số byte đáng xấu hổ trong giải pháp của mình không!
streetster

3

Alice , 24 byte

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

Hãy thử trực tuyến!

Giải trình

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

Điều này tạo thành một vòng lặp trong đó thân vòng lặp là một đoạn thông thường tuyến tính và chúng tôi thực hiện ' o trong chế độ Cardinal giữa mỗi lần lặp hai vòng lặp. Sau này chỉ in một không gian.

Mở ra cấu trúc ngoằn ngoèo của mã Ordinal, thân vòng lặp tuyến tính thực sự trông như thế này:

iR*' %e10xRo.n$@

Phá vỡ điều này:

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.

Chỉ cần lưu ý rằng việc hoán đổi chữ cái có thể được thực hiện trong ba byte ( h~Z) thay vì bốn ( e10x), nhưng tôi không thấy cách điều chỉnh bố cục để thực sự tiết kiệm một byte tổng thể với điều đó.
Martin Ender

2

cân não , 109 100 byte

Chỉnh sửa: không phải xử lý một chữ cái

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

Hãy thử trực tuyến!

In một dấu cách

Làm thế nào nó hoạt động

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

Phiên bản trước, 109 byte

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

Hãy thử trực tuyến!



1

PHP , 119 107 byte

Chỉnh sửa: cảm ơn hoàn toàn

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

Hãy thử trực tuyến!


1
Bạn có thể tạo $wordmột tên biến ký tự không?
hoàn toàn là

@totallyhuman Yup! Tôi đã viết phiên bản đầy đủ và sau đó nén nó, nhưng không nhận thấy điều đó. Cảm ơn bạn.
Zerquix18

Các thẻ mở PHP có thể được bỏ qua trong câu trả lời giúp bạn tiết kiệm 6 byte.
Daniel W.

Tôi tự hỏi nếu fgets(STDIN)có thể được bỏ qua hoặc thay thế bởi $xquá, như không phải tất cả các câu trả lời đều tính đầu vào cho câu trả lời của họ
Daniel W.

trim()nên không cần thiết
Tít


1

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

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

Hãy thử trực tuyến!


Liên kết TIO không khớp với mã được đăng của bạn. Liên kết TIO dài hơn một vài byte.
Xcali

Rất tiếc, đã sửa liên kết
Noskcaj

Bạn có thể loại bỏ |$. Nó không làm gì cả. (Để nó thực hiện những gì bạn mong muốn (.)(.)(\b|$), nhưng điều đó không cần thiết vì \bđã khớp với phần cuối của chuỗi.)
Jordan

Rất tiếc, có nghĩa là để thoát khỏi điều đó. Cảm ơn,
Noskcaj

1

PHP, 65 byte

yêu cầu PHP 7.1 (hoặc phiên bản mới hơn)

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

lấy câu làm đối số dòng lệnh riêng biệt. Chạy với -nr.


làm việc trên một chuỗi đơn, 77 + 1 byte :

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

Chạy như ống với -nR.


... hoặc thử chúng trực tuyến .


1

Java 8, 35 byte

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

Cảng Câu trả lời trên Google Sheets @TaylorScott , sau khi tôi đánh gôn hai byte. EDIT: Tôi thấy bây giờ nó là một cảng của Neil câu trả lời Retina sau hai byte được đánh gôn của tôi.

Giải trình:

Hãy thử trực tuyến.

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

1

Google Sheets, 33 byte

Hàm bảng tính ẩn danh nhận đầu vào từ ô A1và xuất ra ô gọi

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

-2 Byte Cảm ơn @KevinCruijssen vì đã sử dụng (.)hơn(\w)


Cả hai (\w)có thể được chơi golf (.)nếu tôi không nhầm. Đây \bđã là một dấu hiệu để chỉ tìm từ. (Mặc dù không hoàn toàn chắc chắn, nhưng nó hoạt động trong Java.)
Kevin Cruijssen

@KevinCruijssen - Bạn hoàn toàn chính xác, nó có thể. Cảm ơn bạn!
Taylor Scott

1

JavaScript (Node.js) , 38 36 32 byte

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

Hãy thử trực tuyến!

Cách tiếp cận RegExp lịch sự @Giuseppe (mặc dù tôi nghĩ về điều này một cách độc lập), giả sử các từ chỉ cách nhau một khoảng

-2 chỉ xem xét 1 không gian và thêm không gian kéo

-4 Cảm ơn @Shaggy


Không có vấn đề gì nếu có nhiều không gian hơn, tôi nghĩ
l4m2

@ l4m2 Nhưng nếu có nhiều không gian hơn thì nó sẽ trở thành 38 cho s=>s.replace(/(.)(.)( +|$)/g,"$2$1$3").
Shieru Asakoto

@ l4m2 BTW câu trả lời ban đầu của tôi làs=>s.replace(/(.)(.)(\s|$)/g,"$2$1$3")
Shieru Asakoto

ab abc abcd abcde abcdef Liệu ab_, bc_, cd_, de_, ___, ef_,___
l4m2

1
F=s=>s.replace(/(.)(.)(?!\w)/g,"$2$1")cùng chiều dài
l4m2

1

K (oK) , 23 22 byte

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

Hãy thử trực tuyến!

Thí dụ:

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

Giải trình:

Giải pháp của Port of FrownyFrog để tiết kiệm 1 byte .

Tôi sẽ trở lại vấn đề này.

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

Giải pháp trước đây:

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

1

05AB1E , 7 byte

#vy`sðJ

Hãy thử trực tuyến!

-1 cảm ơn Magic Octopus Urn .

In một dấu cách.


Đây là 11 byte
Daniel W.

2
@DanFromGermany Không, 05AB1E có một trang mã trong đó trang này có thể được biểu diễn dưới dạng 8 byte.
Erik the Outgolfer 28/12/17

Bạn có thể chạy chương trình đại diện trong 8 byte?
Daniel W.

@DanFromGermany Có, trình thông dịch 05AB1E có thể chạy chương trình này từ một tệp trong mã hóa 05AB1E.
Erik the Outgolfer 28/12/17

1
@MagicOctopusUrn Mặc dù vậy, đây không phải là một danh sách `.
Erik the Outgolfer 2/218


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

Hãy thử trực tuyến!

In với một không gian dấu. Bạn biết bạn đã làm sai điều gì đó khi một ngôn ngữ là từ viết tắt của StriNg Định hướng và Ngôn ngữ symBOlic và mã của bạn dài hơn Brain-Flak :( bây giờ thì tốt hơn một chút.

Dòng Blấy Ivà thay thế (alphabetic characters saved as Y)(some number of spaces)bằng chuỗi trống.

Điểm mấu sau sẽ rút trích 2 ký tự cuối cùng của YZvà thay thế chúng như Zđảo ngược, thì concatenates dòng tiếp theo O, Yvà một nhân vật không gian duy nhất.

Cuối cùng, nó in khi Ikhông còn phù hợp với mẫu yêu cầu trong dòng B.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.