文字列を暗号化する


371

このチャレンジでは、正規表現^[a-zA-Z]+$または妥当なものに一致する文字列を取得する必要があります(必要に応じて大文字または小文字を考慮する必要はありません)(文字列が十分に長く、すべての操作)、および別の文字列を出力します"Despite the constant negative press covfefe"。これは、POTUS()による最近のダダイストのツイートの最後の単語と同様に生成されます。

文字列をcoffefifyする方法:

最初に、最初のサウンドグループ(用語で構成)を取得します。

これどうやってやるの?まあ:

  • 最初の母音を見つける(母音yでもあります)

      v
    creation
    
  • その後に最初の子音を見つける

        v
    creation
    
  • 残りの文字列を削除します

    creat
    

それがあなたの最初のサウンドグループです。

次のステップ:

サウンドグループの最後の子音を取得する

t

有声バージョンまたは無声バージョンに置き換えます。これを行うには、この表の文字を見つけます。指定された文字に置き換えます(同じ文字の場合があります)

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

だから、私たちは得る

d

次に、その子音の次の母音を取ります。この子音は文字列の最後にないと仮定できます。これら2つを結合してから、2回繰り返します。

didi

これを最初のサウンドグループに連結します。

creatdidi

これで完了です。文字列はcoffefifiedになり、出力できるようになりました。

テストケース:

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

これはなので、プログラムをできるだけ短くしてください!


7
「x」は技術的に「gz」にマッピングする必要があります。「qu」は「gw」にマッピングする必要があります。
スティーブベネット

2
これはcoffificationの1つの概念を指定しますが、Douglas Hofstadter(およびMelanie Mitchell)の文字列変換アナロジーの参照は、たとえばFluid Conceptsで適切だと感じています。
火星

59
140文字を超える回答は失格となります
サンディギフォード

12
残念ながら、TrumpScriptでこれを行うことは不可能です:(

4
@ThePlasmaRailgunツイートは140文字以下でなければならないので、冗談でした。
エソランジングフルーツ

回答:


91

ゼリー 58  57 バイト

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

小文字のリストを受け入れ、結果を出力する完全なプログラム。

オンラインでお試しください!

どうやって?

<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
これはすごい
...-クランゲン

信じられないほどの仕事。
JFそれ

9
私はゼリーです。賛成。
DeepS1X

6
これは私が見た中で最も奇妙なプログラミング言語です。
ライアン

@Ryanはゴルフを目的としています。
エソランジングフルーツ

61

JavaScript(ES6)、107 103バイト

GOTO 0のおかげで4バイト節約

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

テストケース


6
あなたは、このようないくつかのバイトを保存することができます:s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
GOTO 0

@ GOTO0ありがとう、更新しました。
アーナルド

49

ゼリー45 39バイト

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

オンラインでお試しください!

使い方

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
申し訳ありませんが、バディ、メガゼリー担当者を見逃したようです
破壊可能なレモン

tfw答えは過度に単純に見えますが、実際には本当に素晴らしいです...シンプルは美しいです
エリックアウトゴルファー

31

CJam59 58 57 56バイト

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

オンラインでお試しください!

説明

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はJellyに勝ちますか?:O(少なくとも、誰もが賛成しているように思えるゼリーの答えを打ち負かす。)
エソランジングフルーツ

29

C、219の 213 206 179 175バイト

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

オンラインでお試しください!


* p = putcharは最初の行として機能しますか?
k_g

4
失格しました。ツイートに収まりません。
ケアード共編

あなたの先生を@cairdcoinheringaahing(私はあなたがいることを書いたとき、それは140だったことを知っている)間違っている
スタン・ストラム


1
#definesと関数をプリプロセッサフ​​ラグ(-D...)に置き換えることで、12バイト程度を削ることができます。


18

PHP、121バイト

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

オンラインでお試しください!


3
-2バイト:echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;
タイタス

@タイタス私はそれについて考えていません。ありがとう
ヨルグヒュルサーマン

$argn短い名前に変更してみませんか?$a、たとえば、-3バイトです
タイラーセバスチャン

@TylerSebastian存在する入力変数が必要です。はい、私は、関数を作成することができますが、私はそれを行う場合には、3バイト使用し、より多くのバイト数を上げる
イェルクHülsermann

ああ、すみません。PHPがコマンドライン引数をどのように処理するかを忘れてしまいました。ヘッダーセクションで定義したのに、予約された変数であることに気付きませんでした。
タイラーセバスチャン


14

Python 3、155 139バイト

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

@ovsのおかげで16バイト削除

GáborFeketeのおかげで1バイト削除


2
値を持つ変数を作成することができ'aeiouy]'ます。多分それはいくつかのバイトを節約します。また、置換文字列から一部の文字を削除することもできます。同じ文字があるためです。
ガボールフェケテ

2
それは次のようになりますので、私は、置換文字列から、同一の文字を削除することはできませんIndexError、と貯蓄は、aeiouy])任意のバイトを保存しません。
-L3viathan

2
のようなものを引き出すs='aeiouy])'場合は、使用することができますb,c,v=re.findall('(.*?[%s([^%s.*?([%s'%(s,s,s)。短くはありませんが、全体的に短くする方法につながる可能性があります。
ジェレミーワイリッヒ


3
:F-文字列を使用すると、1つのバイトが保存されますk='aeiouy])'f'(.*?[{k}([^{k}.*?([{k}'
ガーボルFekete

14

Java 8、243 236 222バイト

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

.replaceAllキャプチャグループで正規表現を使用して、不要な部分を除外します。

説明:

ここで試してみてください。

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

ハスケル143の 141 138 137 136バイト

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]

オンラインでお試しください!


1
驚くばかり!nx1文字の文字で置き換えると、2バイト節約されます。
-tomsmeding

z外部で宣言しf、ガードの代わりにガードに切り替えると、letさらに2バイト節約されます。オンラインで試してください!
ライコニ

2
そして、さらに2つをに結合(s,v)<-break z i,(m,c:x)<-span z v(s,(m,c:x))<-span z<$>break z iます。
ライコニ

の横に開きかっこを付けると、もう1つlet剃れます。
-bartavelle

@Laikoni私は移動について一部理解していないzの外にf
-bartavelle

10

Python、261 260バイト

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

非正規表現、難解ではないソリューション。作るのに約20分かかり、ゴルフにさらに1時間かかりました。

主に正規表現を知らないため、Python標準ライブラリ全体よりもリストの理解度が高いと思われます。

オンラインでお試しください!(テストケース付き)


8

ルビー、90バイト

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

オンラインでお試しください!

少しゴルフを解いて、次と同等のものがあります:

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バイト

最初の提出はこちら。

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

オンラインでお試しください!

私を助けた仲間のゴルファー:

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

2
サイトへようこそ!インデントにタブを使用してみましたね。各タブを単一のスペースに置き換えると、機能的に同一であり、余分なバイトとしてではなく実際に適切に表示されます
破壊可能なレモン

4
Destructible Lemonが言ったことは正しいですが、コードの最初のレベルを1つのスペースでインデントし、2番目のレベルを1つのタブでインデントすることで、ソースでさらに多くのバイトを節約できます。これにより、表示が少し難しくなりますが、 5バイト節約します。
スリオチリズムO'Zaic

1
4行目の最後のセミコロンは必要ですか?
ヒューバート・グルジェスコヴィアック

1
@WaitndSee条件の一部を短縮できると思います。まず:あなたは変更することができますnot nn<1、あなたが知っているので、2バイトのためにn負になることはありません。また、を超えることは決してないので、に変更n==3することもできn>2ます。条件Pythonトリックを使用して、最初と最後からさらに短くすることもできます。n3n=[n,1][i in w and n<1]r+=[0,r][n<2]
musicman523

1
あなたは変更することができますr,v,c=('',)*3r=v=c=''、文字列は不変であるため、。私は他にもたくさんの巧妙なトリックを試しましたが、イライラするほどそれらは同じくらい長いです。また、オンラインで試してみる価値があるかもしれませんあなたの投稿へのリンク
-musicman523

7

Ruby175 141110バイト

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

オンラインでお試しください!

非ゴルフ

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バイトのHash[*"bpcgdtfvgkkgpbsztdvfzs".chars]
エリックDuminil

1
入力はすべてアルファベット文字であることが保証されているため、c=[^aeiou]短くなります。各変数の最初の補間で-2バイトに同時に割り当てます/^(.*?${v='[aeiou]'}+(#{c='[^aeiou]})).../。最後$2.tr("b-z","pgtevkhijgl-obqrzdufwxys")に、ハッシュソリューションの代わりに。
バリューインク

\g<n>補間の代わりに部分式()を使用して14バイトを節約でき、さらに@ValueInkの[^aeiou]提案を使用してさらに14バイトを節約できますs=~/^(.*?([aeiouy])+([^aeiou]))\g<3>*(\g<2>)/
ヨルダン

実際、これにはprogramming->のバグがありますがprogkaka、これはわかりません。
ヨルダン

残念ながら、@ Jordanはsubexpressionの呼び出し\g<3>によって$ 3の値を更新するため、このショートカットを使用できません。
スディー

6

結晶、203の 194 187 186 184 163バイト

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]

私はあなたの周りに括弧を失うことができると思うc=vo+=<...>
Cyoce

5

MATLAB /オクターブ-159 158バイト

以下は、入力文字列がすべて小文字であると仮定して動作します。

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]

説明

  1. a = input('','s');:STDINから文字列を取得し、変数に格納しますa
  2. m=ismember(a,'aeiouy');a母音の位置を決定する文字列と同じサイズのブール配列を返します
  3. s='pgt vkh jglmn bqrzd fwx s';covfefe子音の文字列としてのマッピング。この文字列の長さは25文字で、母音は省略されます。母音'a'があるはずの最初の位置は削除され、母音がある他の位置にはダミーのスペース文字が配置されます。これは、母音の後に現れる最初の子音を決定するときに、子音をこの文字列内の文字にアクセスする位置に変換して、変換された単語の最初のコンポーネントを決定するためです。
  4. m(1:find(m,1))=1:ブール配列の最初の位置を、最初の母音がすべての母音として見つかった位置まで設定します。これにより、最初の母音に続く次の子音を検索するときに、これらの文字は無視されます。
  5. i=find(~m,1);:最初の母音の後の子音である文字列の最初の位置を検索します。
  6. f=a(1:i):母音に続く最初の子音の後の文字列を削除します。文字列の最初の位置からこのポイントまでサンプリングするだけです。
  7. d=s(f(end)-97);:残っている文字列の最後の文字を取得し、検索文字列からサンプリングする必要がある場所を見つけて、その文字を取得します。MATLABまたはOctaveで文字と数字を減算して、文字をASCIIコードに変換して整数を形成します。この場合、最後の文字からアルファベットの先頭の文字を引いて、先頭からの相対位置を求めます。ただし、b(98)で減算する代わりにa、MATLABが0ではなく1でインデックス付けを開始するため 、で減算し'a'ます。のASCIIコードは97です。
  8. m(1:i)=0;:ブールマスクを取得し、入力文字列の最初の位置から母音に続く最初の子音までのすべての文字をfalseに設定します。
  9. v=a(find(m,1));:入力文字列から最初の子音に続く次の母音を検索します。
  10. [f d v d v]covfefeied文字列を出力します。

実行例

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

オンラインでお試しください!

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

上部の[実行]ボタンをクリックしたら、しばらく待ってから目的の文字列を入力します。テキストを入力するときに遅延があるように見えるため、文字列をゆっくり入力してください。


5

Clojure、182 156文字

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

使い方

(partition-by v "president")

のシーケンスを返します ((\p \r) (\e) (\s) (\i) (\d) (\e) (\n \t))

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

配列をDestructures s=(\p \r)m=(\e)c=\sn=\i

または「例」のために、それはですs=[]m=(\e)c=\xn=\a

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

ピースを連結して文字列化することにより、出力文字列を返します。

そして、それをコンパイルしながら、できるだけ多くの空白を削除しました。

非修飾:

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

PPCGへようこそ、そして素晴らしい最初の答えです!より多くのチャレンジに参加し、楽しんでください。:-)
ETHproductions

関数を定義する場合、その名前はおそらくできるだけ短くする必要があります。cたとえば、メイン関数を呼び出すだけです。(多くの言語でより短い匿名関数も許可します; Clojureにあるかどうかはわかりません)。ただし、コードの内部は既に改善されているので、ここで変更する必要はあまりないでしょう。

5

R、341文字

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

恐ろしいRの試み、なぜ文字列はとても難しいですか

読み取り可能なバージョン:

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

私はあなたのカウントがオフであると信じています-340バイトをカウントします
テイラースコット


4

BlitzMax、190バイト

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

stdinから単語を取得し、結果をstdoutに出力します。入力語は小文字で、少なくとも1つの母音とそれに続く子音を含むと想定されます。

書式設定と変数宣言を備えたより読みやすいバージョンのプログラム:

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

使い方:

BlitzMaxには組み込みの正規表現機能などはありません。そのため、ループを使用して、少なくとも1つの子音のチェーンが続く母音が見つかるまで入力単語の文字を繰り返し処理します。変数cには、最後の子音の位置、vの母音の位置が格納されます。ループは、チェーンの後に別の母音が存在するかどうかを引き続き確認し、存在する場合、vはそれに応じて更新されます。次に、cの子音が文字列「bpdtfvgkcgsz」で検索され、置換テーブルとして機能します。子音がテーブル内の任意の位置で見つかった場合、その位置は1とXOR演算され、結果の位置の文字が置換として使用されます。XOR演算は、0を1に、2を3に、4を5に、またはその逆に変換します。そのため、bはpと交換され、dはtと交換されます。最後に、cまでの元の文字列、

結果の例:

カバレッジcovfefe

クリエイティビティ

プログラミングプログラム

愚かさ

何とか


blitzmaxレポへのリンク?
破壊可能なレモン

@DestructibleLemon BlitzMaxは、主にアマチュアゲームの開発のための言語として作成され、独自のコンパイラが有料で販売されていました。現在は無料でここから入手できますが、コンパイラはまだオープンソースではありません。代替実装(レポが存在するここでは、構築し、ここが唯一の原因変数宣言を省略することができる「非厳密」の設定がないため、上記のコードのungolfedバージョンを実行します)。
FireballStarfish

インデックスでのXORの巧妙な使用-私はおそらくいつかそれを使用するでしょう。ありがとうございました。
AI Breveleri

4

Perl、71バイト

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

また、で実行しperl -peます。以前のPerlソリューションよりも数バイト少ない。確かに私もそこからインスピレーションを得ました。


4

05AB1E101の 104 88バイト

Okxのおかげで-16バイト

私は何とかこれを行うことを願っての方法より効率的に。

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

オンラインでお試しください!

説明

                  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

に置き換え"bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs".•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•15バイトを保存することができます
Okx

に置き換えžOÃćIskžOÃ0èk別のバイトを保存することもできます。
Okx

@Okx文字列圧縮技術を学ぶ必要があると思います。ありがとう!
カルソウェラス

@kalsowerus久しぶりですが、次のように答えから8バイトをゴルフできžOÃнk>[DIs£¤žPså#\>]©s[DIsèDžOså#\>]s\.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`®θkèìDJ ます。オンラインで試してみてください。代わりに変数を使用して、主にすべてのスワップとトリプルスワップを取り除きました。そして、することができн、私は交換してきた2׫DJ一緒にスタック全体に参加します。PS:別の手法を使用して、55バイトの05AB1E回答も投稿しました。(05AB1Eの圧縮をよりよく理解するためのリンクも含まれています。:D)
ケビンクルーイッセン

3

クリスタル、130バイト

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

使い方

c = /[aeiouy]/

に最初の母音を検索するための正規表現を保存しcます。

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

最初の引数を3つの部分に分割し、{""、最初の母音、残りの文字列の後の最初の子音の1文字前までの文字列まで、各要素をx、yおよびzに格納します。

k = z[0]

関連する子音である最初の文字を取得します。

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

左文字列または内の子音のインデックスを取得しますnil

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

場合iではないnil、2番目の文字列(golfedハッシュの一種)のために、このインデックスを使用しています。

場合inil、元の文字を使用しています。

次に、の最初の母音を追加しますz

p y + k + (b * 2)

最後に、最初の正規表現y、最初の子音k、前の計算されたstringの2倍の最初の部分を出力しますb

オンラインでお試しください



2

Lua、164 157バイト

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

編集1:子音の後の文字を検索して7バイトを削除しました(正規表現を参照)

オンラインでお試しください!

このプログラムは、CLI引数の文字列を受け取り、そのバージョンを表示します。

これはコードゴルフへの私の最初の提出です!他の詳細を確認しなかったので、一般的な最適化を見逃してしまった可能性があります(そしていくつかの落とし穴に陥りました)。Luaを使用したのは、この小さな言語が好きになり、自分のニーズに合った正規表現を見つけようとしたからです。

関数を使用した、よりクリーンなバージョンを次に示します(使用するつもりでしたが、Luaのキーワードが長すぎます!)。

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

フィードバックをお寄せください:)

注:気になる場合は、MoonScriptを使用すると149バイトの長さです!


2

JavaScript(ES5)、237 229バイト

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}

オンラインでお試しください!

おそらく最もゴルファーではありませんが、ES5です。

最近バグを修正しました。出力例:

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

2

sed、106(105 + 1)バイト

これは-Eフラグと一緒に使用され、明らかに1バイトをカウントします。

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

オンラインでお試しください!


2

C#、584 581バイト

Destructible Lemonのおかげで-3バイト

これは、Code GolfおよびStack Exchange全般に関する私の最初の提出です。C#は素晴らしいゴルフ言語ではなく、おそらく完全に最適化されていないことは知っていますが、試してみたいと思いました:p。どんなヒントでも大歓迎です!

ゴルフバージョン:

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

読み取り可能なバージョン:

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
私は専門家ではありませんが、forループのコンパレーターに増分を追加できると思います。つまりx++ < l、、または何か(l > x++最初のものが機能しない場合など)です。わからない
破壊可能なレモン

@DestructibleLemonヒントをありがとう!
ブランドンハオ

2

SmileBASIC 3、195バイト

この質問に非常に遅れましたが、SmileBASIC 3の良い挑戦にどのように抵抗できますか?シーケンスの反復や文字列の操作などの機能は、他の言語ほど堅牢ではないため、これをできるだけ小さくするのは少し難しいです。単語は大文字であると仮定します。

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

詳細な説明はこちら!


2

05AB1E、55 バイト

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

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

η                        # 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"

私のこの05AB1Eのヒントを参照してください(セクション文字列ではない辞書の一部を圧縮する方法は?理由を理解すること.•gÍĆdQ¸G•です"bcdfkszgvtgp"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.