Membalikkan konsonan

42

Program harus mengambil string sebagai input dan membalikkan konsonan di dalamnya, sambil menjaga urutan vokal. Semua huruf akan menjadi huruf kecil, jadi Anda tidak perlu khawatir tentang casing. Contohnya ikuti.

  1. Input: a test case.
    Konsonan di sini adalah t,s,t,c,s. Mereka harus datang dalam urutan terbalik, yaitu s,c,t,s,tdan dimasukkan kembali ke dalam string untuk posisi yang sama di mana karakter pra-dibalik berada: a sect sate.

  2. Input: well-done. Output: nedl-lowe.

  3. Input: reverse the consonants. Output: setenne sne cohtosarvr.

Ini adalah kode golf, solusi terpendek yang menang.

Y harus dianggap vokal terlepas dari apa itu dan tidak terbalik.

Apa pun, serta angka, tanda baca, tanda kutip, dan simbol lainnya ( @#$%^&*(){}[]\|/<>~-_+=`), berpotensi muncul di input.

nicael
sumber

Jawaban:

16

Retina, 22 21 20 17

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

Cobalah online!

Terima kasih 1 byte untuk Leaky Nun!

4 byte berkat Martin!

Oberarti mengurutkan, dan #berarti mengurutkan berdasarkan nilai numerik. Karena tidak ada karakter yang cocok yang akan memiliki nilai numerik, semua huruf memiliki bobot yang sama: 0. ^berarti membalik urutan nilai yang diurutkan, yang berkat penyortiran stabil berarti nilainya terbalik.

Cara -[...]untuk melakukan perbedaan setwise antara kelas karakter luar dan kelas dalam ini. Ini adalah bagian dari .NET dan Anda dapat membaca lebih lanjut di MSDN .

FryAmTheEggman
sumber
Sangat bagus. Apakah -[...]khusus untuk retina, atau khusus untuk .net regexes atau apakah itu fitur umum regex yang saya abaikan sampai sekarang?
Digital Trauma
@ DigitalTrauma Dengan sintaks ini saya pikir itu khusus untuk .NET. Rasa lain memiliki persimpangan kelas karakter juga, tetapi kemudian saya pikir sintaks biasanya [...&&[^...]].
Martin Ender
@ MartinEnder saya harus mencoba ini dengan sed dan grep. Tidak mungkin sed memilikinya, tetapi mungkin PCRE-mode grep.
Trauma Digital
1
Perl 6 menggunakan <[b..z] - [eiouy]>atau <:Ll - [aeiouy]>untuk melakukan set perbedaan
Brad Gilbert b2gills
15

Python 2, 86 byte

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

Mengambil input sebagai string dalam tanda kutip. Iterasi melalui input, ganti setiap konsonan dengan %sin s. Tuple cmenyimpan konsonan yang ditemui dalam urutan terbalik. Kemudian, pemformatan string menggantikan %s's sdengan konsonan di c.

Terima kasih kepada Sp3000 untuk cek konsonan, yang menghemat 4 byte dari daftar konsonan.

Tidak
sumber
1
Ini adalah kode golf yang cantik :)
Lynn
Sangat elegan, dan sangat singkat, ini adalah Python
DevilApple227
9

Jelly , 22 20 byte

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

Cobalah online!

Bagaimana itu bekerja

Ø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.
Dennis
sumber
6

JavaScript ES6, 82 81 80 78 byte

Menyimpan satu byte berkat masing-masing Martin dan Leaky Nun, dan 2 byte ke Neil!

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

Pengujian

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>

Conor O'Brien
sumber
1
Itulah penyalahgunaan argumen fungsi yang lebih buruk.
Leaky Nun
/(?![aeiouy])[a-z]/g
Leaky Nun
Akan /(?[_aeiouy])\w/gbekerja
Neil
@Neil Tidak, itu akan cocok _, yang merupakan simbol OP ingin tetap di tempatnya.
Conor O'Brien
1
Dalam demo Anda, Anda dapat mengubahnya q.onchange=q.onkeydown=q.onkeyup=menjadi hanya q.oninput=...
Patrick Roberts
5

Python 2, 106 byte

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)

Mengharapkan input "quotes", yang saya pikir diizinkan.

Lynn
sumber
4

Pyke, 18 byte

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

Coba di sini!

atau 16 byte dengan versi baru:

(Ubah jadi jika untuk mengembalikan semua output string dan memiliki input string, kembalikan string daripada daftar)

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

Coba di sini!

~c mengandung konsonan: bcdfghjklmnpqrstvwxz

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

GNU sed, 73

Skor termasuk +1 untuk -rbendera yang diteruskan ke sed.

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

Ideone.

Berganti-ganti mengubah konsonan huruf kecil pertama dan terakhir dan mengubahnya menjadi huruf besar, sampai tidak ada lagi kecocokan. Kemudian konversi seluruh string kembali menjadi huruf kecil.

Trauma Digital
sumber
4

J, 53 byte

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

Mungkin bukan cara terbaik tapi saya ingin menggunakan C.karena ini dapat diselesaikan menggunakan permutasi.

Pemakaian

   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

Penjelasan

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
mil
sumber
4

MATL, 18 22 21 byte

tt2Y211Y2'y'hX-m)P5M(

1 byte disimpan berkat @Luis

Sayangnya bagian terpanjang dari ini adalah mendapatkan daftar konsonan ( 2Y211Y2'y'hX-).

Cobalah secara Online!

Penjelasan

            % 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
Suever
sumber
1 byte lebih sedikit:tt2Y211Y2'y'hX-m)P5M(
Luis Mendo
@LuisMendo Ide bagus, terima kasih!
Suever
4

Perl 5 (58 + 4 = 62 byte)

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

+4 penalti untuk berlari dengan -0777flag, yang mengatur Perl ke mode slurp untuk menangani baris baru dengan benar.

Menerima input melalui STDIN dan mencetak ke STDOUT.

Penjelasan

                   $_=<>;   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
Silvio Mayolo
sumber
4

JavaScript (ES6), 72 byte

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

Memisahkan /([^\W\d_aeiouy])/hasil dalam konsonan yang jatuh di entri bernomor ganjil dalam array. Kemudian cukup untuk mengganti entri-entri itu dengan entri yang setara menghitung kembali dari akhir array dan menggabungkan hasilnya bersama-sama.

Neil
sumber
Pekerjaan yang baik! Saya tidak berpikir tentang pemisahan.
Conor O'Brien
5
CIA tampaknya telah menyusup ke kode Anda.
Patrick Roberts
Saya mencoba regexp yang sama tetapi juga membalikkan angka
edc65
4

JavaScript (ES6), 57 70

Edit Hebat, 20% hemat thx @Neil

Terlambat ke pesta, tetapi tampaknya semua orang javascript melewatkan sesuatu

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

Uji

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>

edc65
sumber
@nicael itu tidak pada tempatnya (nitpick!) (tapi terima kasih telah memperhatikan)
edc65
Seolah-olah itu tidak cukup buruk bahwa (karena kesalahan dalam solusi saya) Anda sudah mengalahkan saya, tampaknya Anda harus dapat menyimpan 13 byte dengan menggunakan c.pop().
Neil
@Neil wow terima kasih itu peningkatan besar
edc65
4

Perl 5, 92 68 55 byte

Disimpan 37 byte berkat bantuan @manatwork . ;-)

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

Terjemahan dari solusi Python @Lynn ke Perl.

Aries
sumber
Halo, dan selamat datang di PPCG!
NoOneIsHere
1
@NoOneIsHere Maaf, apa itu PPCG.
aries
P rogramming P uzzles & C ode G Olf.
NoOneIsHere
1
Beberapa gkekuatan " " akan membantu di sana: @s=split//;@s=/./g;dan for(@s){push@a,$_ if(/[^\Waeiou]/);}@a=/[^\Waeiou]/g;. Maksud saya, m//dengan gmodifier mengembalikan array semua pertandingan.
manatwork
1
2 Versi dapat dikurangi dengan bergabung tugas: @b=@a=…. Juga formemiliki satu pernyataan di blok tersebut (dalam hal ini ;tidak diperlukan setelah itu), Anda bisa mengubahnya menjadi pernyataan pengubah dan cadangan pembatas: print$_~~@b?pop@a:$_ for/./g. (Yepp, maaf, ketinggalan bahwa: tidak perlu menyimpan @snilai dalam variabel.)
manatwork
3

Pyth, 26 25 24 23 byte

si: Q ++ \ [JG "aeiouy" \] 3_ @ J
JG "aeiouy" sm? @DJ @ _ @ JQ ~ hZ <- hanya menyimpan ini karena @ _ @
JG "aeiouy" sm? @ DJ @@ JQ = tZ
sm? @ dJ-G "aeiouy" @@ JQ = tZ
sm | -dJ-G "aeiouy" @@ JQ = tZ

Suite uji.

Biarawati Bocor
sumber
3

Julia, 53 byte

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

Ini mengambil array karakter sebagai input dan membalikkan konsonan di tempat. Cobalah online!

Kredit jatuh ke @ Sp3000 untuk cek konsonan huruf kecil.

Bagaimana itu bekerja

i=find(...,s)menghasilkan semua indeks s yang predikatnya ... mengembalikan true dan menyimpannya sebagai variabel i .

c->'}'>c∉"aeiouy"<"$c"melakukan tiga tes dan mengembalikan true jika dan hanya jika semuanya positif.

  • '}'>cmemeriksa apakah karakter c muncul sebelum { .

  • "aeiou"memeriksa apakah string c muncul setelah a .

  • c∉"aeiouy"memverifikasi bahwa c bukan vokal.

Akhirnya, s[i]berikan semua konsonan dan s[flipud(i)]=s[i]tetapkan ke posisi dalam s yang sesuai dengan indeks terbalik di i .

Dennis
sumber
Pengkodean apa yang digunakan ini ( )?
Adám
1
UTF-8, sayangnya.
Dennis
3

Java, 319 305 261 188 byte

Penghargaan untuk @ Leaky Nun karena membantu dengan ini :-)

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

Tua:

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

Inspirasi diambil dari sini

Tidak disatukan

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);
}
Gila
sumber
2
Anda dapat menggunakan 0sebagai karakter khusus ( nulldijamin tidak berada di String), dan Anda dapat memeriksanya dengan s[i]<1(tidak ada karakter negatif)
Leaky Nun
Saya akan charAnda berkeping-keping. :)
gcampbell
3

Ruby, 53 50 byte

-3 byte dari @manatwork

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

Coba di sini

Nilai Tinta
sumber
Mengapa kode ini memblokir parameter yang tidak digunakan?
manatwork
1
@manatwork benar. Ruby akan memungkinkan Anda untuk menghapus parameter yang tidak digunakan karena itu adalah blok. Anda dapat mengurangi tiga karakter di sana.
Silvio Mayolo
@Manatwork, saya awalnya akan menggunakannya untuk sesuatu, tapi kemudian saya tidak melakukannya dan akibatnya saya lupa untuk menghapusnya
Value Ink
2

Python 2, 103 98 100 byte

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

Port jawaban JavaScript saya. Sunting: Disimpan 5 byte berkat @ Dennis, yang saya segera harus menghabiskan dua digit memperbaiki.

Neil
sumber
2

R, 120 byte

Jawaban baru:

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="")
}

mengambil string karakter sebagai x

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

Respons lama di bawah (110 byte) adalah bentuk yang buruk di pihak saya, yang hanya membalikkan konsonan:

xrev=function(x){y=rev(strsplit(x, NULL)[[1]])
paste(y[is.na(match(y, c("a", "e","i","o","u","y")))], collapse="")}
Tim
sumber
Mengapa tanda baca terbalik? Dan di mana vokal hilang?
nicael
2

APLX, 31 byte

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

⎕a~'aeoiuy'alfabet huruf kecil tanpa vokal
t←⍞menyimpan input karakter sebagai t
c←( ... )∊menyimpan Boolean "konsonan?" sebagai c
t/⍨ ekstrak (konsonan) dari t
terbalik
(c/t)←ganti konsonan dengan (yang terbalik)
tmengembalikan string yang dimodifikasi

Adm
sumber
1

Python 2.7, 144 byte

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)

Ini pertama membangun daftar terbalik dari konsonan, kemudian memasukkan masing-masing karakter lain kembali pada indeks aslinya.

Tidak golf:

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

ahli atlasologi
sumber
Anda dapat menyimpan byte dengan membuat variabel untuk 'bcdfghjklmnpqrstvwxz' dan memanggil variabel itu sebagai gantinya
MCMastery
1

Mathematica 216 byte

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@#]]&
martin
sumber
1

Haskell, 157 131 byte

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

Memperbarui

Solusi @ atlasologist membuat saya sadar bahwa saya hanya perlu daftar konsonan alih-alih pasangan (tidak perlu membalikkannya karena saya menggunakan lipatan kanan.)

Tidak disatukan

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

Tua

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

Buat daftar pasangan konsonan, kemudian berjalan melalui string menggantikan masing-masing konsonan menggunakan daftar kata.

Agak primitif, tapi saya ingin mencari tahu tanpa melihat jawabannya terlebih dahulu. :)

sudee
sumber
4
Beberapa tips: a) gunakan pelindung alih-alih if ... then ... else. b) flebih baik ditulis sebagai operator infiks, katakanlah %. c) tidak perlu untuk pasangan bagian ()dalam ((r:q),s). d) ganti ""dengan _pada baris ke-2 f. Semua dalam semua ( ktetap sama): c%(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 byte (tidak bersaing)

Disimpan satu byte karena s-lang tidak lagi membutuhkan braket argumen terakhir

Cobalah online!

r[(?![aeiouy])\w

Saya mulai mengerjakan bahasa manipulasi string golf (saya sudah lama ingin melakukan ini), dan saya pikir ini akan menjadi pertanyaan yang menyenangkan untuk dikerjakan.

Penjelasan:

  • rmembalikkan string dengan pencocokan karakter regex yang diberikan (jika tidak ada argumen regex yang diberikan, maka akan default ke .)
  • [ memulai argumen regex opsional untuk r
  • (?![aeiouy])\w regex yang cocok dengan karakter konsonan apa pun kecuali y (sayangnya JavaScript tidak mengizinkan pengurangan kelas karakter)
  • ]biasanya mengakhiri argumen regex opsional untuk r, tetapi kita tidak memerlukannya karena ini adalah fungsi terakhir dan argumen terakhir
MCMastery
sumber
1

Matlab, 67 karakter

Untuk input 'this is a string of- stuff.'

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

menghasilkan s = ffit is a fgnirt os- ssuht.

siadalah indeks dari konsonan dalam string input. Pernyataan akhir menggantikan karakter tersebut dengan karakter yang sama tetapi dalam urutan terbalik dengan mengindeks.

sintaks
sumber
Ini tidak akan menangani tanda baca apa pun kecuali -. Pertanyaannya mengatakan bahwa tanda baca apa pun adalah input yang valid dan harus diabaikan. Selain itu, Anda harus menggunakan input('')untuk mengambil input atau menulis fungsi anonim karena kami tidak dapat menerima variabel sebagai input seperti ini.
Suever
1
Anda juga dapat menggunakan flipuntuk membalikkan string.
Suever
Tanda baca diedit ke pertanyaan setelah saya diposting, tetapi saya akan memperbaikinya. Mengenai input, dapatkah saya hanya menggunakan ans, karena itulah input default untuk konsol Matlab ditugaskan?
sintax
1
Saya kira tidak. itu harus menjadi solusi mandiri. Anda perlu melakukan s=input('')atau entah bagaimana membuat ini menjadi fungsi anonim@(s)
Suever
Ok, saya akan melakukannya nanti atau besok. Saya jauh dari komputer saya sekarang.
sintax
1

PowerShell , 81 byte

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

Cobalah online!

Kurang bermain golf:

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

PowerShell , 88 byte, -f

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

Cobalah online!

mazzy
sumber
0

q / kdb +, 45 byte

Larutan:

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

Penjelasan:

Temukan indeks konsonan, dan gantilah dengan konsonan terbalik:

{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

Catatan:

Saya punya 3 cara untuk membangun daftar konsonan, yang ada dalam solusi sedikit lebih baik daripada alternatif:

  • "bcdfghjklmnpqrstvwxz" untuk 22 karakter (paling membosankan)
  • .Q.a _/0 3 6 11 16 19 selama 21 karakter (agak keren, letakkan setiap indeks)
  • .Q.a except"aeiouy" selama 19 karakter (paling membosankan kedua)
streetster
sumber
0

Jq 1.5 , 289 263 byte

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

Penjelasan

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

Contoh dijalankan

$ 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

Cobalah online

jq170727
sumber
0

Java 8, 157 byte

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(""))

Cobalah online!

Catatan: mencetak peringatan kompiler ke stderr.
Penjelasan:

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

Tidak akan berbohong, satu-satunya tujuan saya adalah mengalahkan jawaban ini

Benjamin Urquhart
sumber