Einfache Stringreflexion

26

Beginnen wir mit der Definition einer Reflexion eines Zeichens in einer Zeichenfolge:

Definieren Sie bei einer Zeichenfolge mit eindeutigen alphabetischen Kleinbuchstaben ohne Leerzeichen abcdefgeine Reflektion eines Buchstabens in der Zeichenfolge cals Verschieben (ohne die Reihenfolge eines anderen Buchstabens zu ändern) an eine neue Stelle in der Zeichenfolge, sodass die Anzahl der ursprünglichen Buchstaben erhalten bleibt rechts davon steht nun die anzahl der buchstaben links davon.

Somit wird eine Reflexion des Schreibens cin abcdefgwäre abdecfg. Erklärung: Es waren 4 Buchstaben rechts cund jetzt sind es 4 Buchstaben links von c.

Einige weitere Beispiele:

Das Reflektieren des Zeichens ein myfriendwürde die Zeichenfolge bildenmyefrind

Das Reflektieren des Zeichens ain axyzwürde die Zeichenfolge bilden xyza.

Das Reflektieren des Zeichens bin abcwürde die Zeichenfolge bilden abc.

Das Reflektieren des Zeichens din dwürde die Zeichenfolge bilden d.

Das Reflektieren des Zeichens ein efwürde die Zeichenfolge bilden fe.

Für weitere Informationen oder um einige Testfälle auszuprobieren, ist hier ein (etwas langes) Programm, das ich in C ++ geschrieben habe.

Die Herausforderung

Gehen Sie bei einer Zeichenfolge mit unterschiedlichen Kleinbuchstaben jedes Zeichen alphabetisch durch und "reflektieren" Sie es in der Zeichenfolge.

Erläuterungen: Die Buchstaben in der Zeichenfolge sind aus a-z, es gibt keine Leerzeichen, die Buchstaben sind eindeutig und die Zeichenfolge ist mindestens 1 Buchstabe und höchstens 26 Buchstaben lang.

Beispiele

Input: dcba. Ausgang: dcba.

Grund: Reflektieren aSie zunächst das Zeichen in der Zeichenfolge, das im Alphabet am frühesten kommt. Du wirst bekommen adcb. Dann reflektiere das, bwie es als nächstes im Alphabet kommt, um es zu bekommen badc. Dann reflektiere das czu bekommen cbadund dann das dzu bekommen dcba.


Input: myface. Ausgang: fyecma.

Tipp: Gehen Sie die Buchstaben in der Reihenfolge durch a, c, e, f, m, y.


Input: a. Ausgang: a.


Input: acb. Ausgang: bac.


Input: cwmfjordbankglyphsvextquiz. Ausgang: ieabhqzugdltkfnvpjxsormycw.

Wertung

  • Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
  • Annahme ~ 100 Stunden nach der Veröffentlichung.

Aktueller Gewinner

NL628
quelle
2
Kann mir jemand einen Einblick geben, ob dieses Puzzle in Ordnung ist? Es ist meine zweite hier (meine erste war als Off-Topic geschlossen ... whoops). Ich habe versucht, es wirklich zu vervollständigen, bin mir aber nicht sicher, ob mir etwas fehlt. Ich möchte mich wirklich verbessern und Spaß an dieser SE haben! Danke Jungs: D
NL628
6
Das sieht gut aus. Ich könnte einige längere Beispiele nennen (insbesondere ist es gut, wenn der erste Abschnitt der Beispiele mehr als nur scheinbare Randfälle enthält).
Esolanging Fruit
1
Bitte um Klarstellung: " Die Buchstaben sind eindeutig " bedeutet, dass jeder Buchstabe nur einmal in der Eingabe vorkommt. Ist das richtig?
GPS
4
Können wir die Eingabe und Ausgabe in Großbuchstaben statt in Kleinbuchstaben schreiben?
Kevin Cruijssen
5
@ NL628 Übrigens, wenn Sie einen Einblick in eine Herausforderung erhalten möchten, bevor Sie sie hier veröffentlichen, dann veröffentlichen Sie sie in der Sandbox .
Erik der Outgolfer

Antworten:

8

Brain-Flak , 188 Bytes

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

Probieren Sie es online!

Zusätzlich zu den in der Herausforderungsspezifikation beschriebenen Überlegungen kehrt dieser Code die Zeichenfolge genau 26 Mal um. Dies hat keine Auswirkung auf die endgültige Ausgabe.

# 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
quelle
1
Wow, das ist ziemlich erstaunlich. Ich kann es nicht einmal verstehen: O +1
NL628
7

05AB1E , 20 17 Bytes

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

Probieren Sie es online!

Erläuterung

Mit Beispiel für die erste Iteration von 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'

Die Zeichenfolge ist bei jeder Iteration mit Leerzeichen umgeben, da die Aufteilung auf den ersten oder letzten Buchstaben der Zeichenfolge andernfalls zu einer Liste der Länge 1 führt und die Zusammenführung diesen Buchstaben nicht enthält.

Emigna
quelle
1
17 Bytes?! ?? !! AMAZING..yet Mnemonic schlägt Sie nur um ein Byte: P
NL628
1
Mmmm ... Wow, ich konnte nur die Einfassung mit Leerzeichen entfernen. Scheint seltsam, dass wir keine Alternative dazu finden können.
Magic Octopus Urn
1
@MagicOctopusUrn: Es ist der kürzeste Weg, wie ich mit einer Aufteilung des ersten oder letzten Zeichens umgegangen bin. Es fühlt sich aber wie eine Menge Bytes an
Emigna
5

Pyth, 18 16 19 16 Bytes

VSQ=QXx_QN-QNN)Q

Probieren Sie es hier aus

Erläuterung

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.

quelle
Wow 16 Bytes? Ich würde zustimmen, aber leider habe ich mein tägliches Abstimmungslimit erreicht. Wird in 6 Stunden zu tun: P
NL628
4

Python 3 , 80 73 Bytes

Vielen Dank an Esolanging Fruit, das mich daran erinnert hat, dass Funktionen durch Ändern ihres Arguments zurückkehren können.

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

Probieren Sie es online!

Übernimmt die Eingabe als Liste von Zeichen.

Scherzen
quelle
3
Wow, ich habe auch eine Antwort in C ++ und Python 3 geschrieben. Meine Python 3-Antwort war genau doppelt so lang wie Ihre ... +1
NL628
3

Retina 0.8.2 , 61 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

$
a

Starten Sie die Schleife bei a.

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

Wenn die Eingabe den aktuellen Buchstaben enthält, verschieben Sie ihn an das Ende, wobei eine Zeichenfolge von _s die ursprüngliche Position darstellt.

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

Für jeden _Zug rückt der Buchstabe ein Zeichen zurück.

}T`_l`l!`.$

Erhöhe den Buchstaben. Nachdem Sie zes auf a geändert haben, !stimmt es mit nichts überein und die Schleife endet.

!

Löschen Sie die !.

Neil
quelle
3

Java 8, 140 96 92 88 87 85 Bytes

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

-44 Bytes, die einen Port von @TFelds Python 2-Antwort erstellen .
-6 Bytes dank @ OlivierGrégoire .

Ändert die Eingabeliste, anstatt eine neue zu erstellen.

Erläuterung:

Probieren Sie es online aus.

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
quelle
1
@ OlivierGrégoire Danke. Und 1 Schleife mehr als nur die Buchstaben. :)
Kevin Cruijssen
2
Nun, wenn Sie diesen Weg gehen, for(char c=9;++c>1;)ist es besser ;-)
Olivier Grégoire
@OlivierGrégoire Ah natürlich charauch gerne umwickelt Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. Schlau !
Kevin Cruijssen
@ OlivierGrégoire sist eine ArrayList, also indexOfein generischer Typ T( Characterfür diese Eingabeliste).
Kevin Cruijssen
3

JavaScript, 85 80 79 Bytes

-6 Bytes dank @DanielIndie

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

Probieren Sie es online!

Esolanging Fruit
quelle
dies "kompiliert" nicht a ist eine Zeichenfolge und Sie verwenden Spleiß
DanielIndie
@DanielIndie Die Eingabe sollte wie bei Jo Kings Python-Lösung als Array von Zeichen übergeben werden.
Esolanging Fruit
80 Bytes
DanielIndie
Sie geben nichts von dieser Funktion zurück oder drucken es aus
DanielIndie
@DanielIndie Funktionen können zurückgeben, indem Sie ihre Argumente ändern.
Esolanging Fruit
2

Ruby , 51 Bytes

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

Probieren Sie es online!

Nimmt eine Reihe von Zeichen

Kehrt durch Ändern der Eingabe zurück

Asone Tuhid
quelle
2

Rot , 96 bis 94 Bytes

Kevin Cruijssen hat 2 Bytes gespart

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

Probieren Sie es online!

Besser lesbar:

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 Ivanov
quelle
1
Sie können 2 Bytes speichern , indem Sie find x c replace x c""insert at x i cauf find x c insert at replace x c""i closzuwerden eine bekommen xund Raum.
Kevin Cruijssen
@ Kevin Cruijssen Danke, Kevin, es ist jetzt viel besser!
Galen Ivanov
2

R , 73 72 69 Bytes

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

Probieren Sie es online!

Eingabe und Ausgabe eines Zeichenvektors.

Kirill L.
quelle
ew, cals Variablennamen verwenden? Das ist schrecklich, auch für Code Golf!
Giuseppe
Nun, ich kann es natürlich ändern, aber ich bin wirklich überrascht zu sehen, dass es hier niemanden stören könnte. Eigentlich gebe ich eher Wert darauf, in Variablennamen (wie cfür char) einen Sinn zu bewahren als in nicht verwendeten eingebauten Funktionen.
Kirill L.
Nun, als ich nach einer Verbesserung suchte (was ich nicht tat), bemühte ich mich, sie zu nutzen c, und es war schrecklich, als ich nicht herausfinden konnte, was passierte. Ich benutze normalerweise Koder koder auch Cnur Probleme wie das zu vermeiden, aber ich es total bekommen. appendist auf jeden Fall das richtige Werkzeug für den Job.
Giuseppe
Oh, ich verstehe, tut mir leid, ich werde versuchen, solche "Fallen" in Zukunft zu vermeiden.
Kirill L.
2

Japt , 23 22 Bytes

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

Ein Byte gespart dank Oliver .
Probieren Sie es online!

Nit
quelle
1
Schön. Sie können mitJ
Oliver
@Oliver Vielen Dank, ich vergesse immer noch hin und wieder die Standardvariablen zu verwenden, das ist sehr praktisch.
Nit
1

Haskell, 87 Bytes

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

Probieren Sie es 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
quelle
Warum hört das auf? Sollte das Umklappen einer unendlichen Liste keine Endlosschleife verursachen? Sollte es nicht sein f s=foldl(#)s['a'..'z']?
user1472751
1
@ user1472751: ['a'..]ist nicht unendlich, da Charzur Klasse gehört Bounded. Eine Liste mit ..]von BoundedWerten hält an maxBound. Versuchen: print [False ..].
nimi
1

SNOBOL4 (CSNOBOL4) , 132 128 Bytes

	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)

Probieren Sie es online!

Einfache Implementierung des erforderlichen Algorithmus. Ein paar Bytes gespart, indem zu einer Funktion anstatt zu einem vollständigen Programm gewechselt wurde. Die Erklärung bleibt mehr oder weniger dieselbe.

	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
quelle
1

Jelly ,  12  11 Bytes

W;ṢḟṁUṣ¥jʋ/

Ein monadischer Link, der eine Liste von Zeichen akzeptiert und eine Liste von Zeichen zurückgibt.

Probieren Sie es online!

Wie?

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
quelle
Okay,
1
Nun, ich denke, dafür ist Jelly da - ich gehe davon aus, dass Dennis (Jellys Schöpfer) eine kürzere einsendet!
Jonathan Allan
Lol, das ist ziemlich erstaunlich: P, aber ich kann nicht b / c stimmen Ich habe meine tägliche Stimmenzahl aufgebraucht
..
1
... Ich glaube, es gibt eine Möglichkeit, ein Byte mit (filter out) zu speichern , aber ich habe es noch nicht geschafft.
Jonathan Allan
1
Zeitlich gesehen ist es O (n log n) in der Länge der Eingabe, da es zuerst Pythons verwendet sortedund dann n Iterationen von scheinbar weniger komplexen Operationen (Abflachen, Teilen bei gefundenen Indizes, Verbinden, Umkehren) durchläuft ). - und Pythons sortedist O (n log n).
Jonathan Allan
1

C (clang) , 164–162 Bytes

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

Probieren Sie es online!

f() Verwendet das Zeichen-Array, das die Eingabezeichenfolge und die Länge dieses Arrays enthält, als Parameter und führt die erforderlichen Überlegungen durch.

callf() macht hübsches Drucken.

Credits

-2 Bytes. @ Kevin. Vielen Dank

GPS
quelle
1
Sie können den Raum entfernen char *sund ändern i=96zu i=9zu speichern 2 Byte.
Kevin Cruijssen
Guter Fang ... wir müssen nicht anfangen a. Vielen Dank
GPS
144 Bytes
Ceilingcat
1

APL + WIN, 63 Bytes

Fordert zur Eingabe einer Zeichenfolge auf

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

Erläuterung:

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
quelle
1

Perl , 74 Bytes

84 80 Bytes inklusive Aufruf als Unix-Filter

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
quelle