İlk seninle olsun


19

Tüm karakter konumları için orijinal durumu koruyarak, tüm "kuvvet" örneklerini "ilk" ve "ilk" tüm örneklerini "kuvvet" ile değiştirmek için bir program yazın:

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

Dizenin geri kalanı değişmeden kalmalıdır, bu nedenle programınızı iki kez çalıştırmak orijinal dizeyi döndürür:

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

Programınız herhangi bir ilk dizede çalışmalıdır. Bir ipucu olarak, ara karakter temsili olarak sihirli karakterleri kullanmaktan kaçınmalısınız, çünkü üç geçişli değiştirme ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first") denerseniz , içeren dizelerde başarısız olur "zzzzz".

Programlama dilinize göre bir String tanımında izin verilen karakterlerin tamamını desteklemelisiniz (çoğu durumda bu Unicode'dur). Örneğin, yazdırılamayan karakterler için JSON stili gösterimi kullanma (\ u + 4 basamak):

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

1
Saldırı çocuğu. Etiketi 'kazanan kriterini sahip olduğunu insanlara hatırlatmak
Christopher

1
@ Challenger5 Hayır Ben öyle düşünmüyorum çünkü eğer lider [Ff]orada değilse kelimeyi değiştirmemelisiniz.
Outgolfer Erik

2
Mayıs önce seninle olsun. (1 Mayıs tarihinde yorum yapıldı)
Esolanging Fruit

19
" Dördüncü seninle olsun" olmamalı mı?
wizzwizz4

3
@ mbomb007 "dördüncü" ve "kuvvet" aynı sayıda harf içermediğinden, aynı karakter durumunu tutmak için uyumsuz hale gelir.
Cœur

Yanıtlar:


6

Retina , 33 bayt

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

Çevrimiçi deneyin!

Düzenleme: @MartinEnder sayesinde neyi işaret ettiği için 5 bayt kaydedildi Ro .


Evet, OP benim yorumuma cevap verdiğinde yazılacaktı. İlk seti yeniden sıralayarak birkaç bayt kaydedebilirsiniz, böylece ikincisi olabilir Ro.
Martin Ender

@MartinEnder Belgeler R, aralıklar üzerindeki etkisine çok dikkat ederek beni şaşırttı ; mesela, bunu işaret etmemiş olsaydınız, bunun asla REeşdeğer olduğunu asla fark edemezdim 86420.
Neil

bana bildirdiğiniz için teşekkürler. Dokümanlarda bunu daha net hale getirmeye çalışacağım.
Martin Ender

9

JavaScript (ES6), 93 88 bayt

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>

Düzenle: Değişmeyen harf durumunu optimize ederek 5 bayt kaydetti.


5

APL (Dyalog) , 61 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir . Bunun yerine Unicode sembolü kullanılarak dört karakter daha kısa olabilir .⎕OPT

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

Çevrimiçi deneyin!


4

PHP, 88 Bayt

Çevrimiçi Sürümler

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

PHP, 110 Bayt

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

3
Bunun $t[0]^first^forceyerine ile birkaç bayt kaydedebilirsiniz strtr().
user63956

@ user63956 Öğrenme çabası için teşekkür ederiz
Jörg Hülsermann

4

Perl 5 , 52 bayt

51 bayt kod + -pbayrak.

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

Çevrimiçi deneyin!

Çok çılgın bir şey olmuyor. Tekrarlarını bulun forceve firstolmayan küçük harfe duyarlı ( s%force|first%%gi) ve ardından diğer bir tane dönüştürmek karakterleri çevirisi şu.


3

CJam, 66 bayt

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

"İlk" ve "kuvvet" durumlarının her bir varyasyonundan geçer ve üzerinde bölünmeye çalışır. Mümkünse, ters kelimelerle birleştirir.

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

Elbette içine veya içine fgeçiş önlemek için önemlidir ? thirstthorcedivorcedivirst
Neil

@Neil True, düzenlendi.
Esolanging Fruit


3

Java 7, 318 310 bayt

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

Tamam, bu Java için oldukça zordu ..

Açıklama:

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

Test kodu:

Burada deneyin.

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

Çıktı:

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
Simetrik bir örnek verdiğiniz için teşekkür ederim c(c("..."))!
Cur

3

Jöle , 37 36 bayt

Bunun yerine uzunluk 5 diliminde bir azaltma kullanmanın bir yolu var mı?

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

Çevrimiçi deneyin!

Nasıl?

®‘©ị“Ɓ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 ve Jelly eşittir: o
Leaky Nun

Daha golfçü bir yol olmalı: D
Jonathan Allan

Evet, ben buldum: D
Leaky Nun



2

Flex (lexer), 72 bayt

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

Derlemek ve çalıştırmak için:

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

first.l:3: EOF encountered inside an action(ah, boşver: sonunda yeni bir satır gerektirir)
Cœur

ld: library not found for -lfl(oh boşver, komut gcc lex.yy.c -llmacOS'ta)
Cœur

Test edildi ve onaylandı.
Cur

2

Python 2, 171 bayt

Yerleşik kullanarak bunu denemek istedim, ama tüm bölme ve sıkıştırma ile dağınık yöntemi yenemez.

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)

Burada ne yaptığımı gayet açık düşünüyorum. Dizeyi ilk ve kuvvet (büyük / küçük harf duyarsız) örneklerinde ayırın, bu örnekleri str.translate kullanarak çevrilmiş sürümlerle değiştirin ve yeniden bir dizeye tekrar birleştirin.

Çevrimiçi deneyin!


2

Python 2.7, 173 bayt

Kintopya tarafından kaydedilen 8 bayt

Bu iğrenç oldu:

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]

Çevrimiçi deneyin

Adım adım yıkmak:

  1. S.lower().split("force"): dizeyi al, küçük harfe birleştir, ile ayrılmış alt dizelere ayır "force"
  2. s.replace("first","force")for s in <STEP 1>: Tümünü değiştir "first"ile 's"force"
  3. _`.join("first".join(<STEP 2>)`[2::5]`_: Hepsini yerine "force"'s ile "first"tekrar birleştirilmesi ile "force"birlikte tarif alt dizeleri"first" tek bir dize halinde ve rejoin (alt çizgi işaretleri düzeltmek kene almak için eklendi)
  4. zip(<STEP 3>,[(2,1)[l.isupper()]for l in S]): değiştirilen cümlenin her karakterini orijinal dizenin büyük / küçük harf kodlamasıyla zip (küçük harf için 2, büyük harf için 1)
  5. _`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_: Orijinal kasayı geri yükle, listeyi dizeye dönüştürür (onay işaretlerini doğru almak için alt çizgiler eklenir)

Üst değeri True, alt değerini False olarak kodlayarak 8 bayt kaydedebilirsiniz: Çevrimiçi deneyin!
quintopia

2

C (çınlama) , 201 183 226 214 bayt

Bazı hatalar vardı ... Hala çok golf aşağı gerekiyor

(ceilingcat sayesinde 12 kurtarıldı)

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

Çevrimiçi deneyin!



1

C # 273 bayt

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

Çevrimiçi deneyin!

Kevin Cruijssen'in Java cevabının doğrudan portu, belirli bir dizinde karakter dizisinde karakter almak söz konusu olduğunda ortaya çıkıyor, C # java'dan (golf s[i++]yerine s.charAt(i++)) çok daha golfçü



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 bayt sıkıştırılmamış

Çevrimiçi Deneyin

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, bu sadece tüm kelimeler boşluklara bölünmüşse işe yarar, ama virgül veya tuhaf dizeler ne olacak "The first, force,|first'forced!"? Ayrıca, mevcut kodunuzu biraz golf: if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))-> ,zsonra String s=""ve z=w.toLowerCase();if(z.equals("force")|z.equals("first")). Ayrıca, 'O'olabilir 79, 'C'olabilir 67ve 'E'olabilir 69. Ve if elseher ikisinin de yaptığı gibi, eğer büyük bir üçlü set ile değiştirilebilir s+=.
Kevin Cruijssen

Örneğin "forceforce" da başarısız olduğu için bu çözümün uygun olmadığını onaylıyorum.
Cur

@ Cœur non competentBaşlığa ekledim
Khaled.K

0

C # (269 Bayt)

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

başka bir c # çözümü, ben sadece ikinci-küçük çünkü iki değişken ilan ve bu yüzden lambda sözdizimi kullanamazsınız. Ah, eğlendim. :)

açıklama:

  • orijinal dizgiyi yukarı kaydırın, sonra "KUVVET" ve "İLK" üzerine bölün.

  • sonuçları bir araya getirin ve her bölmede, birleştirilen dizenin bugüne kadar olan uzunluğu kullanarak orijinal dizeyi bölmek için kullanılan beş karakterli alt dizeyi bulun. eğer "kuvvet" ise "önce" yapın ve tersini yapın

  • yeni oluşturulan tüm büyük harf dizesinin tüm karakterlerini seçin ve orijinal dizenin aynı dizinde küçük harf olup olmadığını kontrol edin. evet ise, yeni dizede bu dizindeki küçük harfli karakteri döndür, aksi takdirde büyük harfli karakteri döndür
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.