Refleksi Tali Sederhana

26

Mari kita mulai dengan mendefinisikan refleksi karakter dalam sebuah string:

Diberikan string dengan huruf alfabet huruf kecil berbeda tanpa spasi seperti abcdefg, tentukan refleksi huruf dalam string csebagai memindahkannya (tanpa mengubah urutan huruf lainnya) ke tempat baru di string sehingga jumlah huruf awalnya di sebelah kanannya sekarang jumlah huruf di sebelah kiri itu.

Dengan demikian, cerminan huruf cdi abcdefgakan abdecfg. Penjelasan: ada 4 huruf di sebelah kanan cdan sekarang, ada 4 huruf di sebelah kiri c.

Beberapa contoh lagi:

Mencerminkan karakter edalam myfriendakan membentuk stringmyefrind

Mencerminkan karakter adalam axyzakan membentuk string xyza.

Mencerminkan karakter bdalam abcakan membentuk string abc.

Mencerminkan karakter ddalam dakan membentuk string d.

Mencerminkan karakter edalam efakan membentuk string fe.

Untuk informasi lebih lanjut atau mencoba beberapa kasus uji, berikut ini adalah program (agak panjang) yang saya tulis di C ++.

Tantangan

Diberikan string dengan huruf kecil berbeda, buka setiap karakter secara alfabet dan "pantulkan" dalam string.

Klarifikasi: Huruf-huruf dalam string berasal dari a-z, tidak ada spasi, huruf-hurufnya unik, dan string paling sedikit 1 huruf dan paling panjang 26 huruf.

Contohnya

Input: dcba. Output: dcba.

Alasan: Pertama, cerminkan asebagaimana karakter dalam string yang paling awal dalam alfabet. Anda akan mendapatkannya adcb. Kemudian, refleksikan bseperti apa yang terjadi berikutnya dalam alfabet, untuk mendapatkan badc. Kemudian, refleksikan cuntuk mendapatkan cbad, dan kemudian duntuk mendapatkan dcba.


Input: myface. Output: fyecma.

Petunjuk: Periksa surat-surat secara berurutan a, c, e, f, m, y.


Input: a. Output: a.


Input: acb. Output: bac.


Input: cwmfjordbankglyphsvextquiz. Output: ieabhqzugdltkfnvpjxsormycw.

Mencetak gol

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
  • Menerima ~ 100 jam setelah posting.

Pemenang saat ini

NL628
sumber
2
Adakah yang bisa memberi saya wawasan apakah puzzle ini baik-baik saja? Ini yang kedua di sini (yang pertama ditutup sebagai off-topic ... whoops). Saya mencoba membuatnya benar-benar lengkap, tetapi saya tidak yakin apakah saya kehilangan sesuatu. Saya benar-benar ingin meningkatkan dan bersenang-senang di SE ini! Terima kasih teman-teman: D
NL628
6
Ini terlihat bagus. Saya mungkin memberikan beberapa contoh yang lebih panjang (khususnya, mungkin baik untuk bagian contoh pertama untuk menyajikan lebih dari apa yang tampaknya kasus tepi).
Buah Esolanging
1
Permintaan klarifikasi: " hurufnya unik " artinya setiap huruf hanya muncul satu kali saat input, apakah itu benar?
GPS
4
Bisakah kita mengambil input dan output dalam huruf besar dan bukan huruf kecil?
Kevin Cruijssen
5
@ NL628 Ngomong-ngomong, jika Anda ingin mendapatkan wawasan tentang tantangan sebelum mempostingnya di sini, kemudian posting di Sandbox .
Erik the Outgolfer

Jawaban:

8

Brain-Flak , 188 byte

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

Cobalah online!

Selain refleksi yang dijelaskan dalam spesifikasi tantangan, kode ini juga membalik string tepat 26 kali. Ini tidak berpengaruh pada hasil akhir.

# 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
sumber
1
Wow, itu luar biasa. Saya bahkan tidak dapat memahaminya: O +1
NL628
7

05AB1E , 20 17 byte

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

Cobalah online!

Penjelasan

Dengan contoh untuk iterasi pertama 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'

String dikelilingi dengan spasi setiap iterasi karena pemisahan pada huruf pertama atau terakhir dari string akan menghasilkan daftar panjang-1 jika tidak dan gabungan tidak akan menyertakan surat itu.

Emigna
sumber
1
17 byte?! ?? !! LUAR BIASA..tetapi mnemonic mengalahkan Anda hanya dengan satu byte: P
NL628
1
Mmmm ... Wow, satu-satunya hal yang bisa saya lihat adalah menghilangkan surround dengan spasi. Sepertinya aneh kami tidak dapat menemukan alternatif lain untuk itu.
Magic Gurita Guci
1
@MagicOctopusUrn: Ini adalah cara terpendek yang saya temukan dalam menangani pemisahan karakter pertama atau terakhir. Rasanya seperti banyak byte hanya untuk itu
Emigna
5

Pyth, 18 16 19 16 byte

VSQ=QXx_QN-QNN)Q

Coba di sini

Penjelasan

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.

sumber
Wow, 16 byte? Saya akan menang, tapi sayangnya saya telah mencapai batas pemungutan suara harian saya. Akan dilakukan dalam 6 jam: P
NL628
4

Python 3 , 80 73 byte

Terima kasih kepada Esolanging Fruit karena mengingatkan saya bahwa fungsi dapat kembali dengan mengubah argumen mereka.

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

Cobalah online!

Mengambil input sebagai daftar karakter.

Jo King
sumber
3
Wow saya menulis jawaban di C ++ dan Python 3 juga. Jawaban Python 3 saya persis dua kali lebih panjang dari milik Anda ... +1
NL628
4

Python 2 , 70 byte

def f(t):
 for c in sorted(t):i=t.index(c);l=len(t)+~i;t[l:l]=t.pop(i)

Cobalah online!

Memodifikasi daftar input

TFeld
sumber
3

Retina 0.8.2 , 61 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

$
a

Mulai loop di a.

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

Jika input berisi huruf saat ini, pindahkan ke akhir, dengan string _s yang mewakili posisi aslinya.

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

Untuk setiap _memindahkan huruf kembali satu karakter.

}T`_l`l!`.$

Tambahkan surat. Setelah zmengubahnya menjadi !sehingga tidak cocok dengan apa pun dan loop berakhir.

!

Hapus !.

Neil
sumber
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 membuat port dari jawaban Python 2 @TFeld .
-6 byte terima kasih kepada @ OlivierGrégoire .

Memodifikasi Daftar input alih-alih membuat yang baru.

Penjelasan:

Cobalah online.

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
sumber
1
@ OlivierGrégoire Terima kasih. Dan 1 perulangan lebih dari sekedar karakter alfabet. :)
Kevin Cruijssen
2
Nah, jika Anda melewati jalan itu, for(char c=9;++c>1;)lebih baik ;-)
Olivier Grégoire
@ OlivierGrégoire Ah tentu saja, charjuga membungkus seperti Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. Cerdas!
Kevin Cruijssen
@ OlivierGrégoire sadalah ArrayList, jadi indexOfakan bertipe generik T(yang Characteruntuk daftar input ini).
Kevin Cruijssen
3

JavaScript, 85 80 79 byte

-6 byte terima kasih kepada @DanielIndie

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

Cobalah online!

Buah Esolanging
sumber
ini tidak "mengkompilasi" a adalah string dan Anda menggunakan splice
DanielIndie
@DanielIndie Input harus dilewatkan sebagai array karakter, sama seperti solusi Python Jo King.
Buah Esolanging
80 byte
DanielIndie
Anda tidak mengembalikan apa pun dari fungsi itu, atau mencetaknya
DanielIndie
@DanielIndie Fungsi dapat kembali dengan mengubah argumen mereka.
Buah Esolanging
2

Ruby , 51 byte

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

Cobalah online!

Mengambil array karakter

Kembali dengan memodifikasi input

Asone Tuhid
sumber
2

Merah , 96 94 byte

2 byte disimpan berkat 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]

Cobalah online!

Lebih mudah dibaca:

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
sumber
1
Anda dapat menyimpan 2 byte dengan mengubah find x c replace x c""insert at x i cuntuk find x c insert at replace x c""i cmenghilangkan xruang dan.
Kevin Cruijssen
@Kevin Cruijssen Terima kasih, Kevin, sekarang jauh lebih baik!
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}

Cobalah online!

Input dan output sebuah vektor karakter.

Kirill L.
sumber
ew, menggunakan csebagai nama variabel? itu mengerikan, bahkan untuk golf kode!
Giuseppe
Yah, saya jelas bisa mengubahnya, tetapi saya benar-benar terkejut melihat bahwa itu bisa mengganggu siapa pun di sini. Saya sebenarnya cenderung memberikan prioritas untuk menjaga beberapa pengertian dalam nama variabel (seperti cuntuk char) daripada built-in yang tidak digunakan.
Kirill L.
baik, ketika mencari perbaikan (yang, saya tidak lakukan) saya menemukan diri saya mencoba untuk menggunakan c, dan itu mengerikan ketika saya tidak tahu apa yang terjadi. Saya biasanya menggunakan Katau katau bahkan Chanya untuk menghindari masalah seperti itu, tetapi saya benar-benar mengerti. appendadalah def alat yang tepat untuk pekerjaan itu.
Giuseppe
Oh, begitu, maaf tentang itu, akan mencoba untuk menghindari pengaturan "perangkap" di masa depan.
Kirill L.
2

Perl 5 -p , 37 byte

#!/usr/bin/perl -p
for$a(a..z){s/$a//&&s/.{@{-}}$/$a$&/}

Cobalah online!

Ton Hospel
sumber
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.

Disimpan satu byte berkat Oliver .
Cobalah online!

Nit
sumber
1
Bagus Anda dapat mengganti denganJ
Oliver
@Liver Terima kasih banyak, saya masih lupa untuk menggunakan variabel default setiap saat, itu sangat berguna.
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'..]

Cobalah 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
sumber
Mengapa ini berhenti? Tidakkah seharusnya melipat daftar yang tak terbatas menyebabkan loop tak terbatas? Bukankah seharusnya begitu f s=foldl(#)s['a'..'z']?
user1472751
1
@ user1472751: ['a'..]tidak terbatas, karena Charmilik kelas Bounded. Sebuah daftar dengan ..]dari Boundednilai-nilai berhenti di maxBound. Cobalah: 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)

Cobalah online!

Implementasi langsung dari algoritma yang diperlukan. Menyimpan beberapa byte dengan beralih ke fungsi daripada program lengkap; penjelasannya tetap sama, kurang lebih.

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

Jelly ,  12  11 byte

W;ṢḟṁUṣ¥jʋ/

Tautan monadik yang menerima daftar karakter dan mengembalikan daftar karakter.

Cobalah online!

Bagaimana?

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
sumber
Oke, yang ini cukup merusak yang lainnya ...
NL628
1
Ya saya pikir itulah gunanya Jelly - Saya setengah berharap Dennis (pembuat Jelly) mengirimkan yang lebih pendek!
Jonathan Allan
Lol itu cukup luar biasa: P tapi saya tidak bisa mengungguli b / c Saya menggunakan penghitungan suara harian saya..rip
NL628
1
... Saya pikir mungkin ada cara untuk menyimpan byte dengan menggunakan (filter out) tapi saya belum berhasil.
Jonathan Allan
1
sepertinya, berdasarkan waktu, itu adalah O (n log n) dalam panjang input sejak pertama kali menggunakan Python sorteddan kemudian berjalan melalui iterasi dari apa yang tampak sebagai operasi yang kurang kompleks (perataan, pemisahan pada indeks yang ditemukan, bergabung, membalikkan ). - dan Python sortedadalah O (n log n).
Jonathan Allan
1

C (dentang) , 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++;}

Cobalah online!

f() mengambil char-array yang berisi string input dan panjang array ini sebagai parameter dan melakukan refleksi yang diperlukan di tempat.

callf() tidak cukup mencetak.

Kredit

-2 byte. @Kevin. Terima kasih

GPS
sumber
1
Anda dapat menghapus ruang di char *sdan perubahan i=96untuk i=9ke Hemat 2 byte.
Kevin Cruijssen
Tangkapan yang bagus .. kita tidak perlu mulai dari a. Terima kasih
GPS
144 byte
ceilingcat
1

APL + WIN, 63 byte

Anjuran untuk input string

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

Penjelasan:

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

Perl , 74 70 byte

84 80 byte termasuk doa sebagai 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
sumber