Ünsüzleri ters çevir


42

Program, giriş sırasındaki bir ipi almalı ve sesli harflerin sırasını tutarken içindeki ünsüz harflerini tersine çevirmelidir. Tüm harfler küçük harf olacaktır, bu yüzden kasa hakkında endişelenmenize gerek yoktur. Örnekler izleyin.

  1. Girdi: a test case.
    Ünsüzler burada t,s,t,c,s. Bunlar ters sırayla, ie gelmelidir s,c,t,s,t: ve önceden ters karakterler bulunurdu aynı konumlara dize yerleştirilen arka a sect sate.

  2. Girdi: well-done. Çıktı: nedl-lowe.

  3. Girdi: reverse the consonants. Çıktı: setenne sne cohtosarvr.

Bu golf kodudur, en kısa çözüm kazanır.

Y ne olduğuna ve tersine çevrilmediğine bakılmaksızın ünlü olarak kabul edilmelidir.

@#$%^&*(){}[]\|/<>~-_+=`Girişte sayılar, noktalama işaretleri, tırnak işaretleri ve diğer semboller ( ) gibi her şey potansiyel olarak görünebilir.

Yanıtlar:


16

Retina, 22 21 20 17

O#^`[b-z-[eiouy]]

Çevrimiçi deneyin!

Leaky Nun'a 1 byte teşekkürler!

Martin'e 4 bayt teşekkürler!

Osıralama aracı ve #sayısal değer tür anlamına gelir. Eşleşen karakterlerin hiçbiri hiçbir zaman sayısal bir değere sahip olamayacağından, tüm harfler aynı ağırlığa sahiptir: 0. ^Sıralanan değerlerin sırasını tersine çevirir, bu da sabit sıralama sayesinde değerlerin tersine çevrildiği anlamına gelir.

-[...]Aracı, dış karakteri ile bu iç sınıf arasındaki setwise farkı yapmak. Bu .NET'in bir parçasıdır ve MSDN'de daha fazlasını okuyabilirsiniz .


Çok hoş. -[...]Retinaya özgü veya .net regex'lerine özgü mü , yoksa şu ana kadar göz ardı ettiğim genel bir regex özelliği mi?
Dijital Travma

@DigitalTrauma Bu sözdizimi ile .NET'e özgü olduğunu düşünüyorum. Diğer tatlar da karakter sınıfı kesişimine sahiptir, fakat sonra sözdiziminin genellikle olduğunu düşünüyorum [...&&[^...]].
Martin Ender

@MartinEnder bunları sed ve grep ile denemek zorunda kalacağım. Muhtemelen sed, ama belki PCRE modu grep vardır.
Dijital Travma

1
Perl 6 kullanıyor <[b..z] - [eiouy]>ya da <:Ll - [aeiouy]>fark yaratıyor
Brad Gilbert b2gills

15

Python 2,86 bayt

s='';c=()
for x in input():b='{'>x not in'aeiouy'<x;s+=b*'%s'or x;c=(x,)*b+c
print s%c

Girdiyi tırnak içinde dizge olarak alır. Her ünsüz değiştirilmesi giriş dolaşır, %siçinde s. Tuple ckarşılaşılan ünsüzleri ters sırada saklar. Sonra, dize yerine geçer biçimlendirme %siçinde 's siçinde ünsüz c.

Ünsüzlerin listelenmesi için 4 bayt kazandıran ünsüz kontrolü için Sp3000'e teşekkürler.


1
Bu kod golf güzel bir parçası :)
Lynn

Gerçekten şık ve şaşırtıcı derecede kısa, bu Python olmak
DevilApple227

9

Jöle , 22 20 bayt

Øaḟ“<1Ṛż»
e€¢œpżf¢Ṛ$

Çevrimiçi deneyin!

Nasıl çalışır

Øaḟ“<1Ṛż»   Helper link. No arguments.

Øa          Yield the lowercase alphabet/
   “<1Ṛż»   Decompress that string, yielding "oui aye".
  ḟ         Filter; remove the characters from the right string from the left one.


e€¢œpżf¢Ṛ$  Main link. Argument: s (string)

  ¢         Call the helper link, yielding the string of all consonants.
e€          Test each character of s for membership.
   œp       Partition s at members/consonants.
         $  Combine the three links to the left into a monadic chain.
      f¢    Filter by presence in the consonant string.
        Ṛ   Reverse the result.
     ż      Zipwith; interleave chunks of non-consonants and reversed consonants.

6

JavaScript ES6, 82 81 80 78 bayt

Martin ve Sızdıran Rahibe'nin her birine bir bayt ve Neil'e 2 bayt kaydedildi!

a=>a.replace(r=/(?[_aeiouy])\w/g,e=>[...a].reverse().join``.match(r)[i++],i=0)

Test yapmak

f=
a=>a.replace(r=/(?![aeiouy])[a-z]/g,e=>[...a].reverse().join``.match(r)[i++],i=0)
;
q.onchange=q.onkeydown=q.onkeyup=function(){
  o.innerHTML = "";
  o.appendChild(document.createTextNode(f(q.value)));
}
*{font-family:Consolas,monospace;}
<input autocomplete="off" id=q>
<div id=o></div>


1
İşlev tartışmalarının en kötüye kullanımı budur.
Leaky Nun

/(?![aeiouy])[a-z]/g
Sızdıran Rahibe

Çalışır /(?[_aeiouy])\w/gmı?
Neil

@Neil Hayır, bu _OP'nin yerinde tutmak istediği bir sembol olan eşleşir .
Conor O'Brien

1
Demonuzda, q.onchange=q.onkeydown=q.onkeyup=sadece değişebilir q.oninput=...
Patrick Roberts

5

Python 2, 106 bayt

s=input()
b=[x for x in s if x in'bcdfghjklmnpqrstvwxz']*2
print''.join(x in b and b.pop()or x for x in s)

"quotes"İzin verildiğini düşündüğüm bir girdi bekliyor .


4

Pyke, 18 bayt

FD~c{IK_#~c{)oR@(s

Burada dene!

veya yeni sürümde 16 bayt:

(Eğer tüm dizge çıktılarını döndürür ve dizge girişi varsa, liste yerine dizge döndürürse değiştirin)

FD~c{IK_#~c{)oR@

Burada dene!

~c ünsüzleri içerir: bcdfghjklmnpqrstvwxz

F                - For i in input:
  ~c{I           -  if i in "bcdfghjklmnpqrstvwxz":
       _#~c{)    -    filter(reversed(input), <-- in "bcdfghjklmnpqrstvwxz")
             oR@ -   ^[o++]

4

GNU sed, 73

Skor, -rsed'e iletilen bayrak için +1'i içerir .

:
s/([b-df-hj-np-tv-xz])(.*)([b-df-hj-np-tv-xz])/\u\3\2\u\1/
t
s/./\l&/g

Ideone.

İlk ve son küçük harf ünsüzünü tekrar tekrar değiştirir ve daha fazla eşleşme olmadıkça bunları büyük harfe dönüştürür. Sonra tüm dizgiyi küçük harfe dönüştürün.


4

J, 53 bayt

C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'bcdfghjklmnpqrstvwxz'

Belki en iyi yol değil ama kullanmak istedim C.çünkü bu permütasyonlar kullanılarak çözülebiliyordu.

kullanım

   f =: C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'bcdfghjklmnpqrstvwxz'
   f 'a test case'
a sect sate
   f 'well-done'
nedl-lowe
   f 'reverse the consonants'
setenne sne cohtosarvr

açıklama

C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'...'  Input: s
                               '...'  The list of consonants
                            e.&'...'  Generate a boolean mask where an index is true
                                      if the char at that index in s is a consonant
                         I.@          Get a list of the true indices
                  (  |.)@             Reverse that list
                  (,.  )@             Join the original and reversed list as columns
            /:~"1@                    Sort each row of that 2d list
         ~.@                          Take the distinct values in each row
       <@                             Box them
   [:~.                               Take the distinct boxes - Now represents the
                                      permutation needed to solve this in cycle notation
C.~                                   Permute s according the cycles and return

4

MATL, 18 22, 21 bayt

tt2Y211Y2'y'hX-m)P5M(

@Luis sayesinde 1 bayt kurtarıldı

Maalesef bunun en uzun kısmı ünsüzlerin ( 2Y211Y2'y'hX-) listesini almak .

Çevrimiçi Deneyin!

açıklama

            % Implicitly grab the input
tt          % Duplicate twice
2Y2         % Grab the pre-defined list of all lower-case letters
llY2        % Grab the pre-defined list of lower-case vowels (excluding 'y')
'y'h        % Add 'y' to the list of vowels
X-          % Find the set difference between these two lists (the consonants)
m           % Create a boolean array the size of the input that is true for all consonants
)           % Use this as an index to grab all consonants
P           % Reverse the order of the consonants
5M          % Get the boolean array again
(           % Re-assign the flipped consonants with the original consonant locations
            % Implicitly dislpay the result

1 byte daha az:tt2Y211Y2'y'hX-m)P5M(
Luis Mendo

@LuisMendo Mükemmel bir fikir, teşekkürler!
Suever

4

Perl 5 (58 + 4 = 62 bayt)

$_=<>;$r=qr/(?![eiouy])[b-z]/;@a=/$r/g;s/$r/pop@a/ge;print

-0777Bayrakla çalışmak için +4 ceza;

STDIN üzerinden girişi kabul eder ve STDOUT'a yazdırır.

açıklama

                   $_=<>;   Read the input
 $r=qr/(?![eiouy])[b-z]/;   Save the regex; we'll be using it twice
                @a=/$r/g;   Store all the consonants in an array
           s/$r/pop@a/ge;   Replace each consonant with the final value in the array and pop
                   print    Output the result

4

JavaScript (ES6), 72 bayt

s=>s.split(/([^\W\d_aeiouy])/).map((c,i,a)=>i&1?a[a.length+~i]:c).join``

/([^\W\d_aeiouy])/Dizide tek sayılı girişlere düşen ünsüzlerin sonuçlara bölünmesi . Ardından, bu girişleri dizinin sonundan geriye sayan eşdeğer girişe sahip olarak değiştirmek ve sonucu birleştirmek yeterli olur.


İyi iş! Bölünmeyi düşünmedim.
Conor O'Brien,

5
CIA kodunuza sızmış görünüyor.
Patrick Roberts

Aynı
regexp'i

4

JavaScript (ES6), 57 70

Düzenle Amazing 20% ​​saving thx @Neil

Partiye geç kaldık ama görünüşe göre tüm javascript insanlar bir şeyleri özledi

a=>a.replace(r=/[^\W\d_aeiouy]/g,_=>c.pop(),c=a.match(r))

Ölçek

f=a=>a.replace(r=/[^\W\d_aeiouy]/g,_=>c.pop(),c=a.match(r))

function test() {
  var i=I.value
  O.textContent=f(i)
}

test()
#I { width:90% }
<input id=I oninput="test()" value="reverse the consonants."><pre id=O></pre>


@nicael basitçe yerinde değil (nitpick!) (ama
farkettiğin

Yeterince kötü değildi sanki (çözümümdeki bir hata nedeniyle) beni çoktan dövüyorsun, kullanarak 13 byte tasarruf edebiliyor olmalısın c.pop().
Neil

@Neil vay bu çok büyük bir gelişme
edc65 23

4

Perl 5, 92 68 55 bayt

Kaydedilen 37 sayesinde bayt @manatwork 'ın yardımı. ;-)

$_=<>;@b=@a=/[^\Waeiou]/g;print$_~~@b?pop@a:$_ for/./g

@ Lynn Python çözümünün Perl'e çevirisi .


Merhaba, PPCG'ye hoş geldiniz!
NoOneIsHere

1
@Hiçbiri yokHere Üzgünüz, PPCG nedir?
Koç,

P rogramming P uzzles ve gazel G olf.
NoOneIsHere

1
Bazı “ g” kuvvetleri orada yardımcı olabilir: @s=split//;@s=/./g;ve for(@s){push@a,$_ if(/[^\Waeiou]/);}@a=/[^\Waeiou]/g;. Yani m//birlikte gdeğiştirici getiri tüm maçları bir dizi.
Manat çalışması

1
2 versiyon atamaları katılarak azaltılabilir: @b=@a=…. Ayrıca for(bu durumda bloktaki tek bildiriye sahip ;ondan sonra gerekli değildir) kullanarak, deyim değiştirici ve yedek sınırlayıcı dönüştürecek olabilir: print$_~~@b?pop@a:$_ for/./g. (Yepp, üzgünüm, kaçırdım: @sbir değişkende değer saklamanıza gerek yok .)
manatwork

3

Pyth, 26 25 24 23 bayt

Si: S ++ \ [JG "aeiouy" \] 3_ J @
JG "aeiouy" sm? @DJ @ _ @ JQ ~ hZ <- çünkü @ _ @
JG "aeiouy" sm? @ DJ @@ JQ = TZ
sm? @ dJ-G "aeiouy" @@ JQ = Tz
sm | -DJ-G "aeiouy" @@ JQ = TZ

Test odası.


3

Julia, 53 bayt

!s=s[flipud(i)]=s[i=find(c->'}'>c"aeiouy"<"$c",s)]

Bu girdi olarak bir karakter dizisini alır ve ünsüzlerini yerinde tersine çevirir. Çevrimiçi deneyin!

Küçük harf ünsüz kontrolü için Credit @ Sp3000'e gider.

Nasıl çalışır

i=find(...,s)tüm indisleri verir s yüklem hangi ... döndürür true ve onları o değişkeni kaydeder i .

c->'}'>c∉"aeiouy"<"$c"Üç sınama gerçekleştirir ve yalnızca hepsi pozitifse ve true değerini döndürür .

  • '}'>cc karakterinin { önce gelip gelmediğini kontrol eder .

  • "aeiou"çekler ise dize c sonra gelen bir .

  • c∉"aeiouy"c'nin ünlü olmadığını doğrular .

Son olarak, s[i]tüm ünsüz ve verimleri s[flipud(i)]=s[i]konumlara atar bunları s olmasıyla ters indekslerine karşılık gelir i .


Bu hangi kodlamayı kullanıyor ( )?
Adám

1
UTF-8, ne yazık ki.
Dennis,

3

Java, 319 305 261 188 bayt

Bu :-) ile ilgili yardım için @ Leaky Nun Kredi

char[]r(char[]s){int i=0,j=0,n=s.length;char[]o=new char[n];for(;i<n;i++){if((s[i]+"").matches("(?![eiouy])[b-z]")){o[j++]=s[i];s[i]=65;}}for(i=0;i<n;i++)if(s[i]==65)s[i]=o[--j];return s;}

Eski:

s(String p){int i=0,j=0;char[]s=p.toCharArray(),o=p.toCharArray();for(;i<s.length;i++){if(((s[i]+"").matches("[aeiouy @#$%^&*(){}\\[\\]\\|/\\\\<>~\\-_+=`]")))continue;o[j++]=(s[i]);s[i]='A';}for(i=0;i<s.length;i++)if(s[i]=='A')s[i]=o[--j];return new String(s);}

Buradan alınan ilham ❤

Ungolfed

String s(String p){
    int i = 0, j = 0;
    char[]s=p.toCharArray(),o=p.toCharArray();
    for (;i<s.length;i++) {
        if (((s[i]+"").matches("[aeiouy @#$%^&*(){}\\[\\]\\|/\\\\<>~\\-_+=`]"))) continue;
        o[j++] = (s[i]); // Store the consonant into o
        s[i] = 'A'; // Put a special character in its place
    }
    for (i=0;i<s.length;i++)
        if (s[i] == 'A') // If special character
            s[i] = o[--j]; // Put back the consonant in reverse order
    return new String(s);
}

2
0Özel karakter olarak kullanabilirsiniz ( nullDize'de olmadığından emin olunur) ve onu kontrol edebilirsiniz s[i]<1(negatif karakter yoktur)
Leaky Nun

Seni charparçalara ayırırım. :)
gcampbell

3

Ruby, 53 50 bayt

@Manatwork gelen -3 bayt

->s{i=0;s.gsub(r=/[^\Waeiouy_]/){s.scan(r)[i-=1]}}

Burada dene


Kod neden kullanılmayan bir parametreyi engelledi?
Manat çalışması

1
@ manatwork haklı. Ruby bir blok olduğundan kullanılmayan parametreyi atlamanıza izin verecektir. Oradaki üç karakteri tıraş edebilirsin.
Silvio Mayolo

@ manatwork, başlangıçta bir şey için kullanacaktım, ama sonra yapmadım ve sonuç olarak çıkarmayı unuttum
Value Ink

2

Python 2, 103 98 100 bayt

import re
def r(s):a=re.split("([^\W\d_aeiouy])",s);print''.join(sum(zip(a[::2],a[-2::-2]+['']),()))

JavaScript cevabımın limanı. Düzenleme: Derhal iki sabitleme hanesi harcamak zorunda kaldığım @ Dennis ♦ sayesinde 5 bayt kaydedildi.


2

R, 120 bayt

Yeni cevap:

az=function(x){
y=strsplit(x, NULL)[[1]]
a=regexpr("[bc-df-hj-np-tv-z]", y)
y[a==1]=rev(y[a==1])
paste(y, collapse="")
}

x olarak bir karakter dizesi alır

az("reverse the consonants")
[1] "setenne sne cohtosarvr"

Altındaki eski yanıt (110 bayt) benim tarafımdan zayıf bir şekildi ve bu sadece ünsüzleri tersine çevirdi:

xrev=function(x){y=rev(strsplit(x, NULL)[[1]])
paste(y[is.na(match(y, c("a", "e","i","o","u","y")))], collapse="")}

Noktalama işaretleri neden ters çevrilmiş? Ve ünlüler nereye gitti?
nicael


2

APLX, 31 bayt

(c/t)←⌽t/⍨c←(t←⍞)∊⎕a~'aeoiuy'
t

⎕a~'aeoiuy'ünlü olmayan küçük harfli alfabe
t←⍞karakter girişini t
c←( … olarak kaydetme )∊Boolean “ünsüz?” olarak C
t/⍨ ayıklamak (sessiz) t
ters
(c/t)←(ters olanlar) ile ünsüz yerine
tmodifiye edilmiş bir dize döndürür


1

Python 2.7, 144 bayt

def f(a):c='bcdfghjklmnpqrstvwxz';b=[x for x in list(a[::-1])if x in c];[b.insert(x,a[x])for x in range(len(a))if a[x]not in c];return''.join(b)

Bu ilk önce ünsüzlerin tersine çevrilmiş bir listesini oluşturur, ardından diğer karakterlerin her birini orijinal dizinlerine geri ekler.

Un-golfed:

s = 'well-done'
reverse = list(s[::-1])
consonants = [i for i in reverse if i in 'bcdfghjklmnpqrstvwxz']

for x in range(len(s)):
    if s[x] not in 'bcdfghjklmnpqrstvwxz':
        consonants.insert(x,s[x])

print(''.join(consonants))

https://repl.it/C30O


'Bcdfghjklmnpqrstvwxz' için bir değişken yaparak ve bunun yerine bu değişkeni arayarak baytları kaydedebilirsiniz
MCMastery

1

Mathematica 216 bayt

Module[{h,v,i},v=Characters["aeiouy "];h[s_]:=SortBy[Flatten[Thread/@Transpose@{v,#[[All,1]]&/@(StringPosition[s,#]&/@v)},1],Last];i[s_,{a_,n_}]:=StringInsert[s,a,n];Fold[i,StringReverse@StringReplace[#,v->""],h@#]]&

1

Haskell, 157 131 bayt

k="bcdfghjklmnpqrstvwxz";f c((r:q),s)=if c`elem`k then(q,r:s)else(r:q,c:s);f c("",s)=("",c:s);g s=snd$foldr f(filter(`elem`k)s,"")s

Güncelleme

@ atlasologist'in çözümü, çiftler yerine sadece ünsüzlerin bir listesine ihtiyacım olduğunu fark etmemi sağladı (doğru kat kullandığımdan beri onları tersine çevirmeye gerek yok).

Ungolfed

consonants = "bcdfghjklmnpqrstvwxz"

-- Combining function (right fold, improved)
f :: Char -> (String, String) -> (String, String)
f c ((r:rest), s) = if c `elem` consonants then (rest, r:s) else (r:rest, c:s)
f c ("", s) = ("", c:s)

transform :: String -> String
transform s = snd $ foldr f (filter (`elem` consonants) s, "") s


main = do
    line <- getLine
    putStrLn . transform $ line

Eski

c="bcdfghjklmnpqrstvwxz";n c(a@((f,t):q),s)=if c==f then(q,t:s)else(a,c:s);n c([],s)=([],c:s);g s=let z=filter(`elem`c)s in snd$foldr n(zip (reverse z)z,"")s

Ünsüz çiftlerinin bir listesini oluşturur, daha sonra söz konusu listeyi kullanarak her bir ünsüzün yerini alan ipte yürür.

Biraz ilkel, ama önce cevaplara bakmadan bunu çözmek istedim. :)


4
Bazı ipuçları: a) yerine koruma kullanın if ... then ... else. b) fbir ek işleci olarak daha iyi yazılmışsa, diyelim %. c) iç çifti için gereken ()içinde ((r:q),s). d) 2. satırında ""ile değiştirin . Tüm (Tüm kalır aynıdır): . _fkc%(r:q,s)|c`elem`k=(q,r:s)|1<2=(r:q,c:s);c%(_,s)=("",c:s);g s=snd$foldr(%)(filter(`elem`k)s,"")s
nimi,

1

s-lang ,17 16 bayt (rekabet etmeyen)

Bir bayt kaydedildi çünkü s-lang artık son argüman braketi gerektirmiyor

Çevrimiçi deneyin!

r[(?![aeiouy])\w

Bir dize manipülasyonu olan golf dili üzerinde çalışmaya başladım (bunu bir süredir yapmak istiyordum) ve bunun üzerinde çalışmak için eğlenceli bir soru olacağını düşündüm.

Açıklama:

  • rdizeyi verilen bir regex karakter eşleştiricisi ile tersine çevirir (eğer regex argümanı yoksa, varsayılan olarak olacaktır .)
  • [ için isteğe bağlı regex argümanını başlatır r
  • (?![aeiouy])\w regex, y hariç herhangi bir ünsüz karakterle eşleşir (ne yazık ki JavaScript karakter sınıfı çıkarmasına izin vermez)
  • ]genellikle isteğe bağlı regex argümanını sonlandırır r, ancak son fonksiyon ve son argüman olduğu için buna ihtiyacımız yoktur.

1

Matlab, 67 karakter

Bir giriş için 'this is a string of- stuff.'

s=input('','s');si=regexp(s,'[b-df-hj-np-tv-xz]');s(si)=s(flip(si))

üretir s = ffit is a fgnirt os- ssuht.

siGiriş dizesindeki ünsüzlerin göstergeleridir. Son ifade, bu karakterleri aynı karakterlerle değiştirir, ancak dizinleri sıralayarak ters sırada yazar.


Bu, dışında bir noktalama işaretini kullanmayacak -. Soru herhangi bir noktalama işaretinin geçerli bir girdi olduğunu ve göz ardı edilmesi gerektiğini söylüyor. Ayrıca, input('')girişi almak ya da anonim bir işlev yazmak için kullanmanız gerekir, çünkü böyle bir değişkeni kabul edemeyiz.
Suever

1
Ayrıca flipipi ters çevirmek için de kullanabilirsiniz .
Suever

Noktalama işaretim, gönderimden sonra soruya eklendi, ancak düzelteceğim. Giriş ile ilgili olarak, sadece kullanabilir miyim ans, Matlab konsoluna varsayılan bir giriş atanmış mı?
sintax

1
Sanmıyorum kendi kendine yeten bir çözüm olmalıdır. Bunu s=input('')veya bir şekilde bunu adsız bir işleve @(s)
sokmanız gerekecek

Tamam, bunu daha sonra ya da yarın yapacağım. Artık bilgisayarımdan uzaktayım.
sintax

1

PowerShell , 81 bayt

-join(($a=$args|% t*y)|%{if($_-in($c=$a-match'[^\W\d_aeiouy]')){$_=$c[--$i]};$_})

Çevrimiçi deneyin!

Daha az golf oynadı:

$a          = $args|% toCharArray
$consonants = $a-match'[^\W\d_aeiouy]'
$result     = $a|%{if($_-in$consonants){$_=$consonants[--$i]};$_}
-join($result)

PowerShell , 88 bayt, -f

$i=0;-join($args|% t*y|%{if($_-match'[^\W\d_aeiouy]'){$c=,$_+$c;$_="{$i}";$i++};$_})-f$c

Çevrimiçi deneyin!


0

q / kdb +, 45 bayt

Çözüm:

{x[w]:x(|)w:(&)max x=/:.Q.a except"aeiouy";x}

Açıklama:

Ünsüzlerin indekslerini bulun ve ters çevrilmiş ünsüzlerle değiştirin:

{x[w]:x reverse w:where max x=/:.Q.a except "aeiouy";x} / ungolfed
{                                                   ; } / two-statement lambda
                                .Q.a except "aeiouy"    / alphabet (a..z) except vowels
                            x=/:                        / equals each-right (returns boolean lists where input is each a consonant)
                        max                             / 'or' the results together
                  where                                 / indices where results are true
                w:                                      / save in variable w
        reverse                                         / reverse this list
      x                                                 / index into input at these indices
 x[w]:                                                  / assign values to x at indices w
                                                     x  / return x

Notlar:

Ünsüz listesini oluşturmak için 3 yöntemim vardı, çözümdeki seçenek alternatiflerden biraz daha iyi:

  • "bcdfghjklmnpqrstvwxz" 22 karakter için (en sıkıcı)
  • .Q.a _/0 3 6 11 16 19 21 karakter için (çok havalı, her dizine bırak)
  • .Q.a except"aeiouy" 19 karakter için (en sıkıcı ikinci)

0

Jq 1.5 , 289 263 bayt

def C:"bcdfghjklmnpqrstvwxz";. as$s|[("^","")as$p|[match("([\($p)\(C)]+)";"g").captures[].string]]|.[1]|=(reduce map(length)[]as$l({s:add|explode|reverse|implode,r:[]};.r+=[.s[0:$l]]|.s=.s[$l:])|.r)|if$s[0:1]|inside(C)then[.[1,0]]else . end|transpose|map(add)|add

açıklama

def consonants:"bcdfghjklmnpqrstvwxz";

  . as $s
| [  ("^","") as $p                                              # parse string onto non-consonant
   | [match("([\($p)\(consonants)]+)";"g").captures[].string]]   # and consonant groups
| .[1] |= (
     reduce map(length)[] as $l (                                # build new for consonant groups
       {s:add|explode|reverse|implode,r:[]}                      # by adding groups from reversed string
     ; .r+=[.s[0:$l]] | .s=.s[$l:]                               
     )
     |.r
  )
| if $s[0:1]|inside(consonants) then  [.[1,0]] else . end        # put groups into proper order for merge
| transpose | map(add) | add                                     # merge groups into final string

Örnek çalışma

$ jq -MRr 'def C:"bcdfghjklmnpqrstvwxz";. as$s|[("^","")as$p|[match("([\($p)\(C)]+)";"g").captures[].string]]|.[1]|=(reduce map(length)[]as$l({s:add|explode|reverse|implode,r:[]};.r+=[.s[0:$l]]|.s=.s[$l:])|.r)|if$s[0:1]|inside(C)then[.[1,0]]else . end|transpose|map(add)|add' input
a sect sate
nedl-lowe
setenne sne cohtosarvr

Çevrimiçi deneyin


0

Java 8, 157 bayt

s->s.format(s.replaceAll("[^\\W\\d_aeiouy]","%s"),s.chars().mapToObj(c->""+(char)c).filter(c->c.matches("[^\\W\\d_aeiouy]")).reduce("",(x,y)->y+x).split(""))

Çevrimiçi deneyin!

Not: derleyici uyarılarını stderr olarak yazdırır.
Açıklama:

s->                                                    // Lambda function
    s.format(                                          // Format a string using the given arguments
        s.replaceAll("[^\\W\\d_aeiouy]","%s"),         // Generate the format string by replacing all consonants with "%s"
        s.chars()                                      // Stream the characters of the input string s
            .mapToObj(c->""+(char)c)                   // Map characters back to strings
            .filter(c->c.matches("[^\\W\\d_aeiouy]"))  // Filter out vowels and symbols
            .reduce("",(x,y)->y+x)                     // Build the string of consonants in reverse
            .split("")                                 // Turn into an array of single-char strings (varargs abuse)
    )                                                  // Implicit return of the formatted string

Yalan söylemeyeceğim tek amacım bu cevabı yenmek oldu.


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.