スプーネライズの言葉


50

2つの単語が与えられたら、最初の子音クラスターを切り替えて、それらを飾り付けます。少ないバイトが勝ちます。

plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
few years -> yew fears

最初の母音(aeiou)の前に現れる子音が切り替えられます。

入力:異なる子音で始まり、それぞれ母音を含む2つの小文字の文字列aeiou

出力:正しい順序での2つのスプーンの文字列。

入力および/または出力の場合、2つの文字列はリストなどにある場合もあれば、セパレータ付きの単一の文字列である場合もあります。


これはこの古い質問に近いものですが、古いものを二重として閉じることができるように、より明確で安定した仕様を作成したいと考えています。


4
単語は子音で始まります。
xnor

21
答えは"oozing snotter"imoである必要があります
パトリックロバーツ

3
@PatrickRoberts同意しますが、これによりチャレンジが少し簡単になります。
-xnor

1
あまり話題ではありませんが、雪フレークの
-flawr

1
速い運と内気なバントは参加できません
デナムクート

回答:


50

Vim、18キーストローク

/[aeiou]<CR>dbwvnhp0P

重要なトリックは、ビジュアルモードで何かの上に貼り付けると、実際にはビジュアルセレクションの古い内容が貼り付けバッファーに配置されることです。


...ああ、それは考えていませんでした。v包括的であり、母音から選択しようとすることによって放り出され続けました。
ドアノブ

10
カジュアルなvimユーザーとして、連続する各コマンドを入力するたびにびっくりしました。
アーロン

4
<CR>はキャリッジリターンを意味し、また、入力として知られている(古いタイプライターの用語を!)
甲斐カーバー

22

brainfuck、238の 207バイト

,[[<+<+>>-]++++[<-------->-]-[<<-->>-----]<<+++++[----[----[------[------>>]]]]>[>>]>,]<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]<[<<]-[<+>---]>[>.>]<[<<]<<[<<]>[>>]>[.>>]<.<[<<]>[>.>]>[>>]>[>>]>[.>>]

,EOF、8ビットの折り返しセル、およびセル0から左に移動する機能で0を返す必要があります。私の経験では、これらは最も一般的なデフォルト設定です。

私はこれにかなり満足しています。私の最初の試みは314バイトでしたが、これは確かに改善されています。:)

入力からのすべてのバイトを2つのセルに保存することで機能します。1つはバイトの実際の値を持ち、もう1つは次のコードの出力が与えられたとき(バイトの値-97):

[
    ----
    [
        ----
        [
            ------
            [
                ------>>
            ]
        ]
    ]
]

文字が子音である場合、それはゼロ以外の値で出てきます。母音の場合、0になります。そこからは、2番目の単語がどこから始まるのかを見つけて、すべてを順番に出力するだけです。

このプログラムの238バイトバージョンは、すべての入力を収集した後にスペース文字を見つけました。ループしようとしていた場所に0を含むセルを作成する必要があるため、頭痛の種でした。私が解決した方法は、最初の単語のすべての文字から30を引き、その後のすべての文字から32を引くという効果がありました。コードのかなりの部分は、そのナンセンスを処理することに専念していました。

現在、入力ループ内のすべての文字から32が減算されます。これはより短く、同様の副作用があり、処理が容易です。ボーナスとして、この方法でそれを行うと、短い方法で独自のスペースキャラクターを作成できました。すべてのキャラクターが171セルに32を追加するために邪魔になります。そこには4バイトかかりますが、後で139を減算する代わりに171を減算して、合計3バイトを節約できます。

コメント付き:

For every input character
,[

  Make a copy
  [<+<+>>-]

  Subtract 32 from one
  ++++[<-------->-]

  Subtract 97 from the other
  -[<<-->>-----]<<+++++

  If nonzero:
  [

    Subtract 4
    ----

    If nonzero:
    [

      Subtract 4
      ----

      If nonzero:
      [

        Subtract 6
        ------

        If nonzero:
        [

          Subtract 6
          ------>>

        ]

      ]

    ]

  ]

>[>>]>,]

Add 32 to every character and the 171 that the space left behind
<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]

Go to the space
<[<<]

Subtract 171 from (32 plus 171)
-[<+>---]

~~~~~~~~~~~~~~~

Ready to print!

~~~~~~~~~~~~~~~

Print letters from the second word until the value to the left is zero
>[>.>]

Go to the beginning of the first word
<[<<]<<[<<]

Look at cells to the left of letters in the first word until reaching a zero
>[>>]

Print the rest of the letters in the first word
>[.>>]

Print a space
<.

Go to the beginning of the first word
<[<<]

Print letters from the first word until the value to the left is zero
>[>.>]

Go to the beginning of the second word
>[>>]

Look at cells to the left of letters in the second word until reaching a zero
>[>>]

Print the rest of the letters in the second word
>[.>>]

これはy母音としてカウントされますが、質問はそうではないと言います。(nye cat-> ce nyat
Loovjo

1
母音をチェックするコードは間違いなくy子音として扱うので、@ Loovjoは本当に奇妙です。
地下

17

vim、23

/[aeiou]<cr>"xd0wndb0Pw"xP

vimはこの課題で実際に競争力があるのだろうか。おそらくゴルフ言語ではなく、Ruby / Python / Perl / etcでおそらく。

/[aeiou]<cr>  Find the first vowel
"xd0          "Delete" (cut), to register "x, everything from here to BOL
w             Go to next word
n             Find next vowel
db            "Delete back" - delete from here to the beginning of the word
0             Go to BOL
P             Paste what we just "deleted" (cut) behind the cursor
w             Next word
"xP           Paste backwards from register "x

11
これは挿入モードで行いますか?
アレックスA.

5
@AlexA。ಠ_ಠ
ドアノブ

@AlexA。挿入モードは余分なキーストロークになります:)
〜– pydsigner

@AlexA。挿入モード?挿入コマンド
ブラックライトシャイニング

1
@BlacklightShiningいや。それは冗談でした。なぜなら、挿入モードでそのようなものを入力すると、コマンドを実行しないからです。ファイルに入力するだけです。
アレックスA.

13

Python、68 63 60バイト

import re
lambda s:re.sub('([^aeiou]+|.+ )'*3,r'\3\2\1',s,1)

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

使い方

パターン文字列は3回繰り返され(*3)、パターンになります

([^aeiou]+|.+ )([^aeiou]+|.+ )([^aeiou]+|.+ )

すべてのインスタンスは、非母音の空でない文字列、または単一のスペース文字が後に続く空でない文字列のいずれかに一致します。

最初のインスタンスは、最初の単語の先頭の子音に一致します。以来+貪欲で、それは最初の母音に、すなわち、できるだけ多くの試合にすべてを試みます。

このため、2番目のインスタンスは母音で始まるため、最初の単語の残りの部分(単語を区切るスペースまで)と一致します。

最初のインスタンスと同様に、3番目は2番目の単語の先頭にあるすべての子音に一致し、パターン全体の一致が成功します。

生の文字列が\3\2\1r交換からのPythonを防ぎ\3すなわち、括弧で囲まれたパターンのマッチの順序を逆に制御文字をなど)、それはの初めに子音に置き換える第二の単語の最初の母音から、その後のすべての文字スペースまでの最初の単語、最後に最初の単語の先頭の子音。

sub1)の最後の引数は、2番目の単語の残りの無意味な置換を避けるために、最初の置換が成功した直後に戻ります。パターンは3つ以上の連続した子音の任意の文字列と一致するため、これが必要です。


1
非常に効率的な正規表現で正規表現の魔法をPythonにもたらしたことに感謝します。いい説明も。
xnor

11

JavaScript(ES6)、54バイト

s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])

説明

s=>
  s.replace(
    r=/\b[^aeiou ]+/g,     // r = regex to match consonants
    (_,i)=>s.match(r)[+!i] // replace consonants with the consonants from the other word
  )

テスト

var solution = s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])
<input type="text" id="input" value="plaster man" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


ああ、私の悪い、私は誤解しました。match家に帰るときのMDNドキュメントを見てみましょう
パトリックロバーツ

+!iトリックは素晴らしいソリューションです。+1
ETHproductions

10

Python 3、108 101 99バイト

(正規表現の使用なし)

この関数は、2つの引数を介した入力を想定していますf('blushing','crow')。タプルの新しい単語を返します。

S=lambda s,p="":s[0]in"aeiou"and(p,s)or S(s[1:],p+s[0])
def f(x,y):a,b=S(x);c,d=S(y);return c+b,a+d

多くの正規表現ソリューションがあるので、Pythonのreライブラリを使用しないものを書きたいと思いました。

使い方

唯一の複雑な部分はラムダ式ですS(略語は「最初の母音の前にS plit 」を意味します)。指定された単語を再帰的に「繰り返し」、一度に1文字ずつs(単語全体で始まる)から末尾p(空で始まる)に移動します。最初に出会った母音で(p,s)、つまり(プレフィックス、サフィックス)を返します。パラメータと比較すると、順序が間違っていることに注意してください!

返された順序が接頭辞、次に接尾辞の方が理にかなっていると思いました(一般に接頭辞は接尾辞の前にあるため)。この順序により、a,b=S(x)コードが少し読みやすくなる場合があります。

しかし、私はラムダのパラメータに順序の選択がなかったので、p前に定義できませんでしたs。最初のパラメータは、s持っていたので、全体の単語を取るためにp、デフォルト値を持っていたし、デフォルトのパラメータが最後に行きます。そうすることSで、空の文字列で関数を2回呼び出す必要がなくなり、数バイトを節約できました。ただし、ラムダ式内で使用された場合とは逆の順序でプレフィックス/サフィックスを返すことは、単に間違った決定でした。

関数に対するラムダ式の選択に関しては、言うdef S(s,p=""):returnよりも多くのバイトが必要S=lambda s,p="":です。Pythonには短絡評価と三項演算子があるので、私はその選択をすることができます。ただし、短絡の使用方法を適切に説明することはできません。推論するのは難しいです。


これが私の最初の答えです。これを正しく行い、勝てないソリューションを投稿する価値があることを願っています。

編集: ありがとうのコメント:バイトカウントを2倍に減らし、不要な情報を削除しました。文章を改善しようとしました。うまくいけば間違いはありません。


ppcgへようこそ、素晴らしい最初の回答:) fyi、このサイトのほとんどのプログラムには末尾の改行がないので、言及する必要はありません(まれに、必要な場合、人々が言及する場合)
地下

3
プログラミングパズルとコードゴルフへようこそ!1.入力形式について心配する必要はありません。課題は、リストを取得できることを明示的に示しています。2. タグwikiに記載されているデフォルトに従って、ゴルフチャレンジをコーディングするための完全なプログラムまたは機能を送信できます。この特定の問題では、関数は7バイト短くする必要があります。
デニス

4
最後の文については、「[...]勝てない解決策を投稿する価値があることを願っています。」確かにあります!私たちは皆、楽しんで貢献し、お互いから学び合うためにここにいます。より明白な解決策は正規表現を使用することであるため、この答えは特に巧妙です。とてもいい仕事です!
アレックスA.

優れた最初の答え。これは、非正規表現について思いついたものと非常によく似ています。短絡論理式の使用についてよく考えていたので、式を短縮できることがわかりましたが、おそらくそれを行う方法について自分で考えたいと思うかもしれません。
xnor

私はあなたが再帰的な解決策を使用したという事実が本当に好きです。非常にエレガントに実装されました!
-Ogaday

9

C#6、115バイト

string S(string a)=>System.Text.RegularExpressions.Regex.Replace(a,"([^aeiou]*)(.*) ([^aeiou]*)(.*)","$3$2 $1$4");

正規表現の名前空間がとても長いのは苦痛です。


2
これは冗長です。
コナーオブライエン

4
System.Text.RegularExpressions.Regex.Replace44文字!+1は何らかのレコードでなければならないためです。
レベルリバーセント

2
...そして今、あなたは44の問題を抱えています。;)
メイソンウィーラー

9

CJam、27 24 22バイト

2{l_{"aeiou"&}#/(N\}*o

I / Oは1行につき1ワードです。オンラインでお試しください!

使い方

2{                 }*   Do the following twice:
  l                       Read a line from STDIN.
   _                      Push a copy.
    {"aeiou"&}#           Find the index of the first character that has a non-
                          empty intersection with the string "aeiou".
               /          Split the string into chunks of that size.
                (         Shift out the first chunk, i.e., all leading consonants.
                 N\       Swap the shifted out chunk with a linefeed.
                     o  Print the topmost stack item.



8

JavaScriptのES6、93の 58 52バイト

ETHProductionsのおかげで6バイト節約されました!

x=>x.replace(/([^aeiou]+)(.+ )([^aeiou]+)/,"$3$2$1")

試して!(ES6のみ)


この編集を行ったとき、58バイトのソリューションで回答の投稿をクリックしようとしていました
ユーザー81655

@ user81655ああ、そのように起こってすみません。
コナーオブライエン

4番目のキャプチャグループまたはまったく必要ありません$4;)
ETHproductions

@ETHproductionsああ、そう!ありがとう!
コナーオブライエン

7

C、255 201 199バイト

この辺ではCの答えがあまり見られないので、楽しんでください。また、初めてのゴルフ、提案、批評も歓迎します。

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(v[1])+b+1
main(int q,char**v){char r[64],S(v[1],a),S(v[2],b)c,v[2])c+b,v[1]+a);strcat(r," ")l-a,v[1])l,v[2]+b);puts(r);}

main()が不要な場合は、24バイトを節約して179バイトを取得できます

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(x)+b+1
s(char*x,char*y){char r[64],S(x,a),S(y,b)c,y)c+b, x+a);strcat(r," ")l-a,x)l,y+b);puts(r);}

ゴルフをしていない:

void spoonerise(char* w1, char* w2)
{
    char rt[64];

    int p1 = strpbrk(w1, "aeiou")-w1;
    int p2 = strpbrk(w2, "aeiou")-w2;

    strcpy(rt, w2);
    strcpy(rt+p2, w1+p1);

    strcat(rt, " ");

    strcpy(rt+strlen(w1)+p2+1-p1, w1);
    strcpy(rt+strlen(w1)+p2+1, w2+p2);

    puts(rt);
}

編集:feersumの提案のおかげで、54バイトを節約しました。= D


を調べることをお勧めしstrpbrkます。
feersum

+1これは素晴らしい最初の答えです。サイトへようこそ。
wizzwizz4

勧告@feersumに感謝します。そして、歓迎の@ wizzwizz4に感謝します!
リンスアサシノ

6

パイソン2、364の 352 269 251バイト

編集:ゴルフ83バイトを手伝ってくれた@Cyoceに感謝します!

このゴルフを手伝ってください!とにかく、少なくとも私は最初のPython回答者です。そして、Javaの答えがあれば、Javaを打ち負かすことができると思います!

i=input()
f=l=''
A='aeiou'
for j in A:
 I=i[0];J=I.find(j)
 if ~J:
  if f:
   if f>I[0][:J]:f=I[:J];break
  else:f=I[:J]
for j in A:
 Y=i[1];J=Y.find(j)
 if ~J:
  if l:
   if l>Y[:J]:l=Y[:J];break
  else:l=Y[:J]
print I.replace(f,l,1),Y.replace(l,f,1)

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


5
-1は、1文字の変数を超えてこれをゴルフしようとしないため
Mego

@Megoできるだけ早く作業することを約束します。たった今。しかし、私は正規表現バージョンに取り組んでいます。
-TanMath

@Mego編集をご覧ください。
-TanMath

5

Japt、26 25バイト

幸いにも、数日前にJaptの正規表現機能に母音クラスを追加しました。残念ながら、非母音クラスや正規表現文字列の二重バックスラッシュを回避する方法は追加しませんでした。

#¿s4 £Uf"[^\\v]+|.+
?" gX

¿生の文字U + 0093でなければなりません。入力は、複数行の文字列、1単語/行です。オンラインでお試しください!

編集:非母音クラス\Vと回避方法\\(を使用して%)を追加したので、このコードは21バイトで動作します :( オンラインで試してください

#¿s4 £Uf"%V+|.+
?" gX

使い方

                     // Implicit: U = input string
#¿s4                 // Convert the char code (147) into a base-4 string "2103".
     £               // Map each char X in this string to:
      Uf"[^\\v]+|.+  //  Match each group in U of non-vowels or non-newlines,
?"                   //  with an optional trailing newline.
   gX                //  Get the item at position X in the resulting array.
                     // Implicit: output last expression

古いバージョン(26バイト):

UrA="\\b[^\\v ]+"@UfA gÂ!Y

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

使い方

UrA="\\b[^\\v ]+"@UfA gÂ!Y  // Implicit: U = input string
  A="\\b[^\\v ]+"           // Set variable A to this regex string, which matches
                            // a word boundary followed by one or more non-vowels.
UrA              @          // Take U and replace each match X of A and its index Y with:
                  UfA       //  Take U.match(A).
                      gÂ!Y  //  Get the item at index ~~!Y (converts 0 to 1, anything else to 0).
                            // Implicit: output last expression

主流の言語に正規表現の母音メタがあればいいのに!
CJデニス

4

Python 3、100(または99)バイト

import re
def f(*g):a,b=[re.split("[aeiou]",r)[0] for r in g];return b+g[0][len(a):],a+g[1][len(b):]

いくつかのバージョンでプレイしましたが、以下では入手できないようです。def f(g)代わりにを使用して99バイト下げることができるため、2つの別個の文字列ではなく文字列のリストを使用しますが、2つの引数を使用する方が好ましいです。

代替は等しい長さです:

import re
s=re.split
def f(x,y):v="[aeiou]";a,b=s(v,x)[0],s(v,y)[0];return b+x[len(a):],a+y[len(b):]

@TanMathが使用するように、置き換えを試みましたが、これ以上短くすることはできませんでした。また、TanMathは、"[aeiou]"代わりにを使用"[aeiou]+"することで、単一のインスタンスを照合するだけでよいため、回答を1バイト短くすることができます。最後に、の実装はinput()py2とpy3の間で変更されたようです-stdinを文字列として自動的に評価します。


1
おそらくあなたs=re.splitは代替手段を意味しますか?
xnor

はい!絶対に。これは初めてのゴルフですので、フィードバックやアドバイスをいただければ幸いです。
Ogaday

1
1.この質問では、2つの文字列をリストとして明示的に許可しているため、*inの正当な理由はないよう*gです。2. 2番目のバージョンは、までゴルフできますlambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):])
デニス

@Dennisに感謝します。それは実際に機能し、素晴らしいリファクタリングです。括弧が必要であり、2番目のラムダに引数としてsを渡す必要がないことは興味深いですか?そのソリューションは、先頭にimportステートメントとを含む98バイトを提供しますf=
-Ogaday

1
いいえ、sデフォルトの引数なので、指定する必要はありません。名前のないラムダは受け入れ可能な提出です。f=必須ではありません。
デニス

4

sed、38文字

s/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/

Retinaソリューションの拡張正規表現を使用します

上記の長さは37文字で、-rスイッチが必要です(+1文字)。

例:

$ cat input | tee /dev/tty | sed -r 's/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/'
plaster man
blushing crow
litigating more
strong wrangler
def ghi
master plan
crushing blow
mitigating lore
wrong strangler
ghef di

プログラミングパズルとコードゴルフへようこそ!
デニス

3

C#6、165バイト

string S(string a,string b){int i=V(a),j=V(b);return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);}int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

拡張:

string S(string a,string b){
    int i=V(a),
        j=V(b);
    return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);
}
int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

これはかなり古いですが、-2バイトの"aeiou".ToCharArray()場合'a','e','i','o','u'があります
無知の具体化

いいえ、@EmbodimentofIgnorance、IndexOfAnyそれがために必要となるので、それは、のparamsを取りませんnew[]{'a','e','i','o','u'}
ハンド-E-食品

ああ、私の間違い、私IndexOfAnyはparamsメソッドだと思った。とにかく、素晴らしい答え
無知の具現化

3

𝔼𝕊𝕄𝕚𝕟、24文字/ 42バイト

ïē/⟮(⁅ᶌ]+)⟯(.+ )Ⅰ/,`⑶⑵⑴`

Try it here (Firefox only).

これを理解するのに助けが必要な場合、これはES6に翻訳されます

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')

これは何語ですか?私もそのためのボックス文字を取得しています。
ジェシーウィリアムズ

@JesseWilliams ESMinと呼ばれます
ETHproductions

interperatorが、それはあなたに𝔼𝕊𝕄𝕚𝕟になるのjsを示しJAPT 1のようなものだった場合、それはいいだろう
一般ユーザー

コンパイルされたJSは、コードの実行時にJSコ​​ンソールに記録されます。
ママファンロール

3

PowerShell、52バイト

"$args "-replace('(.*?)([aeiou]\S+) '*2),'$3$2 $1$4'

e.g. 
PS C:\scripts\> .\Spoonerise.ps1 'blushing crow'
crushing blow

これは、4つのキャプチャグループに置き換えられる正規表現です。で:

  • 展開する文字列の乗算:
    • ('(.*?)([aeiou]\S+) '*2)'(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • "$args "、args配列を強制的に文字列にし、末尾のスペースを追加して、正規表現の末尾のスペースが壊れないようにします。

3

JavaScript(ES6)、120 107 102 101 99 92バイト

  • ありがとうございます!

パラメーターが次のようなオブジェクトである場合、これは考慮されます。
var a = {x: "man", y:"plaster"]}

a.b=(e=>e.slice(e.search`[aeiou]`));with(a){c=b(x),d=b(y),x=x.replace(c,d);y=y.replace(d,c)}

.match(/[aeiou]/).index次のようになります.search`[aeiou]`
。– Downgoat

3

パイソン、129の 108 105 109バイト

このプログラムは、このような単語のリストを取ります ["master","plan"]

編集:ありがとう@Volatility

編集:今re.splitを使用して

import re
a=re.split
c='[aeiou]+'
i,j=input()
f=a(c,i)[0]
l=a(c,j)[0]
print i.replace(f,l,1),j.replace(l,f,1)

この回答では、ほとんどの場合と同様に正規表現を使用しています。

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


はサブストリングのすべてのインスタンスをstr.replace置換することに注意してください.replace(f,l,1)。ただし、を使用して束を保存し、1文字の変数にi,j=input()再バインドre.findall'[^aeiou]+'ます。
ボラティリティ

これはそのままでは機能しません。2文字の1文字の単語でさえ3文字になり、input()2つの変数に展開しようとしています。という意味ですかi,j=input().split()raw_input()Python 2でも)。
ブラックライトシャイニング

1
@BlacklightShiningという言葉には、少なくとも1つの母音と1つの子音が必要です。入力は文字列のリストを取得するため、iは最初の単語、jは2番目の単語です。
TanMath

@TanMath私の知る限り、それデフォルトで許可されていますが、おそらく答えでどこかにそれが必要であると言うべきです
地下

これはあまりにも多く置き換えられます。"sass","bit" -> "babb", "sit"
XNOR

3

Java 8、343バイト

ここに、最初のJava回答があります。ゴルフを経験したことがないので、すべての提案を歓迎します!

java.util.function.Function;public class C{public static void main(String[] a){Function<String, Integer>f=s->{for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;return 0;};int i1=f.apply(a[0]),i2=f.apply(a[1]);System.out.println(a[1].substring(0,i2)+a[0].substring(i1)+" "+a[0].substring(0,i1)+a[1].substring(i2));}}

ゴルフをしていない:

public class SpooneriseWords {
    public static void main(String[] args)
    {       
        Function<String, Integer> f = s -> {
            for(int i = 0; i < s.length(); ++i)
                if("aeiou".contains(s.substring(i, i + 1))) 
                    return i;
            return 0;
        };

        int i1 = f.apply(args[0]);
        int i2 = f.apply(args[1]);
        System.out.println(args[1].substring(0, i2) + args[0].substring(i1));
        System.out.println(args[0].substring(0, i1) + args[1].substring(i2));
    }
}

なにjava.util.function.Function?あなたがを意味しない限り、そこにある必要があることを非常に疑いますが、import一度だけ参照するのでインポートをドロップします。変更public class C{public static void Main(String[] a)interface C{void Main(String[]a)

Function<String, Integer>空白は必要ありません
cat

forループをfor(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;toに変更しますfor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat

i1はひどく、長すぎるvarnameです。

これは、変更されるFunction<String, Integer>java.util.function.Function<String,Integer>とインポートをドロップ

3

オクターブ、96バイト

Octaveのインライン割り当てと「index-anywhere」機能のおかげで、このすべては、単一の匿名関数の定義にすぎません。基本的に、カットオフポイントをaとに保存しながら、スプーン化された文字列を再構築しますbfカットオフポイントを見つけるインライン関数に特に満足しており、' find(ismember(a,b),1)'を2回使用する必要がなくなりました。また、正規表現はありません:)

@(p,q)[q(1:(a=(f=@(m)find(ismember(m,'aeoui'),1))(q))-1),p(b=f(q):end),32,p(1:b-1),q(a:end)];

2

TeaScript、27バイト

xg/(\w+)(.+ )(\w+)/,"$3$2$1

\w実際に[^aeiou]です。


お待ちください、デフォルトの\w正規表現メタを[^aeiou]?に変更しました どうして?
ETHproductions

カスタム文字クラスを作成していたときの@ETHproductions。\wJavaScriptで既に使用されていたことを忘れていました。すぐに変更します
Downgoat

2

エリクサー143 117バイト

s=fn w->String.split_at(w,elem(hd(Regex.run(~r/[aeiou]/,w,return: :index)),0))end
{v,w}=s.(a)
{x,y}=s.(b)
[x<>w,v<>y]

最初の母音で2つの文字列(a、b)を分割し、新しい文字列を作成して返します。

編集:elemタプルから値を取得するために、不格好な呼び出しの代わりにパターンマッチングを使用して、数バイトを取得しました。


2

Java、147バイト

関数だけでも問題ないと思います。

String s(String[]i){String r="[aeiou]",f=i[0].split(r)[0],s=i[1].split(r)[0];return s+i[0].substring(f.length())+" "+f+i[1].substring(s.length());}

split(regex)残念ながら区切り文字を消費しsubstringます。つまり、接尾辞を取得するために使用する必要があります。



2

Python(正規表現なし)、85バイト

t=lambda s:s[1]in'aeiou'or-~t(s[1:])
lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])

サンプル実行:

>>> t=lambda s:s[1]in'aeiou'or-~t(s[1:])
>>> lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])
<function <lambda> at 0x7f495e534398>
>>> _('plaster', 'man')
('master', 'plan')

tは引数の最初の文字の後の最も初期の母音のインデックスを計算する再帰関数ですs。2番目の文字s[1]が母音の場合、評価されるの値Trueintです1。それ以外の場合は、最初の文字を削除して再帰呼び出しを行い、-~(1の補数の2の補数)を使用して結果のインデックスに1を追加します。最後に、の結果はt、文字列スライスのインデックスとして使用され、スプーネリズムを計算します。


1

GNU Awk 4.0、48文字

split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]

サンプル実行:

bash-4.3$ for s in 'plaster man' 'blushing crow' 'litigating more' 'strong wrangler' 'def ghi'; do
>     echo -n "$s -> "
>     awk 'split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]' <<< "$s"
> done
plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di

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