Просте струнне відображення


26

Почнемо з визначення відображення символу в рядку:

Дано рядок з чіткими малими літерами з алфавітом без пробілів, наприклад abcdefg, визначте відображення букви в рядку cяк переміщення її (не змінюючи порядок жодної іншої літери) на нове місце в рядку, таким чином, що кількість букв спочатку Праворуч від неї зараз кількість літер зліва від неї.

Таким чином, відображення листи cв abcdefgбуде abdecfg. Пояснення: справа було від c4 букв, а ліворуч від 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 До речі, якщо ви хочете ознайомитись із проблемою, перш ніж розміщувати її тут, опублікуйте її в пісочниці .
Ерік Аутгольфер

Відповіді:


8

Мозок-Флак , 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: Це найкоротший шлях, який я знайшов для розколу першого або останнього символу. Це відчуває як багато байтів саме для цього, хоча
Emigna

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 байт? Я б підтримав, але, на жаль, я досяг свого щоденного ліміту голосування.
Зробимо

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 була рівно вдвічі
довшою,


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.. Смарт!
Кевін Кройсейсен

@ 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 Input слід передавати як масив символів, подібно до рішення Python Джо Кінга.
Esolanging Fruit


ви нічого не повертаєте з цієї функції або друкуєте її
DanielIndie

@DanielIndie Функції можуть повернутися, змінивши свої аргументи.
Esolanging Fruit


2

Червоний , 96 94 байт

2 байти збережено завдяки Kevin Cruijssen

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']?
користувач1472751

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
Ну, я думаю, що саме для цього потрібен Джеллі - я наполовину очікую, що Деніс (творець Желі) подасть коротший!
Джонатан Аллан

Lol, що досить дивовижно: P, але я не можу підняти b / c. Я використав свій щоденний підрахунок голосів ..
NL628

1
... Я думаю, що може бути спосіб зберегти байт за допомогою (відфільтрувати), але я ще не впорався з цим.
Джонатан Аллан

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

1

C (стук) , 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() приймає char-масив, що містить вхідний рядок і довжину цього масиву, як параметри та виконує необхідні відображення на місці.

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.