간단한 문자열 반영


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 과일

1
설명 요청 : " 문자가 고유합니다 "는 각 문자가 한 번만 입력되는 것을 의미합니다. 맞습니까?
GPS

4
소문자 대신 대문자로 입력 및 출력을 취할 수 있습니까?
Kevin Cruijssen

5
@ NL628 그런데, 여기에 게시 하기 전에 도전에 대한 통찰력을 얻으려면 Sandbox에 게시하십시오 .
Outgolfer Erik

답변:


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 바이트?! ?? !! AMAZING..ym mnemonic이 1 바이트만으로 당신을 때리고 있습니다. : P
NL628

1
음 ... 와우, 볼 수있는 것은 공백으로 서라운드를 제거하는 것입니다. 우리가 그것에 대한 다른 대안을 찾을 수 없다는 것이 이상해 보입니다.
Magic Octopus Urn

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 바이트? 공감할 수는 있지만 슬프게도 매일 투표 한도에 도달했습니다. 6 시간 후에 수행 : P
NL628

4

파이썬 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 답변은 당신보다 2 배
길었습니다


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!`.$

편지를 늘리십시오. 후 zA와 변화를 !그것은 아무것도 루프의 끝과 일치하지 않도록.

!

을 삭제하십시오 !.


3

자바 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 의 파이썬이 대답을 . @ OlivierGrégoire
덕분에 -6 바이트 .

입력 목록을 새로 작성하는 대신 입력 목록을 수정합니다.

설명:

온라인으로 사용해보십시오.

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 감사합니다. 그리고 알파벳 문자보다 더 많은 반복문이 있습니다. :)
Kevin Cruijssen

2
글쎄, 당신이 그 길을 가면 for(char c=9;++c>1;)더 나은 ;-)
Olivier Grégoire

@ OlivierGrégoire 아 물론, char또한 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. 똑똑한 포장 !
Kevin Cruijssen

@ OlivierGrégoire s는 ArrayList이므로 indexOf일반 유형입니다 T( Character이 입력 목록에 해당).
Kevin Cruijssen

3

자바 스크립트, 85 80 79 바이트

@DanielIndie 덕분에 -6 바이트

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

온라인으로 사용해보십시오!


이것은 "컴파일"하지 않습니다 a는 문자열이고 당신은 접속을 사용합니다
DanielIndie

@DanielIndie 입력은 Jo King의 Python 솔루션과 마찬가지로 문자 배열로 전달되어야합니다.
Esolanging 과일


해당 함수에서 아무것도 반환하거나 인쇄하지 않습니다.
DanielIndie

@DanielIndie 함수는 인수를 수정하여 반환 할 수 있습니다.
Esolanging 과일


2

빨강 , 96 94 바이트

Kevin Cruijssen 덕분에 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
및 공백을 제거하도록 변경 find x c replace x c""insert at x i c하여 2 바이트를 절약 할 수 있습니다 . find x c insert at replace x c""i cx
Kevin Cruijssen

@Kevin Cruijssen 감사합니다, Kevin, 지금 훨씬 나아졌습니다!
Galen Ivanov

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변수 이름으로? 코드 골프조차도 끔찍합니다!
Giuseppe

글쎄, 나는 분명히 그것을 바꿀 수 있지만, 그것이 그것이 누군가를 귀찮게 할 수 있다는 것을 정말로 놀랐습니다. 실제로 사용되지 않는 내장 변수가 아닌 변수 이름 (예 c: 등 char) 을 유지하는 데 우선 순위를 두는 경향이 있습니다.
Kirill L.

글쎄, 개선을 원할 때 (내가하지 않았다) 나는 내가 사용하려고한다는 것을 알았고 c, 무슨 일이 일어나고 있는지 알 수 없을 때 끔찍했다. 나는 일반적으로 사용하는 K또는 k심지어 C그냥 같은 문제를 방지하기 위해, 그러나 나는 완전히 그것을 얻을. append작업에 적합한 도구를 정의합니다.
Giuseppe

아, 죄송합니다. 앞으로 이러한 "트랩"설정을 피하려고 노력할 것입니다.
Kirill L.


2

apt , 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.

Oliver 덕분에 1 바이트를 절약했습니다 .
온라인으로 사용해보십시오!


1
좋은데 당신은 대체 할 수 J
올리버

@Oliver 고마워요, 나는 여전히 기본 변수를 사용하는 것을 잊어 버렸습니다. 매우 편리합니다.
Nit

1

하스켈, 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'..]때문에 무한하지 않습니다 . 값이 포함 된 목록은 에서 멈 춥니 다 . 시도하십시오 : . CharBounded..]BoundedmaxBoundprint [False ..]
nimi

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
글쎄, 그것이 젤리의 생각이라고 생각합니다. 나는 데니스 (젤리의 제작자)가 더 짧은 것을 제출할 것으로 기대합니다!
Jonathan Allan

롤이 꽤 놀라운 : P하지만 난 수 없습니다 upvote에 B / 나는 매일 투표 count..rip까지 사용 된 c
NL628

1
... (필터 아웃) 을 사용하여 바이트를 저장하는 방법이있을 수 있지만 아직 관리하지는 않았습니다.
Jonathan Allan

1
시간이 지남에 따라 처음에는 Python을 사용하기 때문에 입력 길이가 O (n log n) 인 sorted것처럼 보이지만 덜 복잡한 작업 (플랫 닝, 발견 된 인덱스에서 분리, 조인, 역전)으로 n 반복 반복 ). -파이썬 sorted은 O (n log n)입니다.
Jonathan Allan

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() 이 배열의 입력 문자열과 길이를 포함하는 문자 배열을 매개 변수로 사용하고 필요한 반사를 수행합니다.

callf() 예쁜 인쇄를합니다.

크레딧

-2 바이트 @ 케빈. 감사


1
당신은에서 공간을 제거 할 수 있습니다 char *s변화를 i=96i=92 저장 바이트.
Kevin Cruijssen

잘 잡습니다. 우리는 시작할 필요가 없습니다 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

, 74 70 바이트

유닉스 필터로의 호출을 포함한 84 80 바이트

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.