Flippign Lettesr Aroudn


33

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

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

  • Строка / список символов, которые вы получаете в качестве входных данных, гарантированно содержат только буквенные символы и пробелы (ASCII [97 - 122], [65 - 90] и 32).

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

  • Вывод может иметь один завершающий пробел и / или один завершающий символ новой строки.

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

Это код-гольф, поэтому выигрывает самая короткая подача (в байтах) на каждом языке!

Контрольные примеры

Обратите внимание, что строки заключены в кавычки для удобства чтения.

Вход -> Выход

"Thansk" -> "Спасибо"
"Youer Welcoem" -> "Добро пожаловать"
"Это яблоко" -> "Thsi si na appel"
"Flippign Lettesr Aroudn" -> "Листать буквы вокруг"
"ЗАДАЧА ВЫЗОВА С ОБМЕННЫМИ БУКВАМИ" -> "ЗАДАЧА С ЗАМЕНАМИ БУКВ"

Или, для удобства набора тестов, здесь отдельно представлены входы и соответствующие им выходы:

Thansk
Youer Welcoem
Это яблоко
Flippign Lettesr Aroudn
ШАЛЕНЕГ С ОБМЕНАМИ
Благодарность
Пожалуйста
Это на апелляция
Листать буквы
С ОДНОВРЕМЕННОЙ ЗАДАЧЕЙ

Спасибо DJMcMayhem за титул. Первоначально это была CMC .


Можем ли мы вывести массив слов?
Лохматый

@ Shaggy Нет, выходные данные должны быть строкой (или списком символов по умолчанию)
г-н Xcoder

Можем ли мы запросить пробел на каждом входе?
FlipTack

@FlipTack Это было разрешено в начальной версии, но я удалил это правило до того, как был опубликован любой из ответов, которые будут использовать, которые были опубликованы. (отчасти потому, что некоторые пользователи в чате говорили мне, что в противном случае я делаю это слишком легко, и я с ними согласен). Нет, это не разрешено
г-н Xcoder

1
@Fabian Слово - это последовательность из двух или более букв
Mr. 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 вики использует слово «рекурсивно» для описания òкоманды 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

Brain-Flak , 122 байта

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

Попробуйте онлайн!

Худший язык для работы :)

Читаемая Чуть более читаемая версия:

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

    {
        {}
        <>

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

        (<>)
    }
    {}

    ({}<>)<>

}<>

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

{

    ({}<>)
    <>
}<>

Я не могу поверить, что это дольше, чем версия Brainfuck ...
Pureferret

@pureferret Brain-flak, как правило, длиннее, чем мозговой. Главным образом потому, что на примитивную команду требуется два байта, а мозговому флаку - два.
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 = это. Был. Эпическая! Я думаю, что вы должны опубликовать этот ответ, так как он полностью отличается от моего. Единственное, что Matlab ссылается на совпадения $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

Wolfram Language , 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
regex гораздо эффективнее: попробуйте онлайн!
Джузеппе

(не то, чтобы я не ценил смелость, необходимую для подхода к манипулированию чистой строкой в ​​R)
Джузеппе


@ Джузеппе Вау, хорошая работа! Я отредактировал их в своем ответе, хотя, если вы хотите сделать свой собственный ответ, пожалуйста!
rturnbull

1
нет, не беспокойся об этом Я проиграл еще 10 байтов: портировал еще один подход регулярного выражения и 70 байтов вашего старого подхода
Джузеппе

4

APL (Dyalog Classic) , 28 байтов

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

⎕MLи ⎕IOоба 1,

Попробуйте онлайн!

объяснение

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

вернуть все, кроме первого
Адам



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 Да! Я написал полную версию, а затем сжал ее, но не заметил этого. Спасибо вам.
Zerquix18

Открытые теги PHP могут быть опущены в ответе, экономя 6 байтов.
Даниэль В.

Интересно, fgets(STDIN)можно ли его опустить или заменить $x, например, не все ответы учитывают входные данные для их ответов
Даниэль В.

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 отвечает , после того, как я забил два байта. РЕДАКТИРОВАТЬ: я вижу, что теперь это порт ответа Neil Retina после моих двух байтов в гольф.

Объяснение:

Попробуйте онлайн.

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 байта

Функция анонимного рабочего листа, которая принимает входные данные из ячейки A1и выводит их в вызывающую ячейку

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

-2 байта Спасибо @KevinCruijssen за использование (.)более(\w)


Оба (\w)могут быть в гольф, (.)если я не ошибаюсь. \bУже признак , чтобы искать только слова. (Не совсем уверен, хотя, но это работает на Java.)
Кевин Круйссен

@KevinCruijssen - Вы абсолютно правы, это может быть. Спасибо!
Тейлор Скотт

1

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

s => s.replace (/ (.) (.) (| $) / г, "$ 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 Кстати, мой первоначальный ответ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")той же длины
l4m2

1

K (ок) , 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 байт
Даниэль В.

2
@DanFromGermany Нет, 05AB1E имеет кодовую страницу, в которой это может быть представлено как 8 байтов.
Эрик Outgolfer

Можете ли вы запустить программу, представленную в 8 байтов?
Даниэль В.

@DanFromGermany Да, интерпретатор 05AB1E может запустить эту программу из файла в кодировке 05AB1E.
Эрик Outgolfer

1
@MagicOctopusUrn Это не список, а после `.
Эрик Outgolfer


0

СНОБОЛ4 (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.