Semoga yang pertama bersamamu


19

Tulis program untuk mengganti semua kemunculan "force" dengan "first" dan semua kemunculan "first" dengan "force", dengan menjaga case asli untuk semua posisi karakter:

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

Sisa string harus tetap tidak berubah, dan menjalankan program Anda dua kali akan mengembalikan string asli:

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

Program Anda harus bekerja pada string awal apa pun. Jadi sebagai petunjuk, Anda sebaiknya menghindari menggunakan karakter ajaib sebagai representasi perantara, karena jika Anda mencoba pengganti tiga pass ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"), itu akan gagal pada string yang berisi "zzzzz".

Anda harus mendukung berbagai karakter yang diizinkan dalam definisi String oleh bahasa pemrograman Anda (dalam kebanyakan kasus, itu adalah Unicode). Contoh, menggunakan representasi gaya JSON untuk karakter yang tidak dapat dicetak (\ u + 4 digit):

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

1
Atta boy. Ingatkan orang bahwa tag tersebut memiliki kriteria pemenang '
Christopher

1
@ Challenger5 Tidak, saya tidak berpikir begitu karena jika yang memimpin [Ff]tidak ada maka Anda tidak boleh mengganti kata.
Erik the Outgolfer

2
Mungkin pertama kali bersamamu. (Komentar pada 1 Mei)
Buah Esolanging

19
Bukankah seharusnya "Semoga yang keempat bersamamu"?
wizzwizz4

3
@ mbomb007 "keempat" dan "kekuatan" tidak memiliki jumlah huruf yang sama, menjadikannya tidak kompatibel untuk menjaga karakter huruf yang sama.
Cœur

Jawaban:


6

Retina , 33 byte

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

Cobalah online!

Sunting: Disimpan 5 byte berkat @MartinEnder karena menunjukkan apa yang Rodilakukannya.


Yap, akan memposting setelah OP membalas komentar saya. Anda dapat menyimpan beberapa byte dengan menyusun ulang set pertama sehingga yang kedua bisa Ro.
Martin Ender

@ MartinEnder Dokumentasi membuat saya bingung dengan terlalu memperhatikan Refek pada rentang; misalnya saya tidak akan pernah menyadari bahwa REitu setara dengan 86420jika Anda tidak menunjukkannya.
Neil

terima kasih telah memberi tahu saya. Saya akan mencoba menjelaskannya dalam dokumen.
Martin Ender

9

JavaScript (ES6), 93 88 byte

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>

Sunting: Disimpan 5 byte dengan mengoptimalkan huruf besar yang tidak berubah.


5

APL (Dyalog) , 61 byte

Membutuhkan ⎕IO←0yang default pada banyak sistem. Dapat empat karakter lebih pendek menggunakan simbol Unicode bukan ⎕OPT .

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

Cobalah online!


4

PHP, 88 Bytes

Versi Online

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

PHP, 110 Bytes

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

3
Anda dapat menyimpan beberapa byte dengan $t[0]^first^forcealih - alih strtr().
user63956

@ user63956 Terima kasih atas upaya pembelajarannya
Jörg Hülsermann

4

Perl 5 , 52 byte

51 byte kode + -p bendera.

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

Cobalah online!

Tidak ada yang terlalu gila terjadi. Temukan kemunculan forcedan firstnon-case-sensitive ( s%force|first%%gi), lalu transliterasi karakter untuk mengonversi satu ke yang lain.


3

CJam, 66 byte

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

Periksa setiap variasi case "first" dan "force" dan cobalah untuk membelahnya. Jika bisa, itu kemudian bergabung kembali dengan kata-kata terbalik.

Kodesemu:

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: \*

Tentunya yang frelevan untuk menghindari berubah thirstmenjadi thorceatau divorcemenjadi divirst?
Neil

@Neil Benar, diedit.
Buah Esolanging


3

Java 7, 318 310 byte

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

Ok, ini cukup sulit di Jawa ..

Penjelasan:

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

Kode uji:

Coba di sini.

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

Keluaran:

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
Saya menghargai bahwa Anda memberikan contoh simetris c(c("..."))!
Cœur

3

Jelly , 37 36 byte

Apakah ada cara untuk menggunakan pengurangan melintasi irisan dengan panjang 5?

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

Cobalah online!

Bagaimana?

®‘©ị“Ɓ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 dan Jelly sama: o
Leaky Nun

Harus ada cara golf: D
Jonathan Allan

Ya, dan saya baru saja menemukannya: D
Leaky Nun

2

MATL , 47 byte

5W:qB!"o['first';'force']@!32*-cZ}_Zt5M_6MoZt|c

Cobalah online!

Ini menggunakan nilai negatif sebagai langkah perantara, dan setelah dua lewat itu mengambil nilai absolut.



2

Flex (lexer), 72 byte

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

Untuk mengkompilasi dan menjalankan:

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

first.l:3: EOF encountered inside an action(oh, tidak apa-apa: itu membutuhkan baris baru di akhir)
Cœur

ld: library not found for -lfl(oh tidak apa-apa, perintah ada gcc lex.yy.c -lldi macOS)
Cœur

Diuji dan disetujui.
Cœur

2

Python 2, 171 byte

Saya ingin mencoba melakukan ini menggunakan built-in, tetapi tidak dapat mengalahkan metode berantakan dengan semua pemisahan dan zipping.

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)

Saya pikir cukup jelas apa yang saya lakukan di sini. Pisahkan string pada instance dari first dan force (case-insensitive), gantilah instance tersebut dengan versi yang diterjemahkan menggunakan str.translate, dan gabungkan kembali menjadi string lagi.

Cobalah online!


2

Python 2.7, 173 165 byte

8 byte disimpan oleh kuintopia

Yang ini menjadi kotor:

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]

Cobalah online

Memecahnya langkah demi langkah:

  1. S.lower().split("force"): ambil string, satukan menjadi huruf kecil, pisahkan menjadi beberapa substring yang dipisahkan oleh "force"
  2. s.replace("first","force")for s in <STEP 1>: Ganti semua "first"dengan"force"
  3. _`.join("first".join(<STEP 2>)`[2::5]`_: ganti semua "force"dengan "first"dengan menggabungkan kembali "force"substring yang digambarkan dengan "first"dan bergabung kembali menjadi string tunggal (garis bawah ditambahkan untuk mendapatkan tanda centang yang benar)
  4. zip(<STEP 3>,[(2,1)[l.isupper()]for l in S]): zip setiap karakter frasa yang diganti dengan pengodean huruf dari string asli (2 untuk huruf kecil, 1 untuk huruf besar)
  5. _`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_: Kembalikan casing asli, ubah daftar menjadi string (garis bawah ditambahkan untuk mendapatkan tanda centang yang benar)

Anda dapat menyimpan 8 byte dengan mengkodekan atas sebagai Benar dan lebih rendah sebagai Salah: Cobalah online!
kuintopia

2

C (dentang) , 201 183 226 214 byte

Punya beberapa bug ... Masih perlu bermain golf cukup banyak

(disimpan 12 berkat ceilingcat)

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

Cobalah online!



1

C # 273 byte

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

Cobalah online!

Port langsung dari jawaban Java Kevin Cruijssen , ternyata ketika datang untuk mendapatkan char di string pada indeks yang diberikan, C # jauh lebih golf daripada java ( s[i++]bukan s.charAt(i++))


1

Japt , 41 byte

r"first|force"_d"i1o s1c t1e"¸m²®+ZuÃq}'i

Cobalah online!

Ini akan jauh lebih singkat jika Japt memiliki fungsi transliterate yang waras ...

Versi alternatif:

r"first|force"_d"io sc te"¸®¬¸²Ã®+ZuÃq}'i

Cobalah online!


1

C #, 235 karakter

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 byte non-comptent

Coba Online

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
Hmm, ini hanya berfungsi jika semua kata dibagi dengan spasi, tetapi bagaimana dengan koma, atau string aneh seperti "The first, force,|first'forced!"? Selain itu, Anda dapat sedikit kode golf saat ini: if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))-> ,zsetelah String s=""dan z=w.toLowerCase();if(z.equals("force")|z.equals("first")). Juga, 'O'bisa 79, 'C'bisa 67dan 'E'bisa 69. Dan if elsedapat diganti dengan satu ternary besar jika-yang lain, karena keduanya melakukannya s+=.
Kevin Cruijssen

Saya mengkonfirmasi bahwa solusi ini tidak memenuhi syarat, karena gagal pada "forceforce" misalnya.
Cœur

@ Cœur Saya telah menambahkan non competentjudulnya
Khaled.K

0

C # (269 Bytes)

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

lagi solusi c #, hanya yang terkecil-terkecil karena saya mendeklarasikan dua variabel dan tidak dapat menggunakan sintaks lambda. oh well, saya bersenang-senang. :)

penjelasan:

  • Angkat tali asli, lalu pisahkan pada "FORCE" dan "FIRST".

  • agregasikan hasil dan pada setiap pemisahan, temukan substring lima karakter yang digunakan untuk membagi string asli menggunakan panjang sejauh string tersebut diagregasi. jika itu "memaksa" menjadikannya "pertama" dan sebaliknya

  • pilih semua karakter dari string semua huruf yang baru dibuat dan periksa apakah string asli huruf kecil pada indeks yang sama. jika ya, kembalikan karakter huruf kecil pada indeks dalam string baru, jika tidak kembalikan karakter huruf besar
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.