การสะท้อนสตริงอย่างง่าย


26

เริ่มต้นด้วยการกำหนดภาพสะท้อนของตัวละครในสตริง:

กำหนดสตริงที่มีตัวอักษรตัวอักษรตัวพิมพ์เล็กแตกต่างกันโดยไม่มีช่องว่างเช่นabcdefgกำหนดการสะท้อนของตัวอักษรในสตริงcเป็นการย้าย (โดยไม่เปลี่ยนลำดับของตัวอักษรอื่น ๆ ) ไปยังตำแหน่งใหม่ในสตริงเช่นจำนวนตัวอักษรดั้งเดิม ทางด้านขวาของมันคือจำนวนตัวอักษรทางด้านซ้ายของมัน

ดังนั้นภาพสะท้อนของตัวอักษรcในจะเป็นabcdefg คำอธิบาย: มี 4 ตัวอักษรไปทางขวาของและตอนนี้มี 4 ตัวอักษรที่ด้านซ้ายของabdecfgcc

ตัวอย่างเพิ่มเติม:

การสะท้อนอักขระeในmyfriendรูปแบบสตริงmyefrind

สะท้อนให้เห็นถึงตัวละครaในจะเป็นสตริงaxyzxyza

สะท้อนให้เห็นถึงตัวละครbในจะเป็นสตริงabcabc

สะท้อนให้เห็นถึงตัวละครdในจะเป็นสตริงdd

สะท้อนให้เห็นถึงตัวละครeในจะเป็นสตริงeffe

สำหรับข้อมูลเพิ่มเติมหรือลองใช้กรณีทดสอบนี่เป็นโปรแกรม (ค่อนข้างยาว) ที่ฉันเขียนใน C ++

ความท้าทาย

กำหนดสตริงที่มีตัวอักษรตัวพิมพ์เล็กที่แตกต่างกันให้ผ่านแต่ละตัวอักษรและ "สะท้อน" ในสตริง

การชี้แจง: ตัวอักษรในสตริงมาจากa-zไม่มีช่องว่างตัวอักษรไม่ซ้ำกันและสตริงมีความยาวอย่างน้อย 1 ตัวอักษรและความยาวสูงสุด 26 ตัวอักษร

ตัวอย่าง

อินพุต: dcba. ผลลัพธ์: dcba.

เหตุผล: อันดับแรกให้สะท้อนความaเป็นตัวอักษรในสตริงที่มาเร็วที่สุดในตัวอักษร adcbคุณจะได้รับ จากนั้นสะท้อนให้เห็นถึงที่มาต่อไปในตัวอักษรที่จะได้รับb badcจากนั้นสะท้อนให้เห็นถึงcการได้รับcbadและจากนั้นจะได้รับddcba


อินพุต: myface. ผลลัพธ์: fyecma.

คำแนะนำ: a, c, e, f, m, yไปผ่านตัวอักษรในการสั่งซื้อ


อินพุต: a. ผลลัพธ์: a.


อินพุต: acb. ผลลัพธ์: bac.


อินพุต: cwmfjordbankglyphsvextquiz. ผลลัพธ์: ieabhqzugdltkfnvpjxsormycw.

เกณฑ์การให้คะแนน

  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ
  • ยอมรับ ~ 100 ชั่วโมงหลังจากโพสต์

ผู้ชนะปัจจุบัน


2
ใครสามารถให้ฉันเข้าใจว่าปริศนานี้ไม่เป็นไร? มันเป็นอันที่สองของฉันที่นี่ (อันแรกของฉันถูกปิดเป็นปิดหัวข้อ ... อ๊ะ ฉันพยายามทำให้มันสมบูรณ์จริง ๆ แต่ฉันไม่แน่ใจว่าฉันไม่มีอะไร ฉันต้องการที่จะปรับปรุงและสนุกกับ SE นี้! ขอบคุณพวกเขา: D
NL628

6
มันดูดี ฉันอาจยกตัวอย่างอีกสองสามข้อ (โดยเฉพาะอย่างยิ่งมันอาจจะดีสำหรับส่วนตัวอย่างแรกที่นำเสนอมากกว่ากรณีที่ดูเหมือนเป็นขอบ)
แยกผลไม้

1
ขอชี้แจง: " ตัวอักษรไม่ซ้ำกัน " หมายถึงตัวอักษรแต่ละตัวเกิดขึ้นเพียงครั้งเดียวในการป้อนข้อมูลที่ถูกต้องหรือไม่
GPS

4
เราสามารถรับอินพุตและเอาต์พุตเป็นตัวพิมพ์ใหญ่แทนตัวพิมพ์เล็กได้หรือไม่?
Kevin Cruijssen

5
@ NL628 โดยวิธีการที่ถ้าคุณต้องการที่จะได้รับความเข้าใจเกี่ยวกับความท้าทายก่อนที่จะโพสต์ไว้ที่นี่แล้วโพสต์ไว้ในSandbox
Erik the Outgolfer

คำตอบ:


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 .. ยังมีผู้ช่วยในความทรงจำของคุณเต้นแค่หนึ่งไบต์: 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

Python 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 ของฉันมีคำตอบสองเท่าตราบใดที่คุณ ... +1
NL628


3

เรติน่า 0.8.2 , 61 ไบต์

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

$
a

aเริ่มห่วงที่

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

หากอินพุตมีตัวอักษรปัจจุบันให้ย้ายไปยังจุดสิ้นสุดด้วยสตริง_ที่แสดงถึงตำแหน่งดั้งเดิม

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

สำหรับการ_ย้ายแต่ละครั้งให้ใช้ตัวอักษรหนึ่งตัวกลับ

}T`_l`l!`.$

เพิ่มตัวอักษร หลังจากzเปลี่ยนเป็น a !ดังนั้นจึงไม่ตรงกับสิ่งใดเลยและลูปจะสิ้นสุดลง

!

!ลบ


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 's งูหลาม 2 คำตอบ
-6 ไบต์ขอบคุณที่@ OlivierGrégoire

แก้ไขรายการอินพุตแทนการสร้างรายการใหม่

คำอธิบาย:

ลองออนไลน์

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

JavaScript, 85 80 79 ไบต์

-6 ไบต์ขอบคุณ @DanielIndie

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

ลองออนไลน์!


นี่ไม่ได้ "คอมไพล์" a เป็นสตริงและคุณใช้ splice
DanielIndie

@DanielIndie Input ควรส่งผ่านเป็นชุดอักขระเช่นเดียวกับโซลูชัน Python ของ Jo King
แยกผลไม้


คุณไม่ส่งคืนสิ่งใดจากฟังก์ชั่นนั้นหรือพิมพ์มัน
DanielIndie

@DanielIndie ฟังก์ชั่นสามารถกลับมาโดยการแก้ไขข้อโต้แย้งของพวกเขา
แยกผลไม้


2

สีแดง , 96 94 ไบต์

บันทึก 2 ไบต์ด้วย 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]

ลองออนไลน์!

อ่านเพิ่มเติมได้:

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
คุณสามารถบันทึก 2 ไบต์โดยเปลี่ยนfind x c replace x c""insert at x i cเป็นfind x c insert at replace x c""i cกำจัดxและพื้นที่
Kevin Cruijssen

@Kevin Cruijssen ขอบคุณเควินดีกว่ามากตอนนี้!
Galen Ivanov

2

R , 73 72 69 69 ไบต์

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

ลองออนไลน์!

อินพุตและเอาต์พุตเวกเตอร์ของอักขระ


ew ใช้cเป็นชื่อตัวแปรหรือไม่? มันแย่มากแม้แต่สำหรับรหัสกอล์ฟ!
จูเซปเป้

เห็นได้ชัดว่าฉันสามารถเปลี่ยนแปลงได้ แต่ฉันแปลกใจจริงๆที่เห็นว่ามันอาจรบกวนทุกคนที่นี่ ที่จริงผมมีแนวโน้มที่จะให้ความสำคัญกับการรักษาความรู้สึกบางอย่างในชื่อตัวแปร (เช่นcสำหรับchar) มากกว่าที่ไม่ได้ใช้ตัว -ins
คิริลล์ลิตร

ดีเมื่อมองหาการปรับปรุง (ซึ่งฉันไม่ได้) ฉันพบว่าตัวเองพยายามใช้cและมันก็น่ากลัวเมื่อฉันไม่สามารถคิดออกว่าเกิดอะไรขึ้น ฉันมักจะใช้Kหรือkแม้กระทั่งCเพื่อหลีกเลี่ยงปัญหาเช่นนั้น แต่ฉันได้รับโดยสิ้นเชิง appenddef เป็นเครื่องมือที่เหมาะสมสำหรับงาน
จูเซปเป้

โอ้ฉันเข้าใจแล้วว่าจะพยายามหลีกเลี่ยงการตั้งค่า "กับดัก" ในอนาคต
คิริลล์ลิตร


2

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

ที่บันทึกไว้หนึ่งขอบคุณไบต์โอลิเวอร์
ลองออนไลน์!


1
ทำได้ดีนี่. คุณสามารถแทนที่ด้วยJ
Oliver

@Oliver ขอบคุณมากฉันยังคงลืมที่จะใช้ตัวแปรเริ่มต้นทุกคราวแล้วมันมีประโยชน์มาก
นิด

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: ['a'..]ไม่ได้ไม่มีที่สิ้นสุดเพราะอยู่ในชั้นเรียนChar Boundedรายการที่มี..]ของค่าหยุดที่Bounded maxBoundลอง: print [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ʋ/

ลิงก์ monadic ยอมรับรายการของอักขระและส่งคืนรายการของอักขระ

ลองออนไลน์!

อย่างไร?

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 แต่ฉันไม่สามารถโหวตได้เลยฉัน / ฉันหมดคะแนนรายวันของฉันไปแล้ว ... ปอย
NL628

1
... ฉันคิดว่าอาจมีวิธีการบันทึก byte โดยใช้(filter out) แต่ฉันยังไม่ได้จัดการมัน
Jonathan Allan

1
ดูเหมือนว่าเวลาฉลาดมันเป็น O (n log n) ในความยาวของอินพุตตั้งแต่ครั้งแรกที่ใช้ Python sortedแล้วทำงานผ่าน n การวนซ้ำของสิ่งที่ดูเหมือนจะเป็นการดำเนินการที่ซับซ้อนน้อยกว่า (การแบน, การแยกดัชนีที่พบ ) - และ Python 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() ใช้ char-array ที่มีสตริงอินพุตและความยาวของอาร์เรย์นี้เป็นพารามิเตอร์และทำการสะท้อนที่ต้องการ

callf() พิมพ์สวย

เครดิต

-2 ไบต์ @ Kevin ขอบคุณ


1
คุณสามารถลบพื้นที่ที่char *sและการเปลี่ยนแปลงi=96เพื่อi=9ที่จะบันทึก 2 ไบต์
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

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