単純な文字列の反射


26

文字列内の文字のリフレクションを定義することから始めましょう:

のようにスペースのない明確な小文字のアルファベットの文字列が与えられた場合、文字列abcdefg内の文字の反射をc(他の文字の順序を変更せずに)文字列内の新しい場所に移動するように定義しますその右側は、左側の文字数です。

したがって、文字の反映はcabcdefgなりますabdecfg説明:の右側にc4つの文字があり、現在、の左側に4つの文字がありcます。

さらにいくつかの例:

文字eを反映すると文字myfriend列が形成されますmyefrind

文字aを反映axyzすると、文字列が形成されますxyza

文字bを反映abcすると、文字列が形成されますabc

文字dを反映dすると、文字列が形成されますd

文字eを反映efすると、文字列が形成されますfe

詳細については、またはいくつかのテストケースを試してみることを、ここに私はC ++で書いた(やや長い)プログラムです。

チャレンジ

明確に小文字の文字列が与えられた場合、各文字をアルファベット順に調べて、文字列に「反映」します。

明確化:文字列の文字はfromで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
このパズルが大丈夫かどうかについて、誰かが私に洞察を与えることができますか?ここでの私の2番目のものです(私の最初のトピックはオフトピックとして閉じられました...おっと)。本当に完成させようとしましたが、何か足りないのかわかりません。このSEを改善し、楽しみたいです!みんなありがとう:D
NL628

6
これはよさそうだ。いくつかの長い例を挙げるかもしれません(特に、最初の例のセクションでは、一見エッジの場合よりも多くを提示するのが良いかもしれません)。
エソランジングフルーツ

1
明確化の要求:「文字は一意です」は、各文字が入力で1回のみ出現することを意味しますが、正しいですか
GPS

4
入力と出力を小文字ではなく大文字にすることはできますか?
ケビンCruijssen

5
@ NL628ところで、ここ投稿する前にチャレンジに関する洞察を得たい場合は、Sandbox 投稿してください。
エリックアウトゴルファー

回答:


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

05AB1E20 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バイト?!?? !! 驚くべき..まだニーモニックはあなたをたった1バイトで叩いています: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バイト?私は賛成票を投じますが、悲しいことに私は毎日の投票制限に達しました。6時間以内に行います:P
NL628

4

Pythonの380の 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倍でした... +1
NL628


3

Retina 0.8.2、61バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

$
a

でループを開始しますa

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

入力に現在の文字が含まれている場合は_、元の位置を表すsの文字列で最後に移動します。

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

_移動するたびに、文字を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のPython 2回答のポートを作成します。@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ありがとう。さらに、アルファベット文字だけでなく、さらに1つループします。:)
ケビンクルーイッセン

2
まあ、あなたがその道を行くなら、for(char c=9;++c>1;)より良いです;-)
オリビエグレゴワール

当然のOlivierGrégoireああ@、charまた同じようにラップアラウンドInteger.MAX_VALUE + 1 == Integer.MIN_VALUE...スマート!
ケビンクルーッセン

@OlivierGrégoire sはArrayListであるためindexOf、ジェネリック型TCharacterこの入力リスト用)になります。
ケビンCruijssen

3

JavaScript、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

オンラインでお試しください!


このdoesntの「コンパイル」の文字列であり、あなたがスプライスを使用する
DanielIndie

@DanielIndie入力は、Jo KingのPythonソリューションのように、文字の配列として渡される必要があります。
エソランジングフルーツ


その関数から何も返さないか、印刷しないでください
DanielIndie

@DanielIndie関数は、引数を変更することで戻ることができます。
エソランジングフルーツ


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 cfind x c insert at replace x c""i cxスペースを削除すると、2バイト節約できます。
ケビンCruijssen

@Kevin Cruijssenありがとう、ケビン、今はずっと良くなっています!
ガレンイワノフ

2

R73 72 69バイト

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

オンラインでお試しください!

文字のベクトルを入力および出力します。


ええ、c変数名として使用していますか?それはコードゴルフでもひどいです!
ジュゼッペ

まあ、私は明らかにそれを変更することができますが、私はここで誰も気にすることができることを見て本当に驚いています。私は実際には、未使用のビルトインではなく、変数名(cforなどchar)の意味を維持することを優先する傾向があります。
キリルL.

よく、改善を探したとき(私はしませんでした)c、自分が使用しようとしていることに気づきました。私は通常、そのような問題を回避するためにKkまたはC単に使用しますが、完全に理解しています。append仕事に最適なツールです。
ジュゼッペ

ああ、それについては残念ですが、将来はそのような「トラップ」の設定を避けようとします。
キリルL.


2

Japt23 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

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:classに属している['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"

...他にこの1件のほとんど沈没船のすべてをうまく[OK]を
NL628

1
それがジェリーの目的だと思います-デニス(ジェリーのクリエーター)がもっと短いものを提出することを期待しています!
ジョナサンアラン

笑それはかなり驚くべきことだ:Pしかし、私はできないupvote B /私は私の毎日の投票count..ripまで使用されるC
NL628

1
... (フィルターアウト)を使用してバイトを保存する方法があると思いますが、まだ管理していません。
ジョナサンアラン

1
時間的には、入力の長さがO(n log n)のように見えます。最初にPythonを使用しsorted、次に複雑でない操作(平坦化、見つかったインデックスでの分割、結合、反転)のn回の反復を実行するため)。-そしてPython sortedはO(n log n)です。
ジョナサンアラン

1

C(clang)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=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

Perl74 70バイト

UNIXフィルタとしての呼び出しを含む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.