Phản xạ chuỗi đơn giản


26

Hãy bắt đầu bằng cách xác định sự phản chiếu của một ký tự trong chuỗi:

Cho một chuỗi có các chữ cái chữ cái viết thường khác biệt không có khoảng trắng như abcdefg, xác định sự phản chiếu của một chữ cái trong chuỗi ckhi di chuyển nó (không thay đổi thứ tự của bất kỳ chữ cái nào khác) đến một vị trí mới trong chuỗi sao cho số lượng chữ cái ban đầu bên phải của nó bây giờ là số chữ cái bên trái của nó.

Vì vậy, một sự phản ánh của bức thư ctrong abcdefgsẽ là abdecfg. Giải thích: có 4 chữ cái bên phải cvà bây giờ, có 4 chữ cái bên trái c.

Một số ví dụ khác:

Phản ánh nhân vật etrong myfriendsẽ tạo thành chuỗimyefrind

Phản ánh các nhân vật atrong axyzsẽ tạo thành chuỗi xyza.

Phản ánh các nhân vật btrong abcsẽ tạo thành chuỗi abc.

Phản ánh các nhân vật dtrong dsẽ tạo thành chuỗi d.

Phản ánh các nhân vật etrong efsẽ tạo thành chuỗi fe.

Để biết thêm thông tin hoặc để thử một số trường hợp thử nghiệm, đây là một chương trình (hơi dài) tôi đã viết trong C ++.

Các thách thức

Đưa ra một chuỗi với các chữ cái viết thường khác nhau, đi qua từng ký tự theo thứ tự bảng chữ cái và "phản ánh" nó trong chuỗi.

Làm rõ: Các chữ cái trong chuỗi là từ a-z, không có khoảng trắng, các chữ cái là duy nhất và chuỗi dài ít nhất 1 chữ cái và dài tối đa 26 chữ cái.

Ví dụ

Đầu vào : dcba. Đầu ra : dcba.

Lý do: Đầu tiên, hãy phản ánh avì đó là ký tự trong chuỗi xuất hiện sớm nhất trong bảng chữ cái. Bạn sẽ nhận được adcb. Sau đó, phản ánh bnhư nó đến tiếp theo trong bảng chữ cái, để có được badc. Sau đó, phản ánh cđể có được cbad, và sau đó dđể có được dcba.


Đầu vào : myface. Đầu ra : fyecma.

Gợi ý: Đi qua các chữ cái theo thứ tự a, c, e, f, m, y.


Đầu vào : a. Đầu ra : a.


Đầu vào : acb. Đầu ra : bac.


Đầu vào : cwmfjordbankglyphsvextquiz. Đầu ra : ieabhqzugdltkfnvpjxsormycw.

Chấm điểm

  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.
  • Chấp nhận ~ 100 giờ sau khi đăng.

Người chiến thắng hiện tại


2
Bất cứ ai có thể cho tôi cái nhìn sâu sắc như liệu câu đố này là ổn? Đây là cái thứ hai của tôi ở đây (cái đầu tiên của tôi đã bị đóng ngoài chủ đề ... rất tiếc). Tôi đã cố gắng để làm cho nó thực sự hoàn thiện, nhưng tôi không chắc là tôi có thiếu thứ gì không. Tôi thực sự muốn cải thiện và vui chơi trên SE này! Cảm ơn mọi người: D
NL628

6
Nhìn có vẻ tốt. Tôi có thể đưa ra một vài ví dụ dài hơn (đặc biệt, có thể tốt cho phần ví dụ đầu tiên trình bày nhiều hơn những trường hợp có vẻ như cạnh).
Trái cây Esolanging

1
Yêu cầu làm rõ: " các chữ cái là duy nhất " có nghĩa là mỗi chữ cái chỉ xuất hiện một lần trong đầu vào, điều đó có đúng không?
GPS

4
Chúng ta có thể lấy đầu vào và đầu ra bằng chữ in hoa thay vì chữ thường không?
Kevin Cruijssen

5
@ NL628 Nhân tiện, nếu bạn muốn hiểu rõ hơn về một thách thức trước khi đăng nó ở đây, thì hãy đăng nó trong Sandbox .
Erik the Outgolfer

Câu trả lời:


8

Brain-Flak , 188 byte

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

Hãy thử trực tuyến!

Ngoài các phản xạ được mô tả trong đặc tả thách thức, mã này cũng đảo ngược chuỗi chính xác 26 lần. Điều này không có hiệu lực trên đầu ra cuối cùng.

# 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
Wow điều đó thật tuyệt vời. Tôi thậm chí không thể hiểu được: O +1
NL628

7

05AB1E , 20 17 byte

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

Hãy thử trực tuyến!

Giải trình

Ví dụ cho lần lặp đầu tiên của 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'

Chuỗi được bao quanh với khoảng trắng mỗi lần lặp khi phân tách trên chữ cái đầu tiên hoặc cuối cùng của chuỗi sẽ dẫn đến danh sách độ dài 1 nếu không và hợp nhất sẽ không bao gồm chữ cái đó.


1
17 byte ?! ?? !! AMAZING..yet mnemonic đang đánh bại bạn chỉ bằng một byte: P
NL628

1
Mmmm ... Wow, điều duy nhất tôi có thể thấy là loại bỏ các khoảng trống bằng khoảng trắng. Có vẻ kỳ lạ, chúng tôi không thể tìm thấy một sự thay thế khác cho điều đó.
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn: Đó là cách ngắn nhất tôi tìm thấy để xử lý sự phân chia của ký tự đầu tiên hoặc cuối cùng. Mặc dù vậy, có vẻ như rất nhiều byte chỉ dành cho điều đó
Emigna

5

Pyth, 18 16 19 16 byte

VSQ=QXx_QN-QNN)Q

Hãy thử nó ở đây

Giải trình

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.

Wow 16 byte? Tôi sẽ nâng cao, nhưng thật đáng buồn là tôi đã đạt đến giới hạn bỏ phiếu hàng ngày của mình. Sẽ làm trong 6 giờ: P
NL628

4

Python 3 , 80 73 byte

Cảm ơn Esolanging Fruit đã nhắc nhở tôi rằng các chức năng có thể trở lại bằng cách sửa đổi đối số của chúng.

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng danh sách các ký tự.


3
Wow tôi đã viết một câu trả lời trong C ++ và Python 3. Câu trả lời Python 3 của tôi dài gấp đôi chính xác của bạn ... +1
NL628


3

Võng mạc 0.8.2 , 61 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

$
a

Bắt đầu vòng lặp tại a.

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

Nếu đầu vào chứa chữ cái hiện tại, di chuyển nó đến cuối, với một chuỗi _s đại diện cho vị trí ban đầu của nó.

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

Đối với mỗi _di chuyển thư trở lại một ký tự.

}T`_l`l!`.$

Tăng thư. Sau khi zthay đổi nó thành một !cái để nó không khớp với bất cứ thứ gì và vòng lặp kết thúc.

!

Xóa !.


3

Java 8, 140 96 92 88 87 85 byte

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

-44 byte tạo ra một cổng của câu trả lời Python 2 của @TFeld .
-6 byte nhờ @ OlivierGrégoire .

Sửa đổi Danh sách đầu vào thay vì tạo một danh sách mới.

Giải trình:

Hãy thử trực tuyến.

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 Cảm ơn. Và thêm 1 vòng lặp không chỉ là các ký tự bảng chữ cái. :)
Kevin Cruijssen

2
Chà, nếu bạn đi trên con đường đó, for(char c=9;++c>1;)thì tốt hơn ;-)
Olivier Grégoire

@ OlivierGrégoire Ah tất nhiên, charcũng quấn quanh như Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. Thông minh!
Kevin Cruijssen

@ OlivierGrégoire slà một ArrayList, vì vậy indexOfsẽ thuộc loại chung T( Characterdành cho danh sách đầu vào này).
Kevin Cruijssen

3

JavaScript, 85 80 79 byte

-6 byte nhờ @DanielIndie

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

Hãy thử trực tuyến!


điều này không "biên dịch" a là một chuỗi và bạn sử dụng mối nối
DanielIndie

@DanielIndie Input phải được chuyển qua dưới dạng một mảng các ký tự, giống như giải pháp Python của Jo.
Trái cây Esolanging


bạn không trả lại bất cứ thứ gì từ chức năng đó hoặc in nó
DanielIndie

Các chức năng @DanielIndie có thể trở lại bằng cách sửa đổi các đối số của chúng.
Trái cây Esolanging


2

Đỏ , 96 94 byte

Lưu 2 byte nhờ 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]

Hãy thử trực tuyến!

Dễ đọc hơn:

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
Bạn có thể lưu 2 byte bằng cách thay đổi find x c replace x c""insert at x i cđể find x c insert at replace x c""i cloại bỏ một xkhoảng trống.
Kevin Cruijssen

@Kevin Cruijssen Cảm ơn bạn, Kevin, giờ thì tốt hơn nhiều rồi!
Galen Ivanov

2

R , 73 72 69 byte

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

Hãy thử trực tuyến!

Nhập và xuất một vectơ ký tự.


ew, sử dụng cnhư một tên biến? đó là khủng khiếp, ngay cả đối với golf mã!
Giuseppe

Chà, rõ ràng tôi có thể thay đổi nó, nhưng tôi thực sự ngạc nhiên khi thấy rằng nó có thể làm phiền bất cứ ai ở đây. Tôi thực sự có xu hướng ưu tiên bảo tồn một số ý nghĩa trong các tên biến (như cfor char) thay vì các phần dựng sẵn không sử dụng.
Kirill L.

tốt, khi tìm kiếm một cải tiến (mà, tôi đã không) Tôi thấy mình đang cố gắng sử dụng c, và thật tệ khi tôi không thể hiểu được chuyện gì đang xảy ra. Tôi thường sử dụng Khoặc kthậm chí Cchỉ để tránh các vấn đề như vậy, nhưng tôi hoàn toàn hiểu được. appendlà def công cụ phù hợp cho công việc.
Giuseppe

Ồ, tôi thấy, xin lỗi về điều đó, sẽ cố gắng tránh đặt "bẫy" như vậy trong tương lai.
Kirill L.


2

Japt , 23 22 byte

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

Lưu một byte nhờ Oliver .
Hãy thử trực tuyến!


1
Đẹp một. Bạn có thể thay thế bằngJ
Oliver

@Oliver Cảm ơn rất nhiều, tôi vẫn quên sử dụng các biến mặc định mọi lúc, điều đó rất tiện dụng.
Nit

1

Haskell, 87 byte

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

Hãy thử trực tuyến!

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             

Tại sao điều này dừng lại? Không nên gấp lại một danh sách vô hạn gây ra một vòng lặp vô hạn? Có nên không f s=foldl(#)s['a'..'z']?
user1472751

1
@ user1472751: ['a'..]không phải là vô hạn, vì Charthuộc về lớp Bounded. Một danh sách với ..]các Boundedgiá trị dừng lại ở maxBound. Hãy thử : print [False ..].
nimi

1

SNOBOL4 (CSNOBOL4) , 132 128 byte

	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)

Hãy thử trực tuyến!

Thực hiện đơn giản các thuật toán cần thiết. Đã lưu một vài byte bằng cách chuyển sang một chức năng chứ không phải là một chương trình đầy đủ; lời giải thích vẫn như cũ, ít nhiều

	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

Thạch ,  12  11 byte

W;ṢḟṁUṣ¥jʋ/

Một liên kết đơn âm chấp nhận một danh sách các ký tự và trả về một danh sách các ký tự.

Hãy thử trực tuyến!

Làm sao?

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"

Được rồi, cái này phá hủy khá nhiều thứ khác ...
NL628

1
Chà, tôi nghĩ đó là những gì Jelly dành cho - tôi nửa tin rằng Dennis (người tạo ra Jelly) sẽ gửi một cái ngắn hơn!
Jonathan Allan

Lol đó là khá tuyệt vời: P nhưng tôi không thể upvote b / c tôi sử dụng hết phiếu count..rip hàng ngày của tôi
NL628

1
... Tôi nghĩ rằng có thể có một cách để tiết kiệm một byte bằng cách sử dụng (lọc ra) nhưng tôi chưa quản lý nó.
Jonathan Allan

1
Có vẻ như, theo thời gian, đó là O (n log n) về độ dài của đầu vào vì lần đầu tiên nó sử dụng Python sortedvà sau đó chạy qua n lần lặp của những gì dường như là các hoạt động ít phức tạp hơn (làm phẳng, tách tại các chỉ mục tìm thấy, nối, đảo ngược ). - và Python sortedlà O (n log n).
Jonathan Allan

1

C (tiếng kêu) , 164 162 byte

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

Hãy thử trực tuyến!

f() lấy mảng char chứa chuỗi đầu vào và độ dài của mảng này làm tham số và thực hiện các phản xạ cần thiết tại chỗ.

callf() không in đẹp.

Tín dụng

-2 byte. @Kevin. Cảm ơn


1
Bạn có thể loại bỏ các không gian ở char *svà thay đổi i=96đến i=9để tiết kiệm 2 byte.
Kevin Cruijssen

Bắt tốt .. chúng ta không cần phải bắt đầu từ a. Cảm ơn
GPS


1

APL + THẮNG, 63 byte

Lời nhắc cho chuỗi đầu vào

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

Giải trình:

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 byte

84 80 byte bao gồm cả lệnh gọi là bộ lọc 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.