อาจเป็นคนแรกที่อยู่กับคุณ


19

เขียนโปรแกรมเพื่อแทนที่ "แรง" ที่เกิดขึ้นทั้งหมดด้วย "แรก" และเหตุการณ์ทั้งหมด "แรก" ด้วย "แรง" ซึ่งทำให้ตัวพิมพ์ต้นฉบับสำหรับตำแหน่งอักขระทั้งหมด:

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

ส่วนที่เหลือของสตริงจะต้องไม่เปลี่ยนแปลงดังนั้นการรันโปรแกรมของคุณสองครั้งจะส่งคืนสตริงเดิม:

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

โปรแกรมของคุณควรทำงานกับสตริงเริ่มต้นใด ๆ คุณควรหลีกเลี่ยงการใช้ตัวอักษรเวทย์มนตร์แทนการเป็นสื่อกลางเพราะถ้าคุณลองเปลี่ยนสามรอบ ("force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first" ) "zzzzz"มันจะล้มเหลวในสายที่มี

คุณควรสนับสนุนตัวละครทุกตัวที่อนุญาตให้ใช้ในการกำหนด String โดยภาษาการเขียนโปรแกรมของคุณ (ในกรณีส่วนใหญ่เป็น Unicode) ตัวอย่างการใช้การแทนค่าสไตล์ JSON สำหรับอักขระที่ไม่สามารถพิมพ์ได้ (\ u + 4 หลัก):

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

1
เด็กชายเก่ง เตือนผู้คนว่าแท็กมีเกณฑ์การชนะ '
คริสโตเฟอร์

1
@ Challenger5 ไม่ฉันไม่คิดอย่างนั้นเพราะถ้าผู้นำ[Ff]ไม่อยู่ที่นั่นคุณจะต้องไม่แทนที่คำ
Erik the Outgolfer

2
พฤษภาคมแรกอาจอยู่กับคุณ (ให้ความเห็นเมื่อวันที่ 1 พฤษภาคม)
ผลไม้ที่แยกออกจากกัน

19
ไม่ควรจะเป็น "อาจสี่อยู่กับคุณ"?
wizzwizz4

3
@ mbomb007 "ที่สี่" และ "บังคับ" ไม่มีจำนวนตัวอักษรเท่ากันทำให้เข้ากันไม่ได้กับตัวอักษรตัวเล็ก
Cœur

คำตอบ:


6

เรติน่า 33 ไบต์

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

ลองออนไลน์!

แก้ไข: บันทึก 5 ไบต์ด้วย @MartinEnder สำหรับการชี้ให้เห็นสิ่งที่Roทำ


ใช่กำลังจะโพสต์เมื่อ OP ตอบกลับความคิดเห็นของฉัน Roคุณสามารถบันทึกไม่กี่ไบต์โดยการจัดเรียงใหม่ชุดแรกเพื่อให้คนที่สองสามารถ
Martin Ender

@MartinEnder เอกสารทำให้ฉันสับสนโดยให้ความสนใจมากเกินไปกับRผลกระทบของช่วง เช่นฉันจะไม่ได้ตระหนักว่าREเทียบเท่ากับ86420ถ้าคุณไม่ได้ชี้ให้เห็น
Neil

ขอบคุณสำหรับการให้ฉันรู้ว่า. ฉันจะพยายามทำให้ชัดเจนยิ่งขึ้นในเอกสาร
Martin Ender

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 ไบต์โดยปรับขนาดตัวพิมพ์ใหญ่และเล็ก


5

APL (Dyalog) , 61 ไบต์

ต้องใช้⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ สามารถเป็นสี่ตัวละครสั้นโดยใช้สัญลักษณ์ Unicode แทน⎕OPT

(t'force' 'first')⎕R{(m∊⎕A)c¨t⊃⍨~t⍳(c819⌶)⊂m←⍵.Match}⎕OPT 1

ลองออนไลน์!


4

PHP, 88 ไบต์

รุ่นออนไลน์

<?=preg_replace_callback("#first|force#i",function($t){return$t[0]^first^force;},$argn);

PHP, 110 ไบต์

<?=preg_replace_callback("#first|force#i",function($t){return strtr($t[0],iIsStToOcCeE,oOcCeEiIsStT);},$argn);

3
คุณสามารถบันทึกไม่กี่ไบต์ที่มีแทน$t[0]^first^force strtr()
user63956

@ user63956 ขอขอบคุณสำหรับความพยายามในการเรียนรู้
JörgHülsermann

4

Perl 5 , 52 ไบต์

51 ไบต์ของรหัสเมือง + -pธง

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

ลองออนไลน์!

ไม่มีอะไรบ้าเกินไปที่เกิดขึ้น ค้นหาการเกิดขึ้นforceและfirstไม่คำนึงถึงขนาดตัวพิมพ์ ( s%force|first%%gi) และจากนั้นตัวอักษรจะแปลงอักขระเป็นอักขระอื่น


3

CJam, 66 ไบต์

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

ผ่านทุกรูปแบบของ "ครั้งแรก" และ "บังคับ" และพยายามที่จะแยกมัน หากสามารถทำได้จะรวมกลับมาพร้อมกับคำย้อนกลับ

pseudocode:

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มีความเกี่ยวข้องเพื่อหลีกเลี่ยงการเปลี่ยนthirstเป็นthorceหรือdivorceเข้าdivirst?
Neil

@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("..."))!
Cœur

3

เยลลี่ , 37 36 ไบต์

มีวิธีใช้การลดข้ามความยาว 5 ส่วนแทนหรือไม่?

®‘©ị“Ɓ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 และ Jelly มีค่าเท่ากัน: o
Leun Nun

ต้องมีวิธีเล่นกอล์ฟ: D
Jonathan Allan

ใช่และฉันเพิ่งค้นพบ: D
Leun Nun



2

ดิ้น (เล็ก), 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(โอ้ไม่เป็นไร: มันต้องขึ้นบรรทัดใหม่ที่สิ้นสุด)
Cœur

ld: library not found for -lfl(โอ้ไม่เคยคิด, คำสั่งgcc lex.yy.c -llบน MacOS)
Cœur

ผ่านการทดสอบและรับรองแล้ว
Cœur

2

Python 2, 171 ไบต์

ฉันอยากจะลองทำสิ่งนี้โดยใช้ built-in แต่มันก็ไม่สามารถเอาชนะวิธีที่ยุ่งเหยิงได้ด้วยการแยกและบีบอัด

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)

ฉันคิดว่ามันชัดเจนว่าฉันทำอะไรที่นี่ แยกสตริงบนอินสแตนซ์ของอันแรกและแรง (case-insensitive), แทนที่อินสแตนซ์เหล่านั้นด้วยเวอร์ชันที่แปลโดยใช้ str.translate และรวมกลับเข้าไปในสตริงอีกครั้ง

ลองออนไลน์!


2

Python 2.7, 173 165 ไบต์

8 ไบต์บันทึกโดย quintopia

อันนี้มียอดรวม:

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]`_: คืนค่าปลอกดั้งเดิมแปลงรายการเป็นสตริง (เพิ่มเครื่องหมายขีดล่างเพื่อรับเครื่องหมายถูก)

คุณสามารถบันทึก 8 ไบต์โดยการเข้ารหัสด้านบนเป็นจริงและต่ำกว่าเป็นเท็จ: ลองออนไลน์!
quintopia

2

C (เสียงดังกราว) , 201 183 226 214 ไบต์

มีข้อผิดพลาดบางอย่าง ... ยังคงต้องลงสนามค่อนข้างมาก

(บันทึกแล้ว 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;}

ลองออนไลน์!

พอร์ตโดยตรงของคำตอบ JavaของKevin Cruijssenปรากฎเมื่อได้รับอักขระในสตริงที่ดัชนีที่กำหนด C # เป็นนักกอล์ฟที่ดีกว่า Java ( 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หลังและString s="" z=w.toLowerCase();if(z.equals("force")|z.equals("first"))นอกจากนี้ยัง'O'สามารถ79, 'C'สามารถ67และสามารถ'E' 69และif elseสามารถเปลี่ยนกับหนึ่ง ternary s+=ใหญ่ถ้า-อื่นเพราะทั้งสองสิ่งที่ต้องทำ
Kevin Cruijssen

ฉันยืนยันว่าโซลูชันนี้ไม่ผ่านการรับรองเนื่องจากมันล้มเหลวใน "forceforce" เป็นต้น
Cœur

@Cur ฉันได้เพิ่มnon competentในชื่อ
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));}

อีกวิธีแก้ปัญหา c # เพียงอันที่สองที่เล็กที่สุดเพราะฉันประกาศตัวแปรสองตัวและไม่สามารถใช้แลมบ์ดาไวยากรณ์ได้ โอ้ดีฉันสนุก :)

คำอธิบาย:

  • เปลี่ยนสตริงเดิมจากนั้นแยก "FORCE" และ "FIRST"

  • รวมผลลัพธ์และในทุกการแยกให้ค้นหาสตริงย่อยห้าอักขระที่ใช้ในการแยกสตริงเดิมโดยใช้ความยาวจนถึงสตริงที่รวมกัน ถ้ามันเป็น "แรง" ทำให้มันเป็น "ครั้งแรก" และในทางกลับกัน

  • เลือกอักขระทั้งหมดของสตริงตัวพิมพ์ใหญ่ทั้งหมดที่สร้างขึ้นใหม่และตรวจสอบว่าสายอักขระดั้งเดิมเป็นตัวพิมพ์เล็กที่ดัชนีเดียวกันหรือไม่ ถ้าใช่ส่งคืนอักขระที่มีตัวพิมพ์เล็กที่ดัชนีนั้นในสตริงใหม่มิฉะนั้นส่งคืนอักขระตัวพิมพ์ใหญ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.