Flippign Lettesr Aroudn


33

В чаті, ми часто швидко-TYPERS і на самому ділі не дивитися на того , з листів , перш ніж відправляти повідомлення. Оскільки ми ліниві, нам потрібна програма, яка автоматично заміняє останні два букви нашими словами, але оскільки ми не хочемо відповідати надто пізно, код повинен бути коротким.

Ваше завдання, якщо ви бажаєте прийняти це, - написати програму, яка перегортає останні дві літери кожного слова в заданому рядку (так це слово Thanskперетворюється на Thanks). Слово являє собою послідовність з двох або більше букв в англійському алфавіті , обмеженою однієї простору.

  • Рядок / список символів, які ви отримуєте як вхідні дані, гарантовано містять лише алфавітні символи та пробіли (ASCII [97 - 122], [65 - 90] та 32).

  • Ви можете приймати введення та надавати вихід за допомогою будь-якого стандартного методу на будь- якій мові програмування , беручи до уваги, що ці лазівки заборонено за замовчуванням.

  • Вихід може мати один пробіл та / або один зворотний новий рядок.

  • Вхід завжди буде містити лише слова (і відповідне пробіл) і буде складатися щонайменше з одного слова.

Це код-гольф, тому найкоротше подання (набране в байтах) на кожній мові виграє!

Тестові справи

Зауважте, що рядки оточені лапками для читабельності.

Вхід -> Вихід

"Танськ" -> "Спасибі"
"Youer welcoem" -> "Вітаємо вас"
"Це яблуко" -> "Це си на апеляцію"
"Flippign Lettesr Aroudn" -> "Перегортання букв навколо"
"З'ясувавшись з різними літерамиR" -> "з непарними chALlEnge з обміненими записами"

Або, для зручності тестового набору, ось окремі входи та відповідні їх виходи:

Танськ
Youer Welcoem
Це яблуко
Flippign Lettesr Aroudn
Він чудовий з різними літерамиR
Спасибі
Ласкаво просимо
Це си на апел
Розгортаючи букви навколо
ТЕХНІЧНІ ЧАЛИКИ з заміненими літерами

Дякуємо DJMcMayhem за назву. Спочатку це був CMC .


Чи можемо ми вивести масив слів?
Кудлатий

@Shaggy Ні, вихід повинен бути рядком (або списком символів за замовчуванням)
Mr. Xcoder

Чи можемо ми запитати пробіл на кожному вході?
FlipTack

@FlipTack Це було дозволено в початковій версії, але я видалив це правило перед будь-яким з відповідей, які використовуватиму, що були опубліковані. (почасти тому, що деякі користувачі в чаті сказали мені, що я роблю це занадто просто інакше, і я згоден з ними). Ні, це не дозволено.
Містер Xcoder

1
@Fabian Слово - це послідовність двох або більше літер
Містер Xcoder

Відповіді:


16

V , 4 5 байт

òeXp

Спробуйте в Інтернеті!

|| позначає курсор

Буфер починається з, |w|ord and more wordsа курсор знаходиться на першому символі.

Рекурсивно ò

перейти до eдругого слова

wor|d| and more words

видаліть Xсимвол зліва від курсору

wo|d| and more words

pасте його над наступним символом

wod|r| and more words

Непомітне закінчення ò, повторіть той самий процес для інших слів, поки не буде досягнуто кінця буфера


2
Правильна мова для завдання :)
DJMcMayhem

Ви маєте на увазі "Повторно" замість "Рекурсивно"?
NieDzejkob

@NieDzejkob V wiki використовує слово "рекурсивно" для опису òкоманди github.com/DJMcMayhem/V/wiki/Normal-Mode-Commands
Kritixi Lithos

10

Желе , 7 байт

Ḳœ?@€2K

Монадійне посилання, що приймає та повертає списки символів

Спробуйте в Інтернеті!

Як?

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

Це приємне зловживання перестановками. Альтернатива
містер Xcoder

@ Mr.Xcoder Ḳ2œ?ЀKтакож працює і використовує один швидкий.
Денніс

7

Мозок-Флак , 122 байти

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

Спробуйте в Інтернеті!

Найгірша мова для роботи :)

Читаються Трохи більше читається версія:

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

    {
        {}
        <>

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

        (<>)
    }
    {}

    ({}<>)<>

}<>

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

{

    ({}<>)
    <>
}<>

Я не можу повірити, що це довше, ніж версія Brainfuck ...
Pureferret

@pureferret Мозок-луска, як правило, довше, ніж головний мозок. Переважно для цього потрібні два байти за первісну команду, де для мозку-спалаху потрібні два.
DJMcMayhem



6

Python 3 , 50 байт

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

Спробуйте в Інтернеті!

Ця відповідь зловживає поведінкою друку Python 3: друкується декілька аргументів з одним пробілом між ними. Звичайно, ми не можемо просто навести кілька аргументів, тому що ми не знаємо, скільки слів буде у введенні. Тому ми використовуємо оператор splat . В основному

print(*[a,b,c])

точно те саме, що і

print(a,b,c)

Зловживання, що робить повну програму, виявляється коротшою, ніж функція / лямбда, де нам доведеться використовувати ' '.joinчи щось подібне.


Схоже, Python 2 записує 2 байти при записі for w in input().split():print w[:-2]+w[:-3:-1],. У Python 3 вилучення останніх двох символів добре працюватиме, за print(*(''.join(a)+c+b for*a,b,c in input().split()))винятком того, що aпотрібно переробити в рядок.
xnor

5

Matlab (R2016b), 51 50 байт

Збережено 49 50 (!) Байтів завдяки @Giuseppe.

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

І моя попередня відповідь:

Matlab (R2016b), 100 байт

(Тільки для задоволення: P)

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

Пояснення:

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
одного символьного слова не може відбутися, оскільки слово визначається як мінімум двома символами.
Джузеппе

regexprepпрацювали б тут? Щось схоже regexprep(a,'(\w*)(\w)(\w)','\1\3\2')?
Джузеппе

D = це. Був. Епічний! Я думаю, ви повинні опублікувати цю відповідь, оскільки вона абсолютно відрізняється від моєї. Єдине, що Матлаб посилається на матчі $1, а ні \1, так було б regexprep(a,'(\w*)(\w)(\w)','$1$3$2').
Тіаго Олейник

1
ви повинні розмістити його як окрему відповідь / у цій відповіді; завжди добре бачити, чи допоможе регулярний вираз у складній проблемі чи ні! Крім того, я чітко не розумію механізм регулярних викидів MATLAB, тому мені було б не справедливо брати за це кредит.
Джузеппе

1
function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')ще один байт коротший!
Джузеппе


4

Пролог (SWI) , 60 байт

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

Спробуйте в Інтернеті!

Пояснення

Спочатку визначимо базовий випадок:

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

Це означає, що останні два букви завжди будуть замінені.

Тоді ми визначаємо, що станеться, якщо ми знаходимося поруч із пробілом:

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

Два рядки збігаються, якщо прямо перед пробілом, букви перед пробілом поміняються, а решта - якщо рядки збігаються. Потім використовуємо !для нарізки.

Наш останній випадок - якщо ми не поруч із пробілом, перші два букви повинні відповідати.

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

4

Мова Вольфрам , 117 байт

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

Спробуйте в Інтернеті!

Застосовується до тестових рядків.

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
Ласкаво просимо до PPCG!
Steadybox

@Steadybox Дякую
Едмунд

4

R , 111 51 41 байт

Люб’язно надано @Giuseppe, підхід, що піддається регулярному вираженню, який виводить мій старий метод з води.

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

1
Регекс тут набагато ефективніший: спробуйте в Інтернеті!
Джузеппе

(не те, що я не ціную кишки, потрібні для чистого струнного підходу до маніпуляції в R)
Джузеппе


@Giuseppe Вау, приємна робота! Я змінив їх у свою відповідь, хоча, якщо ви хочете зробити свою відповідь, будь ласка, продовжуйте!
rturnbull

1
ні, не хвилюйся про це. Я зіграв ще 10 байт: переніс ще один підхід для регулярних виразів і 70 байт вашого старого підходу
Джузеппе

4

APL (Dyalog Classic) , 28 байт

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

⎕MLі ⎕IOобидва 1,

Спробуйте в Інтернеті!

Пояснення

  • ... (,⊂⍨⊣=,) ... Розкол (зберігаючи межі та додаючи кордон до початку) ...
  • ... ⍞ ... вхід ...
  • ... ' ' ... ... на пробіли.
  • ... ( ... )¨ ... Потім до кожного елемента цього:
    • ... , ... Об'єднайте ...
    • ... (¯2↓⊢) ... ... кожен предмет, крім двох останніх ...
    • ... 2↑⌽ ... ... з реверсом двох останніх елементів.
  • 1↓∊ ... Нарешті, поверніть усі, крім першого елемента, вирівняного результату.

повернути всіх, окрім першого
Adám



3

J , 20 19 11 байт

Кредит на @Bolce Bussiere

1&A.&.>&.;:

Спробуйте в Інтернеті!

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

1
13 байт с(1&A.&.>)&.;:
Болче Буссієре

@BolceBussiere perfect
FrownyFrog

Чи можете ви додати пояснення? Цікаво, чи зможу я перенести його до K, щоб зменшити бентежить кількість байтів мого рішення!
Стрітер

3

Аліса , 24 байти

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

Спробуйте в Інтернеті!

Пояснення

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

Це утворює цикл, де тіло циклу є лінійним ординарним фрагментом, і ми виконуємо ' oв режимі Кардинала між кожними двома ітераціями циклу. Останній просто друкує пробіл.

Розгортаючи зигзагоподібну структуру ординального коду, тіло лінійної петлі насправді виглядає так:

iR*' %e10xRo.n$@

Порушення цього:

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.

Щойно зауважив, що підміна букв може бути виконана в три байти ( h~Z) замість чотирьох ( e10x), але я не бачу способу налаштувати макет, щоб фактично зберегти байт загалом за допомогою цього.
Мартін Ендер

2

мозковий ебать , 109 100 байт

Редагувати: не потрібно обробляти слова з однієї літери

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

Спробуйте в Інтернеті!

Друкує пробіл

Як це працює

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

Попередня версія, 109 байт

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

Спробуйте в Інтернеті!



1

PHP , 119 107 байт

Редагувати: завдяки абсолютнолюдському

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

Спробуйте в Інтернеті!


1
Ви не можете створити $wordім’я змінної одного символу?
повністюлюдсько

@totallyhuman Yup! Я написав повну версію, а потім стиснув її, але цього не помітив. Дякую.
Zerquix18

Відкриті теги PHP можуть бути пропущені у відповіді, заощадивши 6 байтів.
Даніель В.

Цікаво, чи fgets(STDIN)можна пропустити чи замінити їх $xзанадто, як і не всі відповіді підраховують внесок у відповіді
Daniel W.

trim()повинні бути непотрібними.
Тит


1

sed , 20 17 + 1 (-r) = 18 байт

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

Спробуйте в Інтернеті!


Посилання TIO не відповідає вашому опублікованому коду. Посилання TIO на кілька байт довше.
Xcali

Упс, виправлено посилання
Noskcaj

Ви можете видалити |$. Це нічого не робить. (Для того, щоб робити те, що, на вашу думку, вам знадобиться (.)(.)(\b|$), але це не потрібно, тому що \bвже відповідає кінці рядка.)
Йорданія

Вупс, мав на увазі позбутися цього. Дякую,
Noskcaj

1

PHP, 65 байт

вимагає PHP 7.1 (або пізнішої версії)

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

приймає речення як окремі аргументи командного рядка. Бігайте з -nr.


працює над одним рядком, 77 + 1 байт :

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

Запустити як труба -nR.


... або спробуйте їх в Інтернеті .


1

Java 8, 35 байт

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

Порт @TaylorScott відповідь Google Sheets , після того як я пограв у два байти. EDIT: Я бачу , що тепер порт Ніл Retina відповіді «s після двох моїх golfed байт.

Пояснення:

Спробуйте в Інтернеті.

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 Таблиці, 33 байти

Функція анонімного робочого аркуша, яка приймає вхід з комірки A1та виводить в клітинку, що викликає

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

-2 байти Завдяки @KevinCruijssen за використання (.)над(\w)


Обидва (\w)можуть бути в гольф, (.)якщо я не помиляюся. Це \bвже вказівка ​​шукати лише слова. (Хоча не зовсім впевнений, але він працює на Java.)
Кевін Круїйсен

@KevinCruijssen - Ви абсолютно праві, це може бути. Дякую!
Тейлор Скотт

1

JavaScript (Node.js) , 38 36 32 байт

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

Спробуйте в Інтернеті!

RegExp підходив люб’язно @Giuseppe (хоча я думав про це самостійно), якщо вважати слова розділеними лише одним пробілом

-2 лише зважаючи на 1 простір та додайте пробіл

-4 Дякую @Shaggy


Не має значення, чи є пробіли більше, я думаю
l4m2

@ l4m2 Але якщо пробілів буде більше, він стане 38 для s=>s.replace(/(.)(.)( +|$)/g,"$2$1$3").
Шиеру Асакото

@ l4m2 BTW моя первісна відповідь булаs=>s.replace(/(.)(.)(\s|$)/g,"$2$1$3")
Шиеру Асакото

ab abc abcd abcde abcdef Чи має ab_, bc_, cd_, de_, ___, ef_,___
l4m2

1
F=s=>s.replace(/(.)(.)(?!\w)/g,"$2$1")однакова довжина
l4м2

1

K (oK) , 23 22 байт

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

Спробуйте в Інтернеті!

Приклад:

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

Пояснення:

Порт FrownyFrog зберегти 1 байт .

Я повернусь до цього.

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

Попереднє рішення:

  • " "/-2{(x_y),|x#y}'" "\ 23 байти

1

05AB1E , 7 байт

#vy`sðJ

Спробуйте в Інтернеті!

-1 завдяки магічній урній восьминога .

Друкує один пробіл.


Це 11 байт
Daniel W.

2
@DanFromGermany Ні, 05AB1E має сторінку коду, в якій це може бути представлено у вигляді 8 байт.
Ерік Атголфер

Чи можете ви запустити програму, представлену у 8 байтах?
Даніель В.

@DanFromGermany Так, інтерпретатор 05AB1E може запустити цю програму з файлу в кодуванні 05AB1E.
Ерік Атголфер

1
@MagicOctopusUrn Це не список, однак це вже після `.
Ерік Аутгольфер


0

SNOBOL4 (CSNOBOL4) , 136 119 байт

	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

Спробуйте в Інтернеті!

Друкує з пробілом. Ви знаєте, що ви зробили щось не так, коли мова є заднім словом для StriNg Oriented та symBOlic Language, і ваш код довший, ніж Brain-Flak :( тепер це трохи краще.

Рядок Bприймає Iта замінює (alphabetic characters saved as Y)(some number of spaces)порожній рядок.

Наступний рядок витягує останні 2 символів , Yяк Zі замінює їх в Zзворотному, а в наступному рядку зчіплюються O, Yі один символ пробілу.

Нарешті, він друкує, коли Iбільше не відповідає потрібному шаблону в рядку B.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.