Kembangkan string


371

Dalam tantangan ini, Anda harus mengambil string yang cocok dengan regex ^[a-zA-Z]+$atau apa pun yang masuk akal (Anda tidak harus mempertimbangkan huruf besar atau kecil jika Anda mau) (Anda dapat menganggap string cukup panjang, dan memiliki struktur yang tepat untuk semua operasi), dan menampilkan string lain, yang dihasilkan mirip dengan kata di akhir tweet dadaist oleh POTUS ( "Despite the constant negative press covfefe").

Cara mengabadikan string:

Pertama, dapatkan grup suara pertama (terdiri terminologi).

Bagaimana kamu melakukan ini? Baik:

  • Temukan vokal pertama ( yjuga vokal)

      v
    creation
    
  • Cari konsonan pertama setelah itu

        v
    creation
    
  • Hapus sisa string

    creat
    

Itu adalah grup suara pertama Anda.

Langkah berikutnya:

Dapatkan konsonan terakhir dari grup suara

t

dan menggantinya dengan versi bersuara atau tidak bersuara. Untuk melakukan ini, cari surat di tabel ini. Ganti dengan surat yang diberikan (yang mungkin surat yang sama)

b: p
c: g
d: t
f: v
g: k
h: h
j: j
k: g
l: l
m: m
n: n
p: b
q: q
r: r
s: z
t: d
v: f
w: w
x: x
z: s

jadi, kita dapatkan

d

Kemudian, ambil vokal berikutnya setelah konsonan itu. Anda dapat mengasumsikan bahwa konsonan ini bukan di akhir string. Gabungkan keduanya, lalu ulangi dua kali:

didi

Gabungkan ini ke grup suara pertama:

creatdidi

Anda selesai: string di-cfifikasi, dan sekarang Anda dapat meng-output-nya.

Kasus uji:

coverage: covfefe

example: exxaxa

programming: progkaka (the a is the first vowel after the g, even though it is not immediately after)
code: codtete

president: preszizi

Ini , jadi harap buat program Anda sesingkat mungkin!


7
"x" secara teknis harus memetakan ke "gz". "qu" harus dipetakan ke "gw".
Steve Bennett

2
Ini menentukan satu konsep kovfifikasi tetapi saya tetap merasa bahwa referensi ke karya Douglas Hofstadter (dan Melanie Mitchell) bekerja pada analogi konversi-string, misalnya dalam Fluid Concepts tampaknya sesuai.
Mars

60
Jawaban lebih dari 140 karakter harus didiskualifikasi
Sandy Gifford

12
Sayangnya tidak mungkin untuk melakukan ini di TrumpScript :(

4
@ThePlasmaRailgun Itu adalah lelucon, karena tweet harus 140 karakter atau kurang.
Buah Esolanging

Jawaban:


91

Jelly ,  58  57 byte

<TḢị
e€Øyµ¬TĖEÐḟḢṪ;ç¥T
ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2

Program lengkap yang menerima daftar karakter huruf kecil dan mencetak hasilnya.

Cobalah online!

Bagaimana?

<TḢị - Link 1, extract first value from y not less than x: number, x; list of numbers, y
     -                                                     e.g. 5, [3,4,7]
<    - x less than vectorised across y                             [0,0,1]
 T   - truthy indices                                              [    3]
  Ḣ  - head                                                             3
   ị - index into y                                                     7

e€Øyµ¬TĖEÐḟḢṪ;ç¥T - Link 2, indices of the letters to manipulate: list of characters, w
  Øy              - vowel+ yield = "AEIOUYaeiouy"                 e.g.  "smouching" 
e€                - exists in for €ach letter in w                       001100100
    µ             - monadic chain separation, call that v
     ¬            - not vectorised across v                              110011011
      T           - truthy indices                                       12  56 89
       Ė          - enumerate                      [[1,1],[2,2],[3,5],[4,6],[5,8],[6,9]]
         Ðḟ       - filter discard if:
        E         -   elements are equal                       [[3,5],[4,6],[5,8],[6,9]]
           Ḣ      - head                                        [3,5]
            Ṫ     - tail                                           5
                T - truthy indices of v                                    34  7
               ¥  - last 2 links as a dyad
              ç   -   call last link (1) as a dyad                         7
             ;    -   concatenate                                     5,7
                  -                                    ...i.e the indexes of 'c' and 'i'

ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2 - Main link: list of characters, w
                                   -                             e.g.  "smouching"
 Ç                                 - call the last link (2) as a monad    [5,7]
ḣ                                  - head to index (vectorises)      ["smouc","smouchi"]
  Ḣ                                - head                             "smouc"
                                   -   implicit print due to below leading constant chain
   ⁸                               - link's left argument, w
    Ç                              - call the last link (2) as a monad    [5,7]
     ị                             - index into w                         "ci"
      µ                            - monadic chain separation, call that p
       Ḣ                           - head p                               'c'
        ØY                         - consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
          i                        - first index                          22
                          ¤        - nilad followed by link(s) as a nilad:
            “ßȷ%Hẹrȧq’             -   base 250 number = 1349402632272870364
                        ØY         -   consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
                      œ?           -   nth permutation  = "BCDFGHJKLMNPQRSTVWXZpctvkhjglmnbqrzdfwxs"
           ị                       - index into         (special case ->) 'c'
                           ⁾cg     - literal ['c','g']
                              y    - translate (change 'c's to 'g's)      'g'
                               ;   - concatenate with the headed p        "gi"
                                ẋ2 - repeat list twice                    "gigi"
                                   - implicit print ...along with earlier = smoucgigi

13
Ini luar biasa ...
Klangen

Pekerjaan luar biasa.
JF it

9
Aku Jeli. Terpilih.
DeepS1X

6
Ini adalah bahasa pemrograman paling aneh yang pernah saya lihat.
Ryan

@Ryan itu dimaksudkan untuk bermain golf.
Buah Esolanging

61

JavaScript (ES6), 107 103 byte

Disimpan 4 byte berkat GOTO 0

s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)

Uji kasus


6
Anda dapat menyimpan beberapa byte seperti ini:s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
GOTO 0

@ GOTO0 Terima kasih, diperbarui.
Arnauld

49

Jelly , 45 39 byte

Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2
e€ØyIi-‘ɓḣ;ç

Cobalah online!

Bagaimana itu bekerja

e€ØyIi-‘ɓḣ;ç                Main link. Argument: s (string)

  Øy                        Vowels with y; yield "AEIOUYaeiouy".
e€                          Test each character in s for membership.
    I                       Increments; compute the forward differences of the
                            resulting array of Booleans.
     i-                     Find the first index of -1.
       ‘                    Increment this index to find the index of the first
                            consonant that follows a vowel.
                            Let's call this index j.
        ɓ                   Begin a new chain. Left argument: s. Right argument: j
         ḣ                  Head; yield the first j characters of s.
           ç                Call the helper link with arguments s and j.
          ;                 Concatenate the results to both sides.
Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2  Helper link. Left argument: s. Right argument: j

Øa                          Alphabet; set the return value to “abc...xyz”.
  “œṣ$b|0Ḃ’                 Yield 7787255460949942. This is a numeric literal in
                            bijective base 250. The value of each digit matches its
                            1-based index in Jelly's code page.
           ṃ                Convert 7787255460949942 to base 26, using the digts
                            a = 0, b = 1, ..., z = 25.
                            This yields "bcdfkszgvtgp".
            ,Ṛ$             Pair the result with its reverse, yielding
                            ["bcdfkszgvtgp", "pgtvgzskfdcb"].
                ṫ           Call tail with arguments s and j, yielding the j-th and
                            all following characters of s.
               y            Translate the result to the right according to the
                            mapping to the left, i.e., replace 'b' with 'p', 'c'
                            with 'g', etc. 'g' appears twice in the first string
                            of the mapping; only the first occurrence counts.
                            Let's call the resulting string r.
                 µ          Begin a new chain. Argument: r
                  fØy       Filter; remove non-vowels from r.
                     Ḣ      Head; take the first vowel.
                       Ḣ    Head; take the first character/consonant of r.
                      ṭ     Tack; append vowel to the consonant.
                        ẋ2  Repeat the resulting string twice.

4
maaf, sobat, sepertinya Anda ketinggalan mega rep jelly
Destructible Lemon

tfw jawaban terlihat terlalu sederhana tetapi sebenarnya sangat indah ... sederhana itu indah
Erik the Outgolfer

31

CJam , 59 58 57 56 byte

q_{"aeiouy":V&,_T|:T^}#)/(_W>"cbdfkszgvtpg"_W%er@sV&0=+_

Cobalah online!

Penjelasan

q_                   e# Read the input and copy it.
{                    e# Find the index of the first char for which the following is true:
 "aeiouy":V          e#  Push "aeiouy" and store it in V.
 &,                  e#  Check if the current char is in the vowel string (0 or 1).
 _T|:T               e#  Copy the result and OR with T (T is initially 0), storing back in T.
 ^                   e#  XOR with the original result. This will be 1 for the first 
                     e#  consonant appearing after a vowel.
}#                   e# (end find)
)/                   e# Increment the index and split the string into chunks of that size.
(                    e# Pull out the first chunk.
_W>                  e# Copy it and get the last character (the consonant).
"cbdfkszgvtpg"_W%er  e# Transliterate the consonant to voiced/voiceless alternative.
@s                   e# Bring all the other split chunks to the top and join them together.
V&0=                 e# First char of the set intersection of that and the vowels.
                     e# (i.e. the first vowel in the second half)
+                    e# Concatenate the new consonant and the vowel.
_                    e# Duplicate the result of that.
                     e# Implicit output of stack contents.

2
CJam mengalahkan Jelly? : O (Setidaknya, ini mengalahkan jawaban Jelly yang tampaknya semua orang upvoting.)
Esolanging Fruit

29

C, 219 213 206 179 175 byte

#define p putchar
#define q(a)for(;a strchr("aeiouy",*s);p(*s++));
f(s,c,h)char*s;{q(!)q()p(*s);p(c="pgt vkh jglmn bqrzd fwx s"[*s-98]);p(h=s[strcspn(s,"aeiouy")]);p(c);p(h);}

Cobalah online!


Apakah * p = putchar berfungsi sebagai baris pertama?
k_g

4
Maaf didiskualifikasi. Tidak bisa masuk dalam tweet.
caird coinheringaahing

@cairdcoinheringaahing Anda pak salah (saya tahu bahwa itu 140 ketika Anda menulis itu)
Stan Strum


1
12 atau lebih byte dapat dicukur dengan mengganti #defines dan fungsinya dengan flag preprocessor ( -D...).

23

Perl 5 , 81 72 byte

s![aeiouy]+(.)\K.*!($1=~y/bcdfgkpstvz/pgtvkgbzdfs/r.$&x/[aeiouy]/g)x2!ge

Cobalah online!


Anda dan saya memiliki ide yang sama \K, tetapi Anda melakukannya 9 byte lebih baik daripada saya. Jawaban yang bagus!
Silvio Mayolo

18

PHP, 121 Bytes

$v=aeiouy;preg_match("#(.*?[$v]+([^$v])).*?([$v])#",$argn,$t);echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;

Cobalah online!


3
-2 byte:echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;
Titus

@Itus saya belum memikirkan hal itu. Terima Kasih
Jörg Hülsermann

mengapa tidak mengganti nama $argnmenjadi sesuatu yang lebih pendek? $a, misalnya - itu -3 byte
Tyler Sebastian

@ TylerSebastian Saya harus memiliki variabel input yang ada Ya saya dapat membuat fungsi, tetapi jika saya melakukannya, ia meningkatkan jumlah byte lebih banyak dengan menggunakan tiga byte
Jörg Hülsermann

ah ok maaf saya lupa bagaimana PHP melakukan args baris perintah - Saya baru saja melihat bahwa Anda telah mendefinisikannya di bagian header tetapi gagal menyadari bahwa itu adalah variabel yang dipesan.
Tyler Sebastian

15

Pyth, 54 byte

L+hb?>F}RJ"aeiouy"<b2+hKtb*2+XhK"cgdsfbpvztkg")h@JKytb

Ini mendefinisikan fungsi y, yang mengharapkan string. Cobalah online: Test Suite


14

Python 3, 155 139 byte

import re
def f(x,k='aeiouy])'):b,c,v=re.findall(f'(.*?[{k}([^{k}.*?([{k}',x)[0];return b+c+(('bcdfgkpstvz'+c)['pgtvkgbzdfs'.find(c)]+v)*2

dihapus 16 byte berkat @ovs

dihapus 1 byte berkat Gábor Fekete


2
Anda dapat membuat variabel yang memiliki nilai 'aeiouy]', mungkin itu akan menghemat beberapa byte. Anda juga dapat menghapus beberapa karakter dari string pengganti karena ada yang sama.
Gábor Fekete

2
Saya tidak dapat menghapus karakter identik dari string pengganti, karena itu akan menjadi IndexError, dan menyimpan aeiouy])tidak menyimpan byte.
L3viathan

2
jika Anda mengeluarkan sesuatu seperti s='aeiouy])', Anda bisa menggunakannya b,c,v=re.findall('(.*?[%s([^%s.*?([%s'%(s,s,s). Ini tidak lebih pendek, tetapi mungkin mengarah pada cara untuk mempersingkatnya secara keseluruhan.
Jeremy Weirich


3
Menggunakan f-string akan menghemat 1 byte: k='aeiouy])'danf'(.*?[{k}([^{k}.*?([{k}'
Gábor Fekete

14

Java 8, 243 236 222 byte

s->{String q="[a-z&&[^aeiouy]]",a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"),b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))+s.replaceAll(a+q+"*([aeiouy]).*","$1");return a+b+b;}

Gunakan .replaceAllregex dengan grup tangkap untuk memfilter bagian yang tidak kita inginkan.

Penjelasan:

Coba di sini.

s->{ // Method with String parameter and String return-type
  // Temp String we use multiple times:
  String q="[a-z&&[^aeiouy]]",
   // Regex to get the first part (i.e. `creation` -> `creat` / `example` -> `ex`)
   a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"), 
   // Get the trailing consonant and convert it
   b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))
   // Get the next vowel after the previous consonant from the input-String
    +s.replaceAll(a+q+"*([aeiouy]).*","$1");
  // Return the result:
  return a+b+b;
} // End of method

13

Haskell , 143 141 138 137 136 byte

z h=elem h"aeiouy"
f i|(s,(m,c:x))<-span z<$>break z i,j:_<-filter z x,d<-"pgt.vkh.jglmn.bqrzd.fwx.s"!!(fromEnum c-98)=s++m++[c,d,j,d,j]

Cobalah online!


1
Luar biasa! Mengganti nxdengan sesuatu yang berhuruf satu akan menghemat 2 byte.
tommeding

mendeklarasikan zluar fdan beralih ke penjaga alih-alih letmenyimpan dua byte lainnya: Cobalah secara online!
Laikoni

2
Dan dua lagi dengan menggabungkan (s,v)<-break z i,(m,c:x)<-span z vke dalam (s,(m,c:x))<-span z<$>break z i.
Laikoni

Bisa mencukur satu lagi dengan meletakkan tanda kurung di sebelah let, terima kasih!
bartavelle

@Laikoni Saya tidak mengerti bagian tentang pindah zdari f?
bartavelle

10

Python, 261 260 byte

def c(s,t='bpcgdtfvgksz'):
 q,r,t='aeiouy',range(len(s)),t+t[::-1]
 c=[i for i in r if i>[j for j in r if s[j]in q][0]and s[i]not in q][0]
 C=([t[2*i+1]for i in range(12)if s[c]==t[i*2]]or s[c])[0]
 return s[:c+1]+(C+s[[i for i in r if i>c and s[i]in q][0]])*2

A Non regex, Bukan solusi esoterik. Butuh waktu sekitar 20 menit untuk membuatnya, dan satu jam lebih banyak untuk bermain golf.

Mungkin memiliki lebih banyak pemahaman daftar daripada seluruh perpustakaan standar python, terutama karena saya tidak tahu regex ...

Cobalah online! (Dengan testcases)


8

Ruby , 90 byte

->x{x[/(.*?#{$v='[aeiouy]'}+.).*?(#$v)/];$1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2}

Cobalah online!

Menghapus sedikit, kami memiliki sesuatu yang setara dengan:

def covfefefify(x)
  v = '[aeiouy]'
  # Match x to a regular expression capturing:
  # Group 1:
  #  some characters (non-greedy)
  #  followed by some (greedy) non-zero number of vowels
  #  followed by exactly one character
  # Ungrouped:
  #  Some more (non-greedy) characters
  # Group 2
  #  Exactly one other vowel
  # By switching between greedy and non-greedy matches, we can capture longest and shortest vowel/consonant sequences without writing out all the consonants
  x[/(.*?#{v}+.).*?(#{v})/]
  # Glue it back together, replace the necessary consonants, duplicate where needed
  $1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2
end

8

Python 2, 251 246 245 239 237 234 229 211 byte

Pengiriman pertama di sini.

def f(s):
  r=c='';n=0;w='aeiouy';a='bcdfghjklmnpqrstvwxz'
  for i in s:
    if n<2:r+=i
    if n<1and i in w:n=1
    if n==1and i in a:c='pgtvkhjglmnbqrzdfwxs'[a.index(i)];n=2
    if n==2and i in w:r+=c+i+c+i;break
  return r

Cobalah online!

Rekan pegolf yang membantu saya:

 Destructible Lemon / Wheat Wizard - 5 bytes
 Hubert Grzeskowiak - 1 byte
 musicman523 - 16 bytes

2
Selamat datang di situs ini! Saya melihat Anda mencoba menggunakan tab untuk indentasi. Jika Anda mengganti setiap tab dengan satu spasi, itu secara fungsional identik dan benar-benar muncul dengan benar alih-alih sebagai byte tambahan
Destructible Lemon

4
Sementara apa yang dikatakan Destructible Lemon benar, Anda dapat menyimpan lebih banyak byte dalam sumber Anda dengan membuat indentasi tingkat pertama kode Anda dengan satu spasi dan tingkat kedua dengan satu tab, ini akan membuatnya agak sulit untuk ditampilkan, tetapi akan menghemat 5 byte.
Sriotchilism O'Zaic

1
Apakah titik koma di akhir baris 4 diperlukan?
Hubert Grzeskowiak

1
@ TungguLihat Saya pikir Anda dapat mempersingkat beberapa persyaratan Anda. Pertama: Anda dapat mengubah not nke n<1untuk 2 byte, karena Anda tahu ntidak akan pernah menjadi negatif. Anda juga dapat mengubah n==3ke n>2karena Anda tahu ntidak akan lebih besar dari 3. Anda juga dapat menggunakan trik Python untuk conditional untuk mempersingkat pertama dan kedua terakhir lebih jauh n=[n,1][i in w and n<1]:; r+=[0,r][n<2]
musicman523

1
Anda dapat mengubah r,v,c=('',)*3ke r=v=c='', karena string yang berubah. Saya sudah mencoba banyak trik pintar lainnya, tetapi dengan frustrasi semuanya persis sama. Juga mungkin layak untuk ditambahkan Coba secara online! tautan ke posting Anda
musicman523

7

Ruby , 175 141 110 byte

->s{s=~/(.*?#{v='[aeiouy]'}+(#{c='[^aeiouy]'}))#{c}*(#{v})/;"#$1#{($2.tr('bcdfgkpstvz','pgtvkgbzdfs')+$3)*2}"}

Cobalah online!

  • Disimpan 34 byte berkat Eric Duminil
  • Disimpan 31 byte berkat Value Ink + trargumen yang disarankan dioptimalkan

Tidak disatukan

covfefify = -> (s) {
    from = 'bcdfgkpstvz'
    to   = 'pgtvkgbzdfs'

    vowels = "[aeiouy]"
    consonants = "[^aeiouy]"

    s.match(/(.*?#{vowels}+(#{consonants}))#{consonants}*(#{vowels})/)
    d = ($2.tr(from, to) + $3) * 2
    "#$1#{d}"
}

4
-34 byte denganHash[*"bpcgdtfvgkkgpbsztdvfzs".chars]
Eric Duminil

1
Karena input tampaknya dijamin semua karakter alfabet, c=[^aeiou]lebih pendek. Memiliki interpolasi pertama untuk setiap variabel menetapkan secara bersamaan untuk -2 byte: /^(.*?${v='[aeiou]'}+(#{c='[^aeiou]})).../. Akhirnya, $2.tr("b-z","pgtevkhijgl-obqrzdufwxys")bukannya solusi Hash.
Nilai Tinta

Anda dapat menyimpan 14 byte dengan menggunakan subexpressions ( \g<n>) bukan interpolasi, ditambah 14 lain menggunakan @ ValueInk ini [^aeiou]saran: s=~/^(.*?([aeiouy])+([^aeiou]))\g<3>*(\g<2>)/.
Jordan

Sebenarnya, itu memiliki bug dengan programming-> progkaka, yang saya tidak tahu.
Jordan

@Jordan sayangnya panggilan subexpression \g<3>memperbarui nilai $ 3, jadi kami tidak dapat menggunakan pintasan ini.
sudee

6

Crystal, 203 194 187 186 184 163 byte

o=""
ARGV[v=c=0].each_char{|a|r=/#{a}/
"aeiouy"=~r&&(v=x=1)||(c=v)
o+=a if c<2||x
c>0&&(x&&break||(o+=(i="pgtvkgbqrzdfs"=~r)?"bcdfgkpqrstvz"[i]: a))}
p o+o[-2..-1]

Saya pikir Anda dapat kehilangan c=vo+=<...>
orangtua di

5

MATLAB / Oktaf - 159 158 byte

Berikut ini berfungsi dengan asumsi string input semuanya huruf kecil.

a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]

Penjelasan

  1. a = input('','s');: Mendapat string dari STDIN dan menyimpannya ke dalam variabel a.
  2. m=ismember(a,'aeiouy');: Mengembalikan array Boolean yang ukurannya sama dengan string yang amenentukan di mana vokal berada
  3. s='pgt vkh jglmn bqrzd fwx s';The covfefepemetaan konsonan sebagai string. String ini panjangnya 25 karakter dan menghilangkan vokal. Posisi pertama di mana vokal 'a'seharusnya dihapus sedangkan posisi lain di mana vokal ditempatkan ditempatkan dengan karakter ruang dummy. Ini agar ketika kita menentukan konsonan pertama yang muncul setelah vokal, kita akan mengonversi konsonan ke posisi untuk mengakses karakter dalam string ini untuk menentukan komponen pertama dari kata yang dikonversi.
  4. m(1:find(m,1))=1: Mengatur posisi pertama array Boolean ke tempat kami menemukan vokal pertama sebagai semua vokal. Ini akan terjadi sehingga ketika kita mencari konsonan berikutnya yang mengikuti vokal pertama, kita akan mengabaikan karakter-karakter ini.
  5. i=find(~m,1);: Menemukan posisi pertama dari string yang merupakan konsonan setelah vokal pertama.
  6. f=a(1:i): Menghapus string setelah konsonan pertama yang mengikuti vokal. Kami cukup sampel dari posisi pertama string hingga titik ini.
  7. d=s(f(end)-97);: Ambil karakter terakhir dari string yang tersisa dan temukan di mana kita perlu sampel dari string pencarian dan dapatkan karakter itu. Mengurangi karakter dan angka dalam MATLAB atau Oktaf bergabung untuk membentuk integer dengan mengubah karakter menjadi kode ASCII-nya. Dalam hal ini, kita kurangi karakter terakhir dengan karakter di awal alfabet untuk memberi kita posisi relatif terhadap awal. Namun, alih-alih mengurangi dengan b(98), kita mengurangi asebagai MATLAB mulai mengindeks dengan 1 bukannya 0. 'a'kode ASCII adalah 97.
  8. m(1:i)=0;: Mengambil topeng Boolean dan menetapkan semua karakter dalam string input dari posisi pertama ke konsonan pertama mengikuti vokal ke false.
  9. v=a(find(m,1));: Menemukan vokal berikutnya yang mengikuti konsonan pertama dari string input.
  10. [f d v d v]: covfefeKeluarkan string ied kami .

Contoh Berjalan

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
coverage

ans =

covfefe

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
example

ans =

exxaxa

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
programming

ans =

progkaka

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
code

ans =

codtete

>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
president

ans =

preszizi

Cobalah online!

http://www.tutorialspoint.com/execute_octave_online.php?PID=0Bw_CjBb95KQMdjROYVR0aFNrWXM

Ketika Anda menekan tombol Execute di bagian atas, tunggu beberapa saat, lalu masukkan string yang diinginkan. Masukkan string secara perlahan karena tampaknya ada penundaan saat memasukkan teks.


5

Clojure, 182 156 karakter

#(let[v #{\a\e\i\o\u\y}p(partition-by v %)[s m[c][n]](if(v(first %))(cons[]p)p)z[(or((zipmap"bcdfgkpstvz""pgtvkgbzdfs")c)c)n]](apply str(concat s m[c]z z)))

Bagaimana itu bekerja

(partition-by v "president")

Mengembalikan seq of ((\p \r) (\e) (\s) (\i) (\d) (\e) (\n \t))

[s m [c] [n]] (if (v (first x)) (cons [] p) p)

Destructures seq ke s=(\p \r), m=(\e), c=\s, n=\i.

Atau "contoh" itu s=[], m=(\e), c=\x, n=\a.

(apply str (concat s m [c] [(l c) n] [(l c) n]))

Mengembalikan string keluaran dengan menyatukan potongan-potongan dan mengikatnya.

Dan kemudian saya hanya menghapus spasi sebanyak yang saya bisa sambil tetap mengkompilasi.

Diformulasi:

(defn covfefify [x]
  (let [vowel? #{\a\e\i\o\u\y}
        parts (partition-by vowel? x)
        [start mid [consonant] [last-vowel]] (if (vowel? (first x)) (cons [] parts) parts)
        lookup #(or ((zipmap "bcdfgkpstvz" "pgtvkgbzdfs") %) %)]
    (apply str (concat start mid [consonant] [(lookup consonant) last-vowel] [(lookup consonant) last-vowel]))))

Selamat datang di PPCG, dan jawaban pertama yang bagus! Kami harap Anda akan tetap dan bersenang-senang berpartisipasi dalam lebih banyak tantangan. :-)
ETHproduk

Jika Anda mendefinisikan suatu fungsi, namanya mungkin sesingkat mungkin. Anda bisa memanggil fungsi utama c, misalnya. (Kami juga mengizinkan fungsi anonim, yang lebih pendek dalam banyak bahasa; Saya tidak yakin apakah mereka ada di Clojure). Saya melihat Anda telah melakukan perbaikan di bagian dalam kode Anda, jadi mungkin tidak banyak yang perlu diubah di sini.

5

R, 341 karakter

f=function(x){g=function(x,y)el(strsplit(x,y));a=g(x,'');v=g('aeiouy','');n=letters[-c(1,5,9,15,21,25)];l=data.frame(n,g('pgtvkhjglmnbqrzdfwxs',''));y=min(match(n,a)[which(match(n,a)>min(match(v,a),na.rm=T))]);m=l[which(l$n==a[y]),2];e<-a[-c(1:y)][min(match(v,a[-c(1:y)]),na.rm=T)];paste0(paste0(a[c(1:y)],collapse=''),m,e,m,e,collapse="")}

Upaya R menghebohkan, mengapa string begitu keras

Versi yang dapat dibaca:

f = function(x) {
  g = function(x, y)el(strsplit(x, y))
  a = g(x, '')
  v = g('aeiouy', '')
  n = letters[-c(1, 5, 9, 15, 21, 25)]
  l = data.frame(n, g('pgtvkhjglmnbqrzdfwxs', ''))
  y = min(match(n, a)[which(match(n, a) > min(match(v, a), na.rm = T))])
  m = l[which(l$n == a[y]), 2]
  e <-a[-c(1:y)][min(match(v, a[-c(1:y)]), na.rm = T)]
  paste0(paste0(a[c(1:y)], collapse = ''), m, e, m, e, collapse = "")
}

Saya yakin perhitungan Anda tidak aktif - Saya menghitung 340 byte
Taylor Scott


4

BlitzMax, 190 byte

s$=Input()For i=1To s.Length
f="aeiouy".Contains(s[i-1..i])If f v=i If c Exit
If v And c|f=0c=i
Next
t$="bpdtfvgkcgsz"x$=s[c-1..c]r=t.Find(x)~1If r>=0x=t[r..r+1]
x:+s[v-1..v]Print s[..c]+x+x

Mengambil kata dari stdin dan mencetak hasilnya ke stdout. Kata input diasumsikan huruf kecil dan mengandung setidaknya satu vokal diikuti oleh konsonan.

Versi progam yang lebih mudah dibaca dengan pemformatan dan deklarasi variabel:

SuperStrict
Framework BRL.StandardIO

Local s:String = Input()
Local v:Int
Local c:Int

For Local i:Int = 1 To s.Length
    Local f:Int = "aeiouy".Contains(s[i - 1..i])
    If f Then
        v = i
        If c Then Exit
    End If
    If v And c | f = 0 Then c = i
Next

Local t:String = "bpdtfvgkcgsz"
Local x:String = s[c-1..c]
Local r:Int = t.Find(x) ~ 1
If r >= 0 Then x = t[r..r + 1]
x :+ s[v - 1..v]
Print s[..c] + x + x

Bagaimana itu bekerja:

BlitzMax tidak memiliki fungsionalitas regin bawaan atau yang serupa, jadi loop digunakan untuk beralih pada karakter kata input hingga menemukan vokal diikuti oleh rantai setidaknya satu konsonan. Variabel c menyimpan posisi konsonan terakhir, yaitu v dari vokal. Lingkaran terus melihat apakah ada vokal lain setelah rantai dan jika demikian, v diperbarui sesuai. Kemudian konsonan pada c tampak dalam string "bpdtfvgkcgsz", yang bertindak sebagai tabel pengganti. Jika konsonan ditemukan dalam tabel di posisi mana pun, maka posisi itu adalah XOR-ed dengan 1 dan karakter pada posisi yang dihasilkan akan digunakan sebagai penggantinya. Operasi XOR mengubah 0 menjadi 1, 2 menjadi 3, 4 menjadi 5 dll. Dan sebaliknya, sehingga b bertukar dengan p, d dengan t dan seterusnya. Akhirnya, string asli hingga c,

Contoh hasil:

cakupan covfefe

pembuatan creatdidi

pemrograman progkaka

stupbibi kebodohan

blah blahhaha


tautan ke repo blitzmax?
Destructible Lemon

@DestructibleLemon BlitzMax dibuat sebagai bahasa terutama untuk pengembangan game amatir dan dengan kompiler berpemilik yang dijual untuk mendapatkan uang. Meskipun sekarang gratis dan tersedia dari sini , saya percaya kompiler masih belum open source. Terdapat implementasi alternatif (repo di sini , dibuat di sini ), yang hanya akan menjalankan versi kode di atas yang ungolfed karena kurangnya pengaturan "non-ketat" yang memungkinkan menghilangkan deklarasi variabel.
FireballStarfish

Pintar menggunakan XOR pada indeks - Saya mungkin akan menggunakan itu suatu hari nanti. Terima kasih.
AI Breveleri

4

Perl, 71 byte

s#[aeiouy]+(.)\K.*?([aeiouy]).*#"$1$2"=~y/bcdfgkpstvz/pgtvkgbzdfs/rx2#e

Juga dijalankan dengan perl -pe. Beberapa byte kurang dari solusi Perl sebelumnya. Memang saya juga mendapat inspirasi dari sana.


4

05AB1E , 101 104 88 byte

-16 byte terima kasih kepada Okx

Saya berharap ini bisa dilakukan dengan cara yang lebih efisien.

žOÃćIsk>[DIs£¤žPså#\>]s[DIsèDžOså#\>]ŠŠ"bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"S2ôDí«ø`Šs¤sŠksŠèsŠì2׫

Cobalah online!

Penjelasan

                  Argument: s
žOÃ0èk            Get index of first vowel in s
>[DIs£¤žPså#\>]   Increment index and split s until last character of substring is a consonant
s[DIsèDžOså#\>]   Increment index an get character at index in s until character is a vowel
ŠŠ                Rearrange stack
.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`   Prepare character substitution map
Šs                Rearrange stack
¤                 Last character of substring
sŠ                Rearrange stack (yes, again)
k                 Index of last character in substitution key list
sŠ                Rearrange stack (it won't stop)
è                 Character at index in character substitution value list
sŠ                Rearrange stack (ONE LAST TIME)
ì2׫              Prepend substitution consonant before vowel, duplcicate and concatenate with the substring from the very beginning

Anda dapat mengganti "bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"dengan .•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•untuk menyimpan 15 byte
Okx

Anda juga dapat mengganti žOÃćIskdengan žOÃ0èkuntuk menyimpan byte lain.
Okx

@ OKK Saya pikir saya benar-benar perlu belajar beberapa teknik kompresi String. Terima kasih!
kalsowerus

@ kalsowerus Saya tahu ini sudah lama, tetapi Anda bisa bermain golf 8 byte dari jawaban Anda seperti ini: žOÃнk>[DIs£¤žPså#\>]©s[DIsèDžOså#\>]s\.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`®θkèìDJ Coba online. Saya terutama menyingkirkan semua swap dan triple-swap dengan menggunakan variabel sebagai gantinya. Dan bisa н, dan saya sudah diganti 2׫dengan DJuntuk bergabung dengan seluruh tumpukan bersama. PS: Saya juga mengirim jawaban 55 byte 05AB1E menggunakan teknik yang berbeda. (Yang juga mencakup tautan untuk memahami kompresi dengan lebih baik di 05AB1E.: D)
Kevin Cruijssen

3

Crystal, 130 Bytes

c=/[aeiouy]/
x,y,z=ARGV[0].partition /[^aeiouy]*#{c}*/
k=z[0]
b=((i="pgtvkgbqrzdfs"=~/#{k}/)?"bcdfgkpqrstvz"[i]: k)+z[c]
p y+k+b*2

Bagaimana itu bekerja

c = /[aeiouy]/

menyimpan regex untuk mencari vokal pertama c.

x, y, z = ARGV[0].partition /[^aeiouy]*#{c}*/

pisahkan argumen pertama menjadi tiga bagian {"", String hingga satu karakter sebelum konsonan pertama setelah vokal pertama, sisa string} dan simpan masing-masing elemen menjadi x, y dan z.

k = z[0]

dapatkan karakter pertama, konsonan yang relevan.

i = "pgtvkgbqrzdfs" =~ /#{k}/

dapatkan indeks konsonan di dalam string kiri atau nil.

b = ((i = ...) ? "bcdfgkpqrstvz"[i] : k) + z[c]

jika itidak nil, gunakan indeks ini untuk string kedua (semacam hash golf).

jika iadalah nil, menggunakan karakter asli.

selanjutnya, tambahkan vokal pertama z.

p y + k + (b * 2)

akhirnya, cetak bagian pertama dari regex pertama y, konsonan pertama kdan dua kali string yang dihitung sebelumnya b.

Cobalah online .



2

Lua, 164 157 byte

w=arg[1]
i,j,a,b=w:find('[aeiouy]+([^aeiouy]+)(.)')
print(w:sub(1,j-#a)..(('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1,1)))..b):rep(2))

Sunting 1: Dihapus 7 byte dengan mencari karakter apa pun setelah konsonan (lihat regex)

Cobalah online!

Program ini mengambil string dalam argumen CLI dan mencetak versi yang di-covfefied-nya.

Ini adalah pengajuan pertama saya ke kode golf! Saya tidak memeriksa yang lain secara terperinci sehingga saya mungkin telah melewatkan beberapa optimasi umum (dan jatuh dalam beberapa perangkap). Saya menggunakan Lua karena saya mulai menyukai bahasa kecil ini, dan saya mencoba menemukan regex yang sesuai dengan kebutuhan saya.

Ini versi yang lebih bersih, menggunakan fungsi (saya bermaksud menggunakannya, tetapi kata kunci di Lua terlalu panjang!):

function covfefy(word)
  i, j, a, b = word:find('[aeiouy]+([^aeiouy]+)(.)')

  -- 'a' is one or several consonants following the first vowel, b is the first vowel after that
  -- 'i' is the index of the beginning of 'a', 'j' the index of 'b'

  cov = word:sub(1, j - #a)

  -- Look for the first letter of 'a' in the voiced/voiceless table
  f = ('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1, 1)))

  return cov .. (f .. b):rep(2)
end

Jangan ragu untuk memberikan umpan balik :)

Catatan: Jika Anda bertanya-tanya, panjangnya 149 byte menggunakan MoonScript!


2

JavaScript (ES5), 237 229 byte

function(s){r=['aeiouy','bcdfgkpstvz','pgtvkgbzdfs']i=0,p=''while(p+=s[i],r[0].indexOf(s[i++])<0);while(p+=s[i],~r[0].indexOf(s[i++]));b=s[i-1];while(r[0].indexOf(s[i++])<0);c=r[1].indexOf(b)d=((~c)?r[2][c]:b)+s[i-1]return p+d+d}

Cobalah online!

Mungkin bukan yang paling golf, tetapi ES5.

Baru-baru ini memperbaiki bug. Contoh output:

creation->creatdidi
coverage->covfefe
example->exxaxa
programming->progkaka
code->codtete
president->preszizi

2

sed, 106 (105 +1) byte

Ini sed dengan -Ebendera, yang tampaknya dihitung untuk satu byte

s/([aoeuiy][^aoeuiy])[^aoeuiy]*(.).*/\1\2/
h
s/.*(..)/\1\1/
y/bcdfgkpstvz/pgtvkgbzdfs/
x
s/.$//
G
s/\n//g

Cobalah online!


2

C #, 584 581 byte

-3 Bytes berkat Destructible Lemon

Ini adalah pengajuan pertama saya pada Code Golf dan di Stack Exchange secara umum. Saya tahu bahwa C # bukan bahasa golf yang bagus dan ini mungkin tidak sepenuhnya dioptimalkan tetapi saya ingin mencobanya: p. Ada tips yang diterima!

Versi Golf:

namespace System{class B{static void Main(string[]args){var s="creation";var t="aeiou";int i=0,j=0,l=s.Length;char c=' ',f=' ';for(int x=0;x++<l;){if(t.IndexOf(s[x])>=0){i=x;break;}}for(int x=i;x++<l;){if(!(t.IndexOf(s[x])>=0)){j=x;c=s[x];for(int y=x;y++<l;){if (t.IndexOf(s[y])>=0){f=s[y];goto W;}}}}W:switch(c){case'b':c='p';break;case'c':c='g';break;case'd':c='t';break;case'f':c='v';break;case'g':c='k';break;case'k':c='j';break;case'p':c='b';break;case's':c='z';break;case't':c='d';break;case'v':c='f';break;case'z':c='s';break;}Console.Write(s.Substring(0,l-i-1)+c+f+c+f);}}}

Versi yang Dapat Dibaca:

namespace System
{
    class B
    {
        static void Main(string[] args)
        {
            var s = "creation";
            var t = "aeiou";
            int i = 0, j = 0, l = s.Length;
            char c = ' ', f = ' ';
            for (int x = 0; x++ < l; )
            {
                if (t.IndexOf(s[x]) >= 0)
                {
                    i = x; break;
                }
            }
            for (int x = i; x++ < l;)
            {
                if (!(t.IndexOf(s[x]) >= 0))
                {
                    j = x; c = s[x];
                    for (int y = x; y++ < l;)
                    {
                        if (t.IndexOf(s[y]) >= 0)
                        {
                            f = s[y];
                            break;
                        }
                    }
                }
            }
            switch (c)
            {
                case 'b': c = 'p';
                    break;
                case 'c': c = 'g';
                    break;
                case 'd': c = 't';
                    break;
                case 'f': c = 'v';
                    break;
                case 'g': c = 'k';
                    break;
                case 'k': c = 'j';
                    break;
                case 'p': c = 'b';
                    break;
                case 's': c = 'z';
                    break;
                case 't': c = 'd';
                    break;
                case 'v': c = 'f';
                    break;
                case 'z': c = 's';
                    break;
            }
            Console.Write(s.Substring(0, l - i - 1) + c + f + c + f);
        }
    }
}

1
Saya bukan ahli, tapi saya pikir Anda bisa menambahkan penambahan ke komparator di for for loop, yaitu x++ < l,, atau sesuatu (mungkin l > x++jika yang pertama tidak berhasil). tidak yakin
Lemon Destructible

@DestructibleLemon Terima kasih atas tipnya!
Brandon Hao

2

SmileBASIC 3, 195 byte

Sangat terlambat untuk pertanyaan ini, tetapi bagaimana saya bisa menolak tantangan yang bagus untuk SmileBASIC 3? Fitur seperti iterasi melalui urutan atau memanipulasi string tidak sekuat bahasa lain, jadi ini sedikit tantangan untuk melakukannya sekecil mungkin. Asumsikan kata-kata adalah UPPERCASE.

V$="AEIOUY
LINPUT W$REPEAT I=I+1UNTIL.<=INSTR(V$,W$[I-1])&&.>INSTR(V$,W$[I])J=I
WHILE.>INSTR(V$,W$[J])J=J+1WEND?LEFT$(W$,I+1)+("PGTVKHJGLMNBQRZDFWXS"[INSTR("BCDFGHJKLMNPQRSTVWXZ",W$[I])]+W$[J])*2

Penjelasan terperinci di sini!


2

05AB1E , 55 byte

η.ΔžOSåàyžPSÅ¿à*}ÐIsKžOÃнsθU.•gÍĆdQ¸G•SDXåiÂXQÏθë\X}ìDJ

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

η                        # Suffixes of the (implicit) input
                         #  i.e. "creation" → ["c","cr","cre","crea","creat","creati","creato","creatio","creation"]
        }              # Find the first for which the following is truthy:
   žO                    #  Push vowels (including y): "aeiouy"
     S                   #  Convert it to a list of characters: ["a","e","i","o","u","y"]
      å                  #  Check for each if they're in the current (implicit) suffix
                         #   i.e. "creat" → [1,1,0,0,0,0]
       à                 #  Pop and push the max (basically check if any are truthy)
                         #   i.e. [1,1,0,0,0,0] → 1
   y                     #  Push the suffix again
    žP                   #  Push the consonants (excluding y): "bcdfghjklmnpqrstvwxz"
      S                  #  Convert to a list of characters: ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","z"]
       Å¿                #  Check for each if the suffix ends with it
                         #   i.e. "creat" → [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
         à               #  Pop and push the max (basically check if any are truthy)
                         #   i.e. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0] → 1
   *                     #  Check if both are truthy
                         #   i.e. 1 and 1 → 1
           Ð             # Triplicate the found suffix
            I            # Push the input
             s           # Swap the top two items on the stack
                         #  i.e. stack contains now: "creat","creat","creation","creat"
K                        # Remove the suffix from the input
                         #  i.e. "creation" and "creat" → "ion"
 žOÃ                     # Only leave the vowels
                         #  i.e. "ion" → "io"
    н                    # Pop and push the first character
                         #  i.e. "io" → "i"
s                        # Swap again so the prefix is a the top of the stack again
 θ                       # Pop and push the last character
                         #  i.e. "creat" → "t"
  U                      # Pop and store it in variable `X`
   .•gÍĆdQ¸G            # Push string "bcdfkszgvtgp"
             S           # Convert to list of characters: ["b","c","d","f","k","s","z","g","v","t","g","p"]
              D          # Duplicate it
               Xåi       # If `X` is in this string:
                  Â      #  Bifurcate the list (short for Duplicate & Reverse copy)
                         #   i.e. ["b","c","d","f","k","s","z","g","v","t","g","p"]
                         #   → ["p","g","t","v","g","z","s","k","f","d","c","b"]
                   XQ    #  Check if they're equal to variable `X`
                         #   i.e. `X` = "t" → [0,0,1,0,0,0,0,0,0,0,0,0]
                     Ï   #  Only keep the truthy values
                         #   i.e. ["b","c",...,"g","p"] and [0,0,1,0,0,0,0,0,0,0,0,0]
                         #    → ["d"]
                      θ  #  Pop and push the last one
                         #   i.e. ["d"] → "d"
                 ë       # Else:
                  \      #  Discard the duplicate list from the stack
                   X     #  And push variable `X` again
                 }       # Close the if-else
                  ì      # Prepend the second character in front of the first
                         #  i.e. "d" and "i" → "di"
                   D     # Duplicate it
J                        # Join the stack together (and output implicitly)
                         #  i.e. "creat" and "di" and "di" → "creatdidi"

Lihat 05AB1E ini kiat-kiat saya (bagian Cara kompres string bukan bagian dari kamus? ) Untuk memahami mengapa .•gÍĆdQ¸G•adalah "bcdfkszgvtgp".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.