Простое Строковое Отражение


26

Давайте начнем с определения отражения символа в строке:

Для заданной строки с различными строчными буквами алфавита без пробелов, таких как abcdefg, определите отражение буквы в строке cкак перемещение ее (без изменения порядка любой другой буквы) на новое место в строке таким образом, чтобы количество букв изначально справа от него теперь число букв слева от него.

Таким образом, отражение буквы cв abcdefgбудет abdecfg. Пояснение: справа от 4 было 4 буквы, cа теперь слева от 4 буквы c.

Еще несколько примеров:

Отражение символа eв myfriendобразует строкуmyefrind

Отражение символа aв axyzбудет формировать строку xyza.

Отражение символа bв abcбудет формировать строку abc.

Отражение символа dв dбудет формировать строку d.

Отражение символа eв efбудет формировать строку fe.

Для получения дополнительной информации или для тестирования некоторых тестов, вот (довольно длинная) программа, которую я написал на C ++.

Соревнование

Получив строку с разными строчными буквами, пройдите каждый символ в алфавитном порядке и «отразите» его в строке.

Пояснения: буквы в строке взяты a-z, пробелов нет, буквы уникальны, длина строки не менее 1 буквы и не более 26 букв.

Примеры

Вход: dcba. Выход: dcba.

Причина: во-первых, отразите aв строке самый ранний символ алфавита. Вы получите adcb. Затем, отразить, bкак это идет дальше в алфавите, чтобы получить badc. Затем отразите, cчтобы получить cbad, а затем, dчтобы получить dcba.


Вход: myface. Выход: fyecma.

Подсказка: просмотрите буквы в порядке a, c, e, f, m, y.


Вход: a. Выход: a.


Вход: acb. Выход: bac.


Вход: cwmfjordbankglyphsvextquiz. Выход: ieabhqzugdltkfnvpjxsormycw.

счет

  • Вход и выход могут быть заданы любым удобным способом .
  • Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
  • Принятие ~ 100 часов после публикации.

Текущий Победитель


2
Может ли кто-нибудь дать мне понимание того, что эта головоломка в порядке? Это мой второй здесь (мой первый был закрыт как не по теме ... упс) Я пытался сделать это действительно полным, но я не уверен, что я что-то упустил. Я бы очень хотел улучшить и повеселиться на этом SE! Спасибо, ребята: D
NL628

6
Это выглядит хорошо. Я мог бы привести несколько более длинных примеров (в частности, в первом разделе примеров было бы лучше представить больше, чем, казалось бы, крайние случаи).
Esolanging Fruit

1
Запрос на уточнение: « буквы уникальны » означает, что каждая буква встречается только один раз при вводе, верно?
GPS

4
Можем ли мы взять ввод и вывод в верхнем регистре вместо строчных?
Кевин Круйссен,

5
@ NL628 Кстати, если вы хотите получить представление о вызове, прежде чем размещать его здесь, разместите его в Песочнице .
Эрик Outgolfer

Ответы:


8

Brain-Flak , 188 байт

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

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

В дополнение к отражениям, описанным в спецификации вызова, этот код также меняет строку ровно 26 раз. Это не влияет на конечный результат.

# Push 26
<>((((()()()){}){}()){})

# Do 26 times:
{(({}[()])<

  # Subtract 122 from counter to get negative lowercase letter
  ({}[(((((()()()()()){}){}){})()){}{}])

  # For each character in string:
  <>{

    # Keep a copy of pivot letter on the third stack
    <>(({})<

    # Move next letter to other stack and compare to pivot
    ({}<>({}<>))

    # If letters are equal:
    ((){[()](<{}>)}{}){

      # Keep current letter separate from this transformation
      {}(<({}<

      # While keeping a copy of current stack height:
      ([]<

        # Move all letters to one stack
        <>{({}<>)<>}<>

      >)

      # Move a number of letters equal to old stack height back
      {({}[()]<({}<>)<>>)}{}

      >)>)

    }{}>)<>

  }

  # Destroy pivot letter
  <>{}<>

>)}

# Switch stack for output
<>

1
Вау, это довольно удивительно. Я даже не могу этого понять: O +1
NL628

7

05AB1E , 20 17 байт

{vð.øy¡€á€gsJ£yý

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

объяснение

С примером для первой итерации myface

{v                  # for each char y in sorted input
  ð.ø               # surround current string with spaces
                    # STACK: ' myface '
     y¡             # split at current letter
                    # STACK: [' myf', 'ce ']
       ۇ           # remove non-letters
                    # STACK: ['myf','ce']
         €g        # get the length of each string in the pair, reversed
                    # STACK: ['myf','ce'], [2,3]
            sJ      # join the pair back to a string
              £     # split into 2 pieces of the calculated sizes
                    # STACK: ['my','fce']
               yý   # join on the current char y
                    # STACK: 'myafce'

Строка окружена пробелами в каждой итерации, так как разбиение по первой или последней букве строки приведет к получению списка длины 1, иначе объединение не будет включать эту букву.


1
17 байт?! ?? !! УДИВИТЕЛЬНО .. пока мнемоника бьет вас всего одним байтом: P
NL628

1
Мммм ... Ничего себе, единственное, что я мог видеть, это убирать окружение с пробелами. Кажется странным, что мы не можем найти другую альтернативу этому.
Волшебная Урна Осьминога

1
@MagicOctopusUrn: Я нашел самый короткий способ обработки разбиения первого или последнего символа.
Впрочем,

5

Pyth, 18 16 19 16 байтов

VSQ=QXx_QN-QNN)Q

Попробуй здесь

объяснение

VSQ=QXx_QN-QNN)Q
VSQ           )       For each character (N) in the sorted input (Q)...
          -QN         ... remove the character from Q...
      x_QN            ... get the reflected position...
     X       N        ... insert N...
   =Q                 ... and save the result into Q.
               Q      Output the final result.

Вау 16 байт? Я бы проголосовал, но, к сожалению, я достиг своего дневного лимита голосования. Будет делать через 6 часов: P
NL628

4

Python 3 , 80 73 байта

Спасибо Esolanging Fruit за напоминание о том, что функции могут возвращаться, изменяя свои аргументы.

lambda x:[x.insert(len(x)+~x.index(i),x.remove(i)or i)for i in sorted(x)]

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

Вводит в виде списка символов.


3
Ничего себе я написал ответ также на C ++ и Python 3. Мой ответ на Python 3 был ровно вдвое длиннее вашего ... +1
NL628


3

Сетчатка 0.8.2 , 61 байт

$
a
{`(.)(.*)\1$
$2$.`$*_$1$1
+`(.)_(_*.)
$2$1
}T`_l`l!`.$
!

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

$
a

Начните цикл в a.

{`(.)(.*)\1$
$2$.`$*_$1$1

Если вход содержит текущую букву, переместите ее в конец, где строка _s представляет ее исходную позицию.

+`(.)_(_*.)
$2$1

За каждое _перемещение буквы назад на один символ.

}T`_l`l!`.$

Увеличить букву. После того, как zизмените его на !так, чтобы он не соответствовал ничему, и цикл заканчивается.

!

Удалить !.


3

Java 8, 140 96 92 88 87 85 байт

s->{for(char c=9;++c>0;){int i=s.indexOf(c);if(i>=0)s.add(s.size()+~i,s.remove(i));}}

-44 байта, создающие порт ответа @TFeld 's Python 2 .
-6 байт благодаря @ OlivierGrégoire .

Изменяет список ввода вместо создания нового.

Объяснение:

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

s->{                     // Method with ArrayList<Character> parameter and no return-type
  for(char c=9;++c>0;){  //  Loop over all characters known
                         //  (except for the first 9 unprintables)
    int i=s.indexOf(c);  //   Index of the character, or -1 of it isn't present
    if(i>=0)             //   If the current character is present in the List
      s.add(s.size()+~i,s.remove(i));}}
                         //    Change the position of this character to index `l-i-1`,
                         //    (where `l` is the size of the input-List)


1
@ OlivierGrégoire Спасибо. И еще 1 зацикливание не только на буквенных символах. :)
Кевин Круйссен

2
Ну, если ты идешь по этому пути, for(char c=9;++c>1;)лучше ;-)
Оливье Грегуар

@ OlivierGrégoire Ну, конечно, charтакже обволакивает, как Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. Smart!
Кевин Круйссен,

@ OlivierGrégoire s- это ArrayList, поэтому он indexOfбудет иметь универсальный тип T( Characterдля этого списка ввода).
Кевин Круйссен,

3

JavaScript, 85 80 79 байт

-6 байт благодаря @DanielIndie

a=>[...a].sort().map(i=>a.splice(s=a.indexOf(i),1)&&a.splice(a.length-s,0,i))&&a

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


это не «компилирует» a - это строка, и вы используете соединение
DanielIndie

@DanielIndie Ввод должен быть передан в виде массива символов, как и решение Python от Jo King.
Esolanging Fruit


вы ничего не возвращаете из этой функции или не печатаете
DanielIndie

@DanielIndie Функции могут возвращаться, изменяя свои аргументы.
Esolanging Fruit


2

Красный , 96 94 байта

2 байта сохранены благодаря Кевину Круйссену

func[x][foreach c sort copy x[i:(length? x)+ 1 - index? find x c insert at replace x c""i c]x]

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

Более читабельно:

f: func[x][
    foreach c sort copy x[                  ; for each symbol in the sorted input
       i: (length? x) + 1 - index? find x c ; find its index and reflect it 
       insert at replace x c "" i c         ; remove it by replacing it with an empty char 
                                            ; and insert the symbol at its new index   
    ]
    x                                       ; return the transformed string
]

1
Вы можете сохранить 2 байта, изменив find x c replace x c""insert at x i cдля , find x c insert at replace x c""i cчтобы избавиться от xи пространства.
Кевин Круйссен

@Kevin Cruijssen Спасибо, Кевин, теперь стало намного лучше!
Гален Иванов

2

R , 73 72 69 байт

function(s){for(x in sort(s))s=append(s[x!=s],x,match(x,rev(s))-1);s}

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

Вводит и выводит вектор символов.


EW, используя cв качестве имени переменной? это ужасно, даже для кода гольф!
Джузеппе

Ну, я могу изменить это, но я очень удивлен, увидев, что это может кого-нибудь беспокоить. Я на самом деле склонен отдавать приоритет сохранению некоторого смысла в именах переменных (например, cдля char), а не в неиспользуемых встроенных модулях.
Кирилл Л.

ну, когда я искал улучшения (которое я не сделал), я обнаружил, что пытаюсь его использовать c, и это было ужасно, когда я не мог понять, что происходит. Я обычно использую Kили, kили даже Cпросто, чтобы избежать подобных проблем, но я полностью понимаю. appendявляется правильным инструментом для работы.
Джузеппе

О, я вижу, извините за это, постараюсь не ставить такие «ловушки» в будущем.
Кирилл Л.


2

Japt , 23 22 байта

¬n rÈ+S kY iYJ-XbY)x}U
¬n                     // Split the input into chars and sort it.
   r                }U // Then reduce the result with initial value of the input.
    È+S                // Append a space for replacing edge cases and
        kY             // remove the current char from the string.
           iY          // Insert it back
             J-XbY     // at the calculated index,
                  )x   // and remove the unnecessary space once we're done.

Спасен один байт благодаря Оливеру .
Попробуйте онлайн!


1
Хороший. Вы можете заменить наJ
Оливер

@Oliver Большое спасибо, я все еще забываю время от времени использовать переменные по умолчанию, это очень удобно.
Ночь

1

Haskell, 87 байт

s#c|(h,_:t)<-span(/=c)s,(v,w)<-splitAt(length t)$h++t=v++c:w|1<2=s
f s=foldl(#)s['a'..]

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

f s=foldl(#)s['a'..]         -- fold the function '#' into all characters from 'a'
                              -- with the starting value of the input string s
s#c=                          -- in each step (s: result so far, c: next char)
   (h,_:t)<-span(/=c)s        -- let 'h' be the substring before 'c' and
                              -- 't' the substring after 'c'. the pattern match
                              -- fails if there's no 'c' in 's'
   (v,w)<-splitAt(length t)$h++t
                              -- split the string 'h++t' at index length of t
   =v++c:w                    -- return 'v' followed by 'c' followed by 'w'
   |1<2=s                     -- if there's no 'c' in 's', return 's' unchanged             

Почему это останавливается? Не должно ли сворачивание бесконечного списка вызвать бесконечный цикл? Не должно ли это быть f s=foldl(#)s['a'..'z']?
user1472751

1
@ user1472751: ['a'..]не является бесконечным, потому что Charпринадлежит классу Bounded. Список с ..]из Boundedзначений останавливается maxBound. Попробуйте: print [False ..].
Ними,

1

SNOBOL4 (CSNOBOL4) , 132 128 байтов

	DEFINE('I(I)')
I	U =&LCASE
N	U LEN(1) . K REM . U	:F(RETURN)
	I ARB @S K	:F(N)
	I K =
	I ARB . L RPOS(S) REM . R
	I =L K R	:(N)

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

Простая реализация необходимого алгоритма. Сохранение нескольких байтов путем переключения на функцию, а не на полную программу; объяснение остается тем же, более или менее.

	I =INPUT			;* read input
	U =&LCASE			;* alias for lowercase letters (it started out as uppercase)
N	U LEN(1) . K REM . U	:F(O)	;* set K to the next lowercase letter, and when empty, goto O
	I ARB @S K	:F(N)		;* set S to the number of letters before K, or goto N
	I K =				;* remove K
	I ARB . L RPOS(S) REM . R	;* set R to the last S characters of I and L to the others
	I =L K R	:(N)		;* recombine the string and goto N
O	OUTPUT =I			;* print new string
END

1

Желе ,  12  11 байт

W;ṢḟṁUṣ¥jʋ/

Монадическая ссылка, принимающая список символов и возвращающая список символов.

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

Как?

W;ṢḟṁUṣ¥jʋ/ - Link: list of characters V  e.g. "myface"  ...i.e. ['m','y','f','a','c','e']
W           - wrap V in a list                 ["myface"]
  Ṣ         - sort V                           ['a','c','e','f','m','y']
 ;          - concatenate                      ["myface",'a','c','e','f','m','y']
          / - reduce with:
         ʋ  -   last four links as a dyad:
            -   (i.e. start with "myface" on the left and 'a' on the right 
            -         2nd iteration has that result on the left and 'c' on the right
            -         and so-forth)            e.g. left = myface, right = 'a'
   ḟ        -     filter out (right from left)      "myfce"
       ¥    -     last two links as a dyad:
     U      -       upend left                      "ecafym"
      ṣ     -       split at occurrences of right   ["ec","fym"]
    ṁ       -     mould (ḟ(x,y)) like (Uṣ¥(x,y))    ["my","fce"] 
         j  -   join with right                   "myafce"

Хорошо, этот в значительной степени разрушает все остальное ...
NL628

1
Ну, я думаю, это то, для чего нужен Jelly - я ожидаю, что Деннис (создатель Jelly) представит более короткий вариант!
Джонатан Аллан

Lol, это довольно удивительно: P, но я не могу поднять голос, потому что я использовал свой ежедневный подсчет голосов .rip
NL628

1
... Я думаю, что может быть способ сохранить байт с помощью (отфильтровать), но я еще не справился с этим.
Джонатан Аллан

1
По времени это выглядит как O (n log n) по длине входных данных, поскольку сначала он использует Python, sortedа затем выполняет n итераций менее сложных операций (сглаживание, разбиение по найденным индексам, объединение, обращение ). - и Python sortedэто O (n log n).
Джонатан Аллан

1

С (лязг) , 164 162 байт

y,n,a,b,c,p,i;f(char*s,l){for(i=0;p=0,++i<123;p<l&&(y=s[p],n=l+~p,a=p+1,b=p,n<p&&(a=n,b=n+1),c=l+~(2*(n<p?n:p)),memmove(s+b,s+a,c),s[n]=y))while(s[p]^i&&p<l)p++;}

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

f() принимает массив символов, содержащий входную строку и длину этого массива, в качестве параметров и выполняет необходимые отражения на месте.

callf() делает симпатичную печать.

кредиты

-2 байта. @Kevin. Благодарность


1
Вы можете удалить пробел в char *sи изменения i=96в , i=9чтобы сохранить 2 байта.
Кевин Круйссен,

Хороший улов .. нам не нужно начинать с a. Спасибо
GPS


1

APL + WIN, 63 байта

Запрашивает ввод строки

l←s[⍋⎕av⍳s←,⎕]⋄⍎∊(⍴s)⍴⊂'s←(n←⌽~s=↑l)\s~↑l⋄((~n)/s)←↑l⋄l←1↓l⋄'⋄s

Объяснение:

l←s[⍋⎕av⍳s←,⎕] sort characters into alphabetical order

⍎∊(⍴s)⍴⊂'....' create an implicit loop for each character

s←(n←⌽~s=↑l)\s~↑l⋄((~n)/s)←↑l do the relection for first character in l

l←1↓l drop the first character in l

s display the result

⋄ statement separator

1

Perl , 74 70 байт

84 80 байт, включая вызов в качестве фильтра Unix

for$c(a..z){if($p=1+index$_,$c){substr$_,$p-1,1,"";substr$_,-$p,0,$c}}
$ echo -e 'dcba\nmyface\na\nacb\ncwmfjordbankglyphsvextquiz' |
> perl -pE'for$c(a..z){if($p=1+index$_,$c){substr$_,$p-1,1,"";substr$_,-$p,0,$c}}'
dcba
fyecma
a
bac
ieabhqzugdltkfnvpjxsormycw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.