最初にあなたと一緒に


19

「force」のすべての出現を「first」に、「first」のすべての出現を「force」に置き換えて、すべての文字位置の元の大文字小文字を保持するプログラムを作成します。

"ForcefoRcefOrcE" -> "FirstfiRstfIrsT"
"FirstfiRstfIrsT" -> "ForcefoRcefOrcE"

文字列の残りは変更されないままである必要があるため、プログラムを2回実行すると元の文字列が返されます。

"thirst of forces" -> "thirst of firsts" -> "thirst of forces"

プログラムは、任意の初期文字列で動作するはずです。したがって、ヒントとして、中間表現としてマジックキャラクターを使用することは避けた方がよいでしょう。3パス置換("force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first")を試みると、を含む文字列では失敗するから"zzzzz"です。

プログラミング言語によるストリングの定義で許可されているすべての文字をサポートする必要があります(ほとんどの場合、Unicodeです)。例、非印刷文字(\ u + 4桁)にJSONスタイルの表現を使用する:

"\u0000\u0001\u0002\u0003the Force of the firsT"
                     |
                     V
"\u0000\u0001\u0002\u0003the First of the forcE"

1
アタ少年。タグに勝利基準があることを人々に思い出させる」
クリストファー

1
@ Challenger5いいえ、そうではないと思います。なぜなら、もしリーディング[Ff]がそこになければ、単語を置き換えてはいけないからです。
エリックアウトゴルファー

2
5月最初にあなたと一緒に。(5月1日コメント)
エソランジングフルーツ

19
4番目はあなたと一緒にいられますか」ではないでしょうか?
wizzwizz4

3
@ mbomb007 "fourth"と "force"の文字数は同じではないため、同じ大文字と小文字を区別することはできません。
キュー

回答:


6

網膜、33バイト

iT`\OC\E\ocetsiTSI`Ro`first|force

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

編集:@MartinEnderが何をRoしているのかを指摘してくれたおかげで5バイト節約されました。


うん、OPが私のコメントに返信したら投稿するつもりだった。最初のセットを並べ替えて2番目のセットを再配置することにより、数バイトを節約できますRo
マーティンエンダー

@MartinEnderドキュメントRは、範囲への影響にあまりにも注意を払うことで私を混乱させました。例えば、あなたがそれを指摘していなかった場合REと同等であることに気付かなかったでしょう86420
ニール

知らせてくれてありがとうございます。私はドキュメントでそれを明確にしようとします。
マーティンエンダー

9

JavaScript(ES6)、93 88バイト

f=
s=>s.replace(/force|first/gi,s=>s.replace(/./g,c=>s[s.search(c)^1]||c,s="oicsetOICSET"))
<textarea oninput=o.textContent=f(this.value)></textarea><pre id=o>

編集:変更されていない大文字と小文字を最適化して5バイトを保存しました。




4

Perl 5バイト

51バイトのコード+ -pフラグ。

s%first|force%$&=~y/oceOCEistIST/istISToceOCE/r%eig

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

クレイジーなことは何も起きていません。出現の検索forcefirst非大文字と小文字を区別(s%force|first%%gi)、その後、他の1つを変換する文字をtransliterates。


3

CJam、66バイト

qY5m*_"force"{f{_eu}3/:z{~?}f%}:K~\"first"K.{[\]:P~@\/\f/P~@\f*\*}

「最初」と「力」のすべてのケースバリエーションを通過し、それを分割しようとします。可能であれば、逆の単語で結合します。

擬似コード:

input_chars = list(read_all_input()) # CJam: q
power = cartesian_power(2, 5) # CJam: Y4m*_
def case_variations(s): # CJam: {...}:K
    temp0 = [[i, j, upper(j)] for i, j in zip(power, s)] # CJam: f{_eu}3/
    temp1 = map(transpose, temp0) # CJam: :z
    ret = []
    for i in ret:
        for j in i: # CJam: {...}f%
            ret.append(j[1] if j[0] else j[2]) # CJam: ~?
    return ret
force_var = K("force") # CJam: "force"{...}:K~
first_var = K("first") # CJam: \"first"K
for force, first in zip(force_var, first_var): # CJam: .{...}
    current = [force, first] # CJam: [\]:P~
    input_chars = list_split(input_chars, force) # CJam: @\/
    input_chars = [list_split(i, first) for i in input_chars] # CJam: \f/
    input_chars = [list_join(i, force) for i in input_chars] # CJam: P~@\f*
    input_chars = list_split(input_chars, first) # CJam: \*

確かfに変化を避けるために適切であるthirstthorcedivorcedivirst
ニール

@Neil True、編集済み。
エソランジングフルーツ


3

Java 7、318 310バイト

String c(String s){String x=s.toLowerCase();int i=x.indexOf("force")+1,j=x.indexOf("first")+1,t=i>0&j>i?0:j>0?1:0;return i>0|j>0?s.substring(0,t>0?(i=j):i)+(char)(s.charAt(i++)-(t>0?-6:6))+s.charAt(i++)+(char)(s.charAt(i++)+(t>0?-16:16))+(char)(s.charAt(i++)+(t>0?-15:15))+c(s.length()>i?s.substring(i):""):s;}

わかりました、これはJavaではかなり困難でした。

説明:

String c(String s){                       // Method with String parameter and String return-type
  String x=s.toLowerCase();               //  Temp String as lowercase of the input
  int i=x.indexOf("force")+1,             //  Index of "force" + 1 (becomes 0 if NOT present; >=1 if it is present)
      j=x.indexOf("first")+1,             //  Index of "first" + 1 (becomes 0 if NOT present; >=1 if it is present)
      t=i>0&j>i?0:j>0?1:0;                //  Temp integer: 0 if "force" is found first; 1 if "first" is found first
  return i>0|j>0?                         //  If either "force" or "first" is found:
    s.substring(0,t>0?(i=j):i)            //   Return the substring before that (if any) + ('f' or 'F')
     +(char)(s.charAt(i++)-(t>0?-6:6))    //   + 'i' <-> 'o', or 'I' <-> 'O'
     +s.charAt(i++)                       //   + 'r' or 'R'
     +(char)(s.charAt(i++)+(t>0?-16:16))  //   + 's' <-> 'c', or 'S' <-> 'C'
     +(char)(s.charAt(i++)+(t>0?-15:15))  //   + 't' <-> 'e', or 'T' <-> 'E'
     +c(s.length()>i?s.substring(i):"")   //   + a recursive call for the rest of the input-String (if any)
   :                                      //  Else:
    s;                                    //   Return the input-String
}                                         // End of method

テストコード:

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

class M{
  static String c(String s){String x=s.toLowerCase();int i=x.indexOf("force")+1,j=x.indexOf("first")+1,t=i>0&j>i?0:j>0?1:0;return i>0|j>0?s.substring(0,t>0?(i=j):i)+(char)(s.charAt(i++)-(t>0?-6:6))+s.charAt(i++)+(char)(s.charAt(i++)+(t>0?-16:16))+(char)(s.charAt(i++)+(t>0?-15:15))+c(s.length()>i?s.substring(i):""):s;}

  public static void main(String[] a){
    System.out.println(c("Force"));
    System.out.println(c("First"));
    System.out.println(c("foRce"));
    System.out.println(c("fiRst"));
    System.out.println(c("fOrcE"));
    System.out.println(c("fIrsT"));
    System.out.println(c("\u0000\u0001\u0002\u0003the Force of the firsT"));
    System.out.println(c("May the first be with you"));
    System.out.println(c(c("May the first be with you"))); // 2x
    System.out.println(c("The fIrSt of the First of the fORCE of the FIRST of the FoRCe"));
  }
}

出力:

First
Force
fiRst
foRce
fIrsT
fOrcE
 ���the First of the forcE
May the force be with you
May the first be with you
The fOrCe of the Force of the fIRST of the FORCE of the FiRSt

1
対称的な例を提供していただいたことに感謝しますc(c("..."))
・クール

3

ゼリー37 36 バイト

代わりに長さ5のスライス全体でreduceを使用する方法はありますか?

®‘©ị“Ɓu“¡Ḣƭ»
Œlœṣ¢œṣ€¢j€¢j¢Œu⁸=ŒuT¤¦

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

どうやって?

®‘©ị“Ɓu“¡Ḣƭ» - Link 1 helper that fetches the next word to use: no arguments
®            - recall value from register (initially zero)
 ‘           - increment
  ©          - place the result into the register
    “Ɓu“¡Ḣƭ» - literal dictionary compressed string list ["first","force"]
   ị         - index into (1-indexed and modular)
             - so this link first yields "first", then "force", then "first" and so on.

Œlœṣ¢œṣ€¢j€¢j¢Œu⁸=ŒuT¤¦ - Main link: list of characters, S
Œl                      - convert S to lower case
  œṣ                    - split on sublists equal to:
    ¢                   -   call the last link (1) as a nilad ("first")
     œṣ€                - split €ach on sublists equal to:
        ¢               -   call the last link (1) as a nilad ("force")
         j€             - join €ach with:
           ¢            -   call the last link (1) as a nilad ("first")
            j           - join with:
             ¢          -   call the last link (1) as a nilad ("force")
                      ¦ - apply a link to sparse indices:
              Œu        -   convert to upper case
                     ¤  -   nilad followed by link(s) as a nilad:
                ⁸       -     chain's left argument, S
                  Œu    -     convert to upper case
                 =      -     equal to S? (vectorises)
                    T   -     truthy indexes (indexes at which input is upper case)

Pythとゼリーは等しくます。o
漏れ修道女

ゴルファーの道がなければなりません:D
ジョナサンアラン

はい、私はちょうどそれを見つけた:D
漏れ修道女



2

Flex(レクサー)、72バイト

%%
 #define x(a) yytext[a]^=
(?i:first|force) x(1)6;x(3)16;x(4)17;ECHO;

コンパイルして実行するには:

flex first.l
gcc lex.yy.c -lfl # -ll on Macs, apparently
./a.out

first.l:3: EOF encountered inside an action(ああ、決して気にしないでください:最後に改行が必要です)
キュー

ld: library not found for -lfl(ああ、気にしない、コマンドはgcc lex.yy.c -llmacOS上にあります)
キュー

テストと承認。
クール

2

Python 2、171バイト

私はビルトインを使用してこれを実行したかったのですが、すべての分割とジッピングで面倒な方法に勝るものはありません。

import re,string as g
def f(s):f="istISTECOeco";l=re.split("(first|force)",s,0,re.IGNORECASE);l[1::2]=[t.translate(g.maketrans(f,f[::-1]))for t in l[1::2]];print"".join(l)

ここで何をしているのかは明確だと思います。firstとforceのインスタンスで文字列を分割し(大文字と小文字を区別しない)、それらのインスタンスをstr.translateを使用して翻訳されたバージョンに置き換え、再び文字列に結合します。

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


2

Pythonの2.7、173の 165バイト

quintopiaで保存された8バイト

これはひどくなりました:

lambda S:`[(t[0],t[0].upper())[t[1]]for t in zip("".join("first".join(s.replace("first","force")for s in S.lower().split("force"))),[l.isupper() for l in S])]`[2::5]

オンラインで試す

ステップごとに分解する:

  1. S.lower().split("force"):文字列を取得し、小文字に統一し、で区切られた部分文字列に分割します "force"
  2. s.replace("first","force")for s in <STEP 1>:すべて置き換え"first"さんをと"force"
  3. _`.join("first".join(<STEP 2>)`[2::5]`_:すべて置き換える"force"のをと"first"再結合することによって"force"線引きを持つストリング"first"単一の文字列にし、再結合を(アンダースコアはマークが修正ダニを取得するために追加します)
  4. zip(<STEP 3>,[(2,1)[l.isupper()]for l in S]):置換されたフレーズの各文字を元の文字列の大文字と小文字をエンコードして圧縮します(2は小文字、1は大文字)
  5. _`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_:元の大文字小文字を復元し、リストを文字列に変換します(目盛りを正しく取得するためにアンダースコアが追加されます)

上部をTrueに、下部をFalseにエンコードすることで8バイト節約できます。
キントピア

2

C(打ち鳴らす)201の 183 226 214バイト

いくつかのバグがありました...それでもかなり下にゴルフする必要があります

(ceilingcatのおかげで12件保存されました)

char*s,*p,*q;main(i,v)char**v;{puts(s=v[1]);do{p=strcasestr(s,"first");q=strcasestr(s,"force");if(p&&(!q|p<q))p[1]+=6,p[3]-=16,p[4]-=15;else if(q)q[1]-=6,q[3]+=16,q[4]+=15;s=p&&(!q|p<q)?p:q;}while(s++);puts(v[1]);}

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



1

C#273バイト

string c(string s){var x=s.ToLower();int i=x.IndexOf("force")+1,j=x.IndexOf("first")+1,t=i>0&j>i?0:j>0?1:0;return i>0|j>0?s.Substring(0,t>0?(i=j):i)+(char)(s[i++]-(t>0?-6:6))+s[i++]+(char)(s[i++]+(t>0?-16:16))+(char)(s[i++]+(t>0?-15:15))+c(s.Length>i?s.Substring(i):""):s;}

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

直接ポートケビンCruijssenのJavaの答えは、それが指定されたインデックス位置の文字列に文字を取得することになると、C#は、Javaよりもはるかにgolfierです(判明s[i++]の代わりにs.charAt(i++)



1

C#、235文字

string a(string s){var l=s.ToLower();int f=l.IndexOf("first"),F=l.IndexOf("force"),m=f<F&f>-1?f:F>-1?F:f;return ++m>0?s.Substring(0,m)+(char)(s[m]^6)+s[m+1]+(char)(s[m+2]^16)+(char)(s[m+3]^17)+(s.Length-m>5?c(s.Substring(m+4)):""):s;}


0

Java、382バイトの非コンテント

オンラインで試す

String f(String t){String s="";for(String w:t.split(" "))if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))s+=" "+w.charAt(0)+(char)(w.charAt(1)+(w.charAt(1)=='o'|w.charAt(1)=='O'?-6:6))+w.charAt(2)+(char)(w.charAt(3)+(w.charAt(3)=='c'|w.charAt(3)=='C'?16:-16))+(char)(w.charAt(4)+(w.charAt(4)=='e'|w.charAt(4)=='E'?15:-15));else s+=" "+w;return s.substring(1,s.length());}

3
うーん、これはすべての単語がスペースで区切られている場合にのみ機能しますが、コンマ、または奇妙な文字列は"The first, force,|first'forced!"どうですか?また、現在のコードを少しゴルフすることもできます。- if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))> およびの,z後。また、することができ、可能とすることができ。そして、両方を行うので、1つの大きな三項if-elseに置き換えることができます。String s=""z=w.toLowerCase();if(z.equals("force")|z.equals("first"))'O'79'C'67'E'69if elses+=
ケビンCruijssen

このソリューションは、たとえば「forceforce」で失敗するため、資格がないことを確認します。
クール

non competentタイトルに追加した@
Cœur– Khaled.K

0

C#(269バイト)

string s(string z){var u=z.ToUpper();var a=new[]{"FIRST","FORCE"};return String.Join("",u.Split(a,StringSplitOptions.None).Aggregate((c,n)=>c+(u.Substring(c.Length,5)==a[0]?a[1]:a[0])+n).Select((c,i)=>Char.IsLower(z[i])?Char.ToLower(c):c));}

2つの変数を宣言したため、ラムダ構文を使用できないため、2番目に小さいC#ソリューションです。まあ、私は楽しんだ。:)

説明:

  • 元の文字列をシフトアップしてから、「FORCE」と「FIRST」で分割します。

  • 結果を集約し、すべての分割で、集約される文字列のこれまでの長さを使用して元の文字列を分割するために使用された5文字の部分文字列を見つけます。それが「力」だった場合は「最初」にし、逆も同様です

  • 新しく作成されたすべて大文字の文字列のすべての文字を選択し、元の文字列が同じインデックスで小文字であったかどうかを確認します。はいの場合、新しい文字列のそのインデックスで小文字を返し、そうでない場合は大文字を返します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.