Basit Dize Yansıması


26

Bir karakterin bir yansımasını bir dizgede tanımlayarak başlayalım :

Boşluksuz, belirgin küçük harfli alfabetik harflerden oluşan bir dize verildiğinde abcdefg, bir harfin dizedeki bir harfin yansımasını, c(başka bir harfin sırasını değiştirmeden) dizedeki yeni bir yere, orijinal harf sayısının orjinali olarak değiştirmesini tanımlayın. sağında şimdi solundaki harf sayısıdır.

Böylece, mektubun bir yansıması chalinde abcdefgolacaktır abdecfg. Açıklama: sağında 4 harf vardı cve şimdi solunda 4 harf vardı c.

Biraz daha örnek:

Karakter yansıtan ein myfrienddize oluşturacaktırmyefrind

Karakter yansıtan ain axyzdize oluşturacaktır xyza.

Karakter yansıtan bin abcdize oluşturacaktır abc.

Karakter yansıtan din ddize oluşturacaktır d.

Karakter yansıtan ein efdize oluşturacaktır fe.

Daha fazla bilgi için veya bazı test durumlarını denemek için, işte C ++ dilinde yazdığım (biraz uzun) bir program.

Meydan okuma

Farklı küçük harflerden oluşan bir dize verildiğinde, her bir karakteri alfabetik olarak okuyup dizeye "yansıtın".

Açıklamalar: İp içindeki harfler, a-zboşluk yoktur, harfler benzersizdir ve en az 1 harf uzunluğunda ve en fazla 26 harf uzunluğundadır.

Örnekler

Girdi: dcba. Çıktı: dcba.

Sebep: Öncelikle, aalfabedeki en erken gelen dizedeki karakter olduğu gibi yansıtın . Alacaksın adcb. Sonra, balfabedeki sıradaki ifadeyi almak için yansıtın badc. Ardından yansıtmak calmak cbadve sonra dalmak dcba.


Girdi: myface. Çıktı: fyecma.

İpucu: Harfleri sırayla gözden geçirin a, c, e, f, m, y.


Girdi: a. Çıktı: a.


Girdi: acb. Çıktı: bac.


Girdi: cwmfjordbankglyphsvextquiz. Çıktı: ieabhqzugdltkfnvpjxsormycw.

puanlama

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.
  • Kabul ettikten ~ 100 saat sonra kabul ediyorum.

Güncel Kazanan


2
Biri bana bu bulmacanın iyi olup olmadığı konusunda fikir verebilir mi? Burada ikinci olanım (ilkim konu dışı olarak kapatıldı ... boğmaca). Bunu gerçekten tamamlamaya çalıştım, ama bir şey kaçırıp kaçırmadığımdan emin değilim. Gerçekten bu SE geliştirmek ve eğlenmek istiyorum! Teşekkürler çocuklar: D
NL628

6
Bu iyi görünüyor. Birkaç uzun örnek verebilirim (özellikle, ilk örnekler bölümünün görünüşte son durumlardan daha fazlasını sunması iyi olabilir).
Esolanging Fruit

1
Açıklama isteği: " harfler benzersizdir ", her harfin yalnızca bir kez girildiği durumda olduğu anlamına gelir, bu doğru mu?
GPS,

4
Girdi ve çıktıyı küçük harf yerine büyük harf alabilir miyiz?
Kevin Cruijssen

5
Eğer bir meydan okuma ilgili analiz almak istiyorsanız @ arada NL628, önce buraya göndermeden, o zaman içinde yazılan Sandbox .
Outgolfer Erik,

Yanıtlar:


8

Brain-Flak , 188 bayt

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

Çevrimiçi deneyin!

Görev tanımında açıklanan yansımalara ek olarak, bu kod aynı zamanda dizgiyi tam olarak 26 kez tersine çevirir. Bunun nihai çıktıya etkisi yoktur.

# 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
Vay bu oldukça şaşırtıcı. Anlayamıyorum bile: O +1
NL628

7

05AB1E , 20 17 bayt

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

Çevrimiçi deneyin!

açıklama

İlk yineleme için örnek 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'

Dize, her bir yinelemede boşluklarla çevrilidir, çünkü dizenin ilk veya son harfinde bölünme, aksi takdirde bir uzunluk-1 listesine neden olur ve birleştirme bu harfi içermez.


1
17 bayt?! ?? !! AMAZING..yet mnemonic sadece bir bayt ile sizi dövüyor: P
NL628

1
Mmmm ... Vay canına, görebildiğim tek şey çevreyi boşluklarla kaldırmak. Tuhaf görünüyor ki buna başka bir alternatif bulamıyoruz.
Magic Octopus Urn

1
@MagicOctopusUrn: İlk veya son karakterden oluşan bir bölümü ele almanın en kısa yoludur. Sadece bunun için çok fazla bayt gibi geliyor
Emigna

5

Pyth, 18 16 19 16 bayt

VSQ=QXx_QN-QNN)Q

Burada dene

açıklama

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 bayt vay? Oyları kaybederim ama maalesef günlük oy kullanma limitime ulaştım. 6 saat içinde yapacak: P
NL628

4

Python 3 , 80 73 bayt

Esolanging Fruit'e, fonksiyonların argümanlarını değiştirerek dönebileceklerini hatırlattığı için teşekkür ederim.

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

Çevrimiçi deneyin!

Girdiyi karakter listesi olarak alır.


3
Vay ben de C ++ ve Python 3 bir cevap yazdı. Python 3 cevabım seninkinin iki
katıydı


3

Retina 0.8.2 , 61 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

$
a

'Te döngüyü başlatın a.

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

Giriş geçerli harfi içeriyorsa, _orijinal konumunu temsil eden bir s dizesiyle sonuna kadar hareket ettirin .

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

Her _hamle için mektubu bir karakter geri.

}T`_l`l!`.$

Mektubu artırın. Böylece zbir değişiklik yaptıktan sonra !hiçbir şey eşleşmez ve döngü biter.

!

Sil !.


3

Java 8, 140 96 92 88 87 85 bayt

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

-44 bayt @TFeld 'in Python 2 cevabının bir portunu yaratıyor . @ OlivierGrégoire
sayesinde 6 bayt .

Yeni bir tane oluşturmak yerine giriş listesini değiştirir.

Açıklama:

Çevrimiçi deneyin.

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 Teşekkürler. Ve sadece alfabe karakterlerinden daha fazlası üzerinde döngü. :)
Kevin Cruijssen

2
O yola gidersen for(char c=9;++c>1;)daha iyi olur ;-)
Olivier Grégoire

@ OlivierGrégoire Ah elbette, charaynı zamanda gibi sarar Integer.MAX_VALUE + 1 == Integer.MIN_VALUE.. Akıllı!
Kevin Cruijssen

@ OlivierGrégoire sbir ArrayList'tir, yani indexOfgenel tipte olacaktır T( Characterbu giriş listesi için olan).
Kevin Cruijssen

3

JavaScript, 85 80 79 bayt

@DanielIndie sayesinde -6 bayt

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

Çevrimiçi deneyin!


Bu bir "string derlemek" değil bir dizedir ve splice kullanıyorsunuz
DanielIndie

@DanielIndie Input, Jo King's Python çözümü gibi bir karakter dizisi olarak geçirilmelidir.
Esolanging Fruit


bu işlevden hiçbir şey döndürmezsiniz, ya da yazdırmazsınız
DanielIndie

@DanielIndie İşlevleri argümanlarını değiştirerek dönebilir.
Esolanging Fruit


2

Kırmızı , 96 94 bayt

Kevin Cruijssen sayesinde 2 bayt kurtarıldı

func[x][foreach c sort copy x[i:(length? x)+ 1 - index? find x c insert at replace x c""i c]x]

Çevrimiçi deneyin!

Daha okunabilir:

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
Sen değiştirerek 2 bayt kaydedebilirsiniz find x c replace x c""insert at x i ciçin find x c insert at replace x c""i cbir kurtulmak için xve uzayda.
Kevin Cruijssen

@Kevin Cruijssen Teşekkürler Kevin, şimdi çok daha iyi!
Galen Ivanov

2

R , 73 72 69 bayt

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

Çevrimiçi deneyin!

Bir vektör karakterini girer ve çıkarır.


ew, cdeğişken ismi olarak mı kullanıyorsunuz ? Bu kod golf için bile korkunç!
Giuseppe

Belli ki bunu değiştirebilirim, ama burada birilerini rahatsız edebildiğini görmek beni şaşırttı. Aslında (gibi değişken adlarında bazı duygusunu koruyarak öncelik vermek eğilimindedir ciçin charoldukça kullanılmayan yerleşik ins yerine).
Kirill L.

İyileşme ararken (ki yapmadım) kendimi kullanmaya çalışırken buldum cve ne olduğunu çözemediğimde çok kötüydü. Genelde böyle problemlerden kaçınmak için kullanırım Kveya khatta kullanırım C, fakat tamamen anlarım. appenddef iş için doğru araç.
Giuseppe

Oh, görüyorum, bunun için üzgünüm, gelecekte böyle "tuzaklar" kurmaktan kaçınmaya çalışacak.
Kirill L.


2

Japt , 23 22 bayt

¬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 sayesinde bir bayt kurtarıldı .
Çevrimiçi deneyin!


1
Güzel bir. Sen yerini alabilir ileJ
Oliver

@Oliver Çok teşekkürler, hala her zaman varsayılan değişkenleri kullanmayı unuttum ve bu çok kullanışlı.
Nit

1

Haskell, 87 bayt

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

Çevrimiçi deneyin!

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             

Bu neden durdu? Sonsuz bir listeye katlanmamak sonsuz bir döngüye neden olmaz mı? Olmamalı mı f s=foldl(#)s['a'..'z']?
user1472751

1
@ user1472751: ['a'..]sonsuz değildir, çünkü Charsınıfa aittir Bounded. İçeren bir liste ..]ait Boundeddeğerlerinde durur maxBound. Deneyin: print [False ..].
nimi

1

SNOBOL4 (CSNOBOL4) , 132 128 bayt

	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)

Çevrimiçi deneyin!

Gerekli algoritmanın basit bir uygulaması. Tam program yerine bir işleve geçerek birkaç bayt kaydedildi; açıklama aynı, az ya da çok aynı kalır.

	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

Jöle ,  12  11 bayt

W;ṢḟṁUṣ¥jʋ/

Bir karakter listesini kabul eden ve bir karakter listesi döndüren tek parça bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

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"

Tamam, bu bir çok şey diğerlerini
mahvediyor

1
Bence Jelly bunun için var - Dennis'in (Jelly'in yaratıcısının) daha kısa bir tane göndermesini bekliyorum!
Jonathan Allan

Bu oldukça şaşırtıcı Lol: P ama b / c'yi alamıyorum günlük oy sayımı kullandım ..rip
NL628

1
... Bayt'ı kullanarak (filtre uygulayarak) kurtarmanın bir yolu olabileceğini düşünüyorum, ancak henüz yönetmedim.
Jonathan Allan

1
zaman dilimi gibi görünüyor, ilk Python'ları kullandığı için giriş uzunluğundaki O (n log n) 'den geliyor sortedve daha sonra daha az karmaşık işlemlerin olduğu gibi n yinelemelerden geçiyor (yassılaştırılıyor, indekslere ayrılıyor, katılıyor, geri gidiyor) ). - ve Python's sortedO (n log n) 'dir.
Jonathan Allan

1

C (clang) , 164 162 bayt

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

Çevrimiçi deneyin!

f() parametre olarak giriş dizesini ve bu dizinin uzunluğunu içeren karakter dizisini alır ve gerekli yansımaları yerinde yapar

callf() güzel baskı yapar.

Kredi

-2 bayt. @Kevin. Teşekkürler


1
Alanındaki boşluğu kaldırabilir ve 2 bayttan tasarruf etmek için char *sdeğiştirebilirsiniz . i=96i=9
Kevin Cruijssen

İyi yakala .. Başlamamız gerekmiyor a. Thanks
GPS 18


1

APL + WIN, 63 bayt

Giriş dizesi için bilgi istemi

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

Açıklama:

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 bayt

Unix filtresi olarak başlatma dahil 84 80 bayt

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.