Proste odbicie łańcucha

26

Zacznijmy od zdefiniowania odbicia znaku w ciągu:

Biorąc pod uwagę ciąg znaków z wyraźnymi małymi literami alfabetu bez spacji, np. abcdefgZdefiniuj odbicie litery w ciągu cjako przeniesienie go (bez zmiany kolejności jakiejkolwiek innej litery) w nowe miejsce w ciągu, tak aby liczba liter pierwotnie po prawej stronie jest teraz liczba liter po lewej stronie.

Zatem odbicie pisma cw abcdefgbędzie abdecfg. Objaśnienie: po prawej stronie były 4 litery, ca teraz po lewej stronie są 4 litery c.

Kilka innych przykładów:

Odbicie znaku ew myfriendutworzy ciągmyefrind

Odbicie znaku aw axyzutworzy ciąg xyza.

Odbicie znaku bw abcutworzy ciąg abc.

Odbicie znaku dw dutworzy ciąg d.

Odbicie znaku ew efutworzy ciąg fe.

Aby uzyskać więcej informacji lub wypróbować niektóre przypadki testowe, oto (nieco długi) program, który napisałem w C ++.

Wyzwanie

Biorąc pod uwagę ciąg z wyraźnymi małymi literami, przejrzyj każdy znak alfabetycznie i „odzwierciedlaj” go w ciągu.

Wyjaśnienia: Litery w ciągu pochodzą z a-z, nie ma spacji, litery są unikalne, a ciąg ma co najmniej 1 literę i co najwyżej 26 liter.

Przykłady

Wejście: dcba. Wyjście: dcba.

Powód: Po pierwsze, odzwierciedl to, aponieważ jest to znak w ciągu, który pojawia się najwcześniej w alfabecie. Dostaniesz adcb. Następnie zastanów się nad tym, bjak będzie dalej w alfabecie, aby uzyskać badc. Następnie zastanów się, caby dostać cbad, a następnie ddostać dcba.


Wejście: myface. Wyjście: fyecma.

Wskazówka: Przejrzyj litery w kolejności a, c, e, f, m, y.


Wejście: a. Wyjście: a.


Wejście: acb. Wyjście: bac.


Wejście: cwmfjordbankglyphsvextquiz. Wyjście: ieabhqzugdltkfnvpjxsormycw.

Punktacja

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je wydrukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
  • Akceptowanie ~ 100 godzin po wysłaniu.

Aktualny zwycięzca

NL628
źródło
2
Czy ktoś mógłby dać mi wgląd, czy ta łamigłówka jest w porządku? To mój drugi tutaj (mój pierwszy został zamknięty jako nie na temat ... ups). Próbowałem zrobić to naprawdę kompletnie, ale nie jestem pewien, czy coś mi umknęło. Naprawdę chciałbym się poprawić i dobrze się bawić na tym SE! Dzięki chłopaki: D
NL628
6
To wygląda dobrze. Mógłbym podać kilka dłuższych przykładów (w szczególności dobrze byłoby, gdyby w części dotyczącej pierwszych przykładów zaprezentowano więcej niż pozornie przypadkowe przypadki).
Esolanging Fruit
1
Żądanie wyjaśnienia: „ litery są unikalne ” oznaczają, że każda litera występuje tylko raz na wejściu, czy to prawda?
GPS
4
Czy możemy przyjmować dane wejściowe i wyjściowe wielkimi literami zamiast małych?
Kevin Cruijssen,
5
@ NL628 Nawiasem mówiąc, jeśli chcesz uzyskać wgląd w wyzwanie przed opublikowaniem go tutaj, opublikuj je w piaskownicy .
Erik the Outgolfer,

Odpowiedzi:

8

Brain-Flak , 188 bajtów

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

Wypróbuj online!

Oprócz odbić opisanych w specyfikacji wyzwania kod ten również odwraca ciąg dokładnie 26 razy. Nie ma to wpływu na końcową wydajność.

# 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
<>
Nitrodon
źródło
1
Wow, to jest niesamowite. Nawet tego nie rozumiem: O +1
NL628
7

05AB1E , 20 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

Na przykład dla pierwszej iteracji 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'

Ciąg jest otoczony spacjami przy każdej iteracji, ponieważ podział na pierwszą lub ostatnią literę ciągu spowoduje, że w przeciwnym razie powstanie lista długości 1, a scalenie nie będzie zawierało tej litery.

Emigna
źródło
1
17 bajtów?! ?? !! NIESAMOWITE ... ale mnemonic bije cię jednym bajtem: P
NL628
1
Mmmm ... Wow, jedyne, co mogłem zobaczyć, to usunięcie przestrzennego spacji. Wydaje się dziwne, że nie możemy znaleźć innej alternatywy.
Magic Octopus Urn
1
@MagicOctopusUrn: To najkrótszy sposób, w jaki udało mi się poradzić sobie z podziałem pierwszej lub ostatniej postaci. Jednak wydaje się, że to dużo bajtów
Emigna,
5

Pyth, 18 16 19 16 bajtów

VSQ=QXx_QN-QNN)Q

Wypróbuj tutaj

Wyjaśnienie

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.

źródło
Wow 16 bajtów? Chciałbym głosować, ale niestety osiągnąłem swój dzienny limit głosowania.
Wykonam za
4

Python 3 , 80 73 bajtów

Dzięki Esolanging Fruit za przypomnienie, że funkcje mogą wrócić, modyfikując swój argument.

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

Wypróbuj online!

Pobiera dane wejściowe jako listę znaków.

Jo King
źródło
3
Wow, napisałem również odpowiedź w C ++ i Python 3. Moja odpowiedź w Pythonie 3 była dokładnie dwa razy dłuższa niż twoja ... +1
NL628
3

Retina 0.8.2 , 61 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

$
a

Rozpocznij pętlę o a.

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

Jeśli dane wejściowe zawierają bieżącą literę, przenieś ją na koniec, ciąg znaków _s reprezentujący jej pierwotną pozycję.

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

Dla każdego _przesunięcia litera wstecz jedna postać.

}T`_l`l!`.$

Zwiększ list. Po zzmianie na !tak, aby nic nie pasowało, a pętla się kończy.

!

Usuń !.

Neil
źródło
3

Java 8, 140 96 92 88 87 85 bajtów

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

-44 bajty tworzą port odpowiedzi @TFeld na Python 2 .
-6 bajtów dzięki @ OlivierGrégoire .

Zmienia listę wejściową zamiast tworzyć nową.

Wyjaśnienie:

Wypróbuj online.

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)
Kevin Cruijssen
źródło
1
@ OlivierGrégoire Thanks. I jeszcze 1 pętla ponad więcej niż literami alfabetu. :)
Kevin Cruijssen
2
Cóż, jeśli pójdziesz tą drogą, for(char c=9;++c>1;)lepiej ;-)
Olivier Grégoire,
@ OlivierGrégoire Ah, oczywiście, charrównież obejmuje: Integer.MAX_VALUE + 1 == Integer.MIN_VALUEInteligentny!
Kevin Cruijssen
@ OlivierGrégoire sjest ArrayList, więc indexOfbędzie typu ogólnego T(dotyczy Charactertej listy danych wejściowych).
Kevin Cruijssen
3

JavaScript, 85 80 79 bajtów

-6 bajtów dzięki @DanielIndie

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

Wypróbuj online!

Esolanging Fruit
źródło
to nie „kompilacja” a jest ciągiem znaków i używasz splotu
DanielIndie 20.04.2018
@DanielIndie Dane wejściowe należy przekazywać jako tablicę znaków, podobnie jak rozwiązanie Python Jo Kinga.
Esolanging Fruit
80 bajtów
DanielIndie
nic nie
zwracasz
Funkcje @DanielIndie mogą zwracać, modyfikując ich argumenty.
Esolanging Fruit
2

Rubinowy , 51 bajtów

->s{s.sort.map{|c|s.insert~s.index(c),s.delete(c)}}

Wypróbuj online!

Zajmuje tablicę znaków

Zwraca przez modyfikację wejścia

Asone Tuhid
źródło
2

Czerwony , 96 94 bajtów

2 bajty zapisane dzięki 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]

Wypróbuj online!

Bardziej czytelny:

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
]
Galen Iwanow
źródło
1
Możesz zapisać 2 bajty, zmieniając find x c replace x c""insert at x i cna, find x c insert at replace x c""i caby pozbyć się xi spacji.
Kevin Cruijssen,
@Kevin Cruijssen Dziękuję, Kevin, teraz jest znacznie lepiej!
Galen Iwanow
2

R , 73 72 69 bajtów

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

Wypróbuj online!

Wprowadza i wyprowadza wektor znaków.

Kirill L.
źródło
ew, używając cjako nazwy zmiennej? to okropne, nawet dla golfa kodowego!
Giuseppe,
Cóż, oczywiście mogę to zmienić, ale jestem naprawdę zaskoczony, widząc, że to może przeszkadzać każdemu tutaj. Właściwie priorytetem jest raczej zachowanie sensu w nazwach zmiennych (jak cdla char) niż w nieużywanych wbudowanych.
Kirill L.,
Cóż, kiedy szukałem ulepszenia (czego nie zrobiłem), próbowałem go użyć c, a okropne było, gdy nie mogłem zrozumieć, co się dzieje. Zazwyczaj używam Klub knawet Cpo prostu unikam takich problemów, ale całkowicie to rozumiem. appendjest zdecydowanie odpowiednim narzędziem do pracy.
Giuseppe,
Och, rozumiem, przepraszam za to, spróbuję uniknąć ustawiania takich „pułapek” w przyszłości.
Kirill L.,
2

Perl 5 -p , 37 bajtów

#!/usr/bin/perl -p
for$a(a..z){s/$a//&&s/.{@{-}}$/$a$&/}

Wypróbuj online!

Ton Hospel
źródło
2

Japt , 23 22 bajtów

¬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.

Oszczędność jednego bajtu dzięki Oliverowi .
Wypróbuj online!

Gnida
źródło
1
Niezłe. Możesz zastąpić przezJ
Oliver
@Oliver Bardzo dziękuję, wciąż zapominam używać od czasu do czasu zmiennych domyślnych, co jest bardzo przydatne.
Nit
1

Haskell, 87 bajtów

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'..]

Wypróbuj online!

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             
nimi
źródło
Dlaczego to się kończy? Czy zwijanie nieskończonej listy nie powinno powodować nieskończonej pętli? Nie powinno tak być f s=foldl(#)s['a'..'z']?
user1472751,
1
@ user1472751: ['a'..]nie jest nieskończony, ponieważ Charnależy do klasy Bounded. Lista z ..]od Boundedwartości zatrzymuje się maxBound. Spróbuj: print [False ..].
nimi
1

SNOBOL4 (CSNOBOL4) , 132 128 bajtów

	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)

Wypróbuj online!

Prosta implementacja wymaganego algorytmu. Zapisano kilka bajtów, przełączając się na funkcję zamiast na pełny program; wyjaśnienie pozostaje mniej więcej takie samo.

	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
Giuseppe
źródło
1

Galaretka ,  12  11 bajtów

W;ṢḟṁUṣ¥jʋ/

Monadyczny link przyjmujący listę znaków i zwracający listę znaków.

Wypróbuj online!

W jaki sposób?

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"
Jonathan Allan
źródło
Okej, ten prawie wszystko niszczy ...
NL628,
1
Cóż, myślę, że do tego właśnie służy Jelly - w połowie oczekuję, że Dennis (twórca Jelly) przedstawi krótszy!
Jonathan Allan,
Lol, to całkiem niesamowite: P, ale nie mogę głosować b / c Zużyłem mój codzienny licznik głosów ..rip
NL628
1
... Myślę, że może istnieć sposób na zaoszczędzenie bajtu przy użyciu (odfiltruj), ale jeszcze go nie zarządzałem.
Jonathan Allan,
1
wygląda na to, że pod względem czasu jest to O (n log n) w długości danych wejściowych, ponieważ najpierw używa Pythona, sorteda następnie przechodzi przez iteracje mniej skomplikowanych operacji (spłaszczanie, dzielenie przy znalezionych indeksach, łączenie, cofanie ). - a Python sortedto O (n log n).
Jonathan Allan,
1

C (clang) , 164 162 bajty

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++;}

Wypróbuj online!

f() pobiera tablicę znaków zawierającą łańcuch wejściowy i długość tej tablicy jako parametry i wykonuje wymagane odbicia na miejscu.

callf() ładnie drukuje.

Kredyty

-2 bajty. @Kevin. Dzięki

GPS
źródło
1
Możesz usunąć miejsce char *si zmienić i=96na, i=9aby zapisać 2 bajty.
Kevin Cruijssen
Dobry połów .. nie musimy zaczynać a. Dzięki
GPS
144 bajty
ceilingcat
1

APL + WIN, 63 bajty

Monity o ciąg wejściowy

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

Wyjaśnienie:

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
Graham
źródło
1

Perl , 74 70 bajtów

84 80 bajtów, w tym wywołanie jako filtr uniksowy

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
Hynek-Pichi- Vychodil
źródło