Нехай перший буде з вами


19

Напишіть програму, щоб замінити всі виникнення "сили" на "спочатку", а всі події "першого" на "сила", зберігаючи початковий регістр для всіх позицій символів:

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

Решта рядка повинна залишатися незмінною, і тому запуск вашої програми двічі поверне початкову рядок:

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

Ваша програма повинна працювати над будь-яким початковим рядком. Отже, як підказка, вам краще уникати використання магічних символів як проміжного подання, тому що якщо ви спробуєте замінити три пропуски ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"), це не вдасться на рядках, що містять "zzzzz".

Ви повинні підтримувати весь діапазон символів, дозволений у визначенні рядка мовою програмування (у більшості випадків це 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]немає, то ви не повинні замінювати слово.
Ерік Аутгольфер

2
Нехай перший може бути з вами. (Прокоментував 1 травня)
Esolanging Fruit

19
Чи не повинно бути "Може четвертий бути з тобою"?
wizzwizz4

3
@ mbomb007 "четвертий" і "сила" не мають однакової кількості букв, що робить його несумісним для зберігання однієї і тієї самої літери.
Cœur

Відповіді:


6

Сітківка , 33 байти

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

Спробуйте в Інтернеті!

Редагувати: Збережено 5 байт завдяки @MartinEnder за вказівку на те, що Roробить.


Так, збирався розмістити повідомлення, коли ОП відповість на мій коментар. Ви можете зберегти кілька байтів, упорядкувавши перший набір таким чином, щоб він міг бути другим 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 байт, оптимізувавши регістр без змін.


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örg Hü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*\*}

Переглядає кожну варіацію випадку "першої" та "сили" і намагається розділити її. Якщо може, то він з'єднує його зворотними словами.

Псевдокод:

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 True, відредаговано.
Esolanging Fruit


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

Добре, це було досить важко на Яві ..

Пояснення:

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 рівні: про
Дірявий Навин

Повинно бути гольфістичним способом: D
Джонатан Аллан

Так, і я щойно це знайшов: D
Leaky Nun



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(о, ніколи не значте: для цього потрібен новий рядок наприкінці)
Cœur

ld: library not found for -lfl(О, неважливо, команда gcc lex.yy.c -llна macOS)
Cœur

Перевірено та затверджено.
Cœur

2

Пітон 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 байт

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"«S з"force"
  3. _`.join("first".join(<STEP 2>)`[2::5]`_: Замінити всі "force"«S з "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 байтів, кодуючи верхній як True та нижчий як False: Спробуйте в Інтернеті!
Кінтопія

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 Кевіна Круїссена виявляється, коли мова заходить про отримання знаку в рядку за заданим індексом, 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можна замінити одним великим потрійним, якщо інакше s+=.
Кевін Крейссен

Я підтверджую, що це рішення не є кваліфікованим, оскільки, наприклад, воно не справляється із "силою".
Cœur

@ Cœur Я додав 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".

  • агрегуйте результати та на кожному розщепленні знайдіть п’яти символьну підрядку, яка використовувалася для розбиття вихідної рядки, використовуючи довжину до цього моменту, що агрегується. якщо це було "сила", зробіть це "першим" і навпаки

  • виберіть усі символи новоствореного рядка з усіма великими літерами та перевірте, чи не було початкового рядка з малого регістру в одному індексі. якщо так, поверніть нижній регістр символу в цьому індексі в новій строці, інакше поверніть верхній регістр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.