解密那些区分大小写(非常敏感)的字符串


53

目标

这是一个简单的挑战。您的目标是通过将每个字母与相同大小写的下一个字母交换来对字符串进行加扰,同时保持非字母字符不变。

例

逐步说明

  1. 第一个字符是E。我们寻找大写的下一个字母:这是一个C。我们交换了这些字符,从而导致CdoE!

  2. 我们前进到下一个字符:这是一个d。我们寻找小写的下一个字母:这是一个o。我们交换了这些字符,从而导致CodE!

  3. 我们前进到下一个字符:这就是d我们刚刚移到此处的字符。我们将其忽略,因为它已被处理。

  4. 我们前进到下一个字符:这是E在步骤#1中移到的字符。我们将其忽略,因为它已被处理。

  5. 我们前进到下一个字符:这是一个!。我们忽略它,因为它不是字母。

规则

  • 您可以假设输入字符串仅由可打印的ASCII字符组成,范围为32-126。

  • 您可以编写完整的程序或函数,以打印或返回结果。

  • 如果输入字符串包含奇数个字母,则无论大小写如何,最后一个剩余的字母都不能与另一个字母互换,并且应保留在原位。如果字符串包含偶数个字母,但奇数个大写字母和奇数个小写字母,则适用相同的逻辑。

  • 这是代码高尔夫球,因此最短的答案以字节为单位。禁止出现标准漏洞。

测试用例

Input : lLEhW OroLd!
Output: hELlO WorLd!

Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf

Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg

Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!

不太随机的测试用例:

Input : (^_^)
Output: (^_^)

Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP

Input : hwn oeesd acsp nawyya
Output: who needs caps anyway

Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken

Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.

如果输入包含偶数个字母,但奇数个大写字母和奇数个小写字母,则我认为类似的注释成立。
格雷格·马丁

14
这是一个非常聪明的挑战……我也喜欢这样的事实,可以通过输入小写字符串,将某些字母随机更改为大写字母,然后运行可以解决问题的相同程序来进行测试!
格雷格·马丁

1
@GregMartin我发现问题是它本身的逆,因为在尝试测试用例时,我无意中输入了输出而不是输入:-)
Luis Mendo

我认为您应该包括具有多个非字母ASCII字符的测试用例...我认为某些实现可能会意外地将它们相互切换,而这是不应该发生的。
格雷格·马丁

3
测试用例可能应该包括一个没有大写字母的字符串和一个根本没有任何字母的字符串。
丹尼斯

Answers:


4

果冻21 20 19 18字节

s2UF,
nŒlTÇyJịŒsµ⁺

在线尝试!

这个怎么运作

nŒlTÇyJịŒsµ⁺  Main link. Argument: s (string)

 Œl           Convert to lowercase.
n             Test for inequality.
   T          Truth; yield all indices of 1's.
    Ç         Call the helper link. Yields [A, B] (pair of lists).
      J       Indices; yield I := [1, ..., len(s)].
     y        Translate; replace the integers of I that occur in A with the
              corresponding integers in B.
        Œs    Swapcase; yield s with swapped case.
       ị      Use the translated index list to index into s with swapped case.
          µ   Combine all links to the left into a chain.
           ⁺   Duplicate the chain, executing it twice.


s2UF,         Helper link. Argument: J (list of indices)

s2            Split J into pairs. If the length is odd, the last list will be
              a singleton list.
  U           Upend; reverse each pair. This is a no-op for singletons lists.
   F          Flatten, concatenating the pairs.
    ,          Pair the previous result with J.


9

MATL,22字节

2:"tttk<f2etAZ))P5M(Yo

在线尝试!验证所有测试用例

这个怎么运作

2:"       % Do the following twice
  ttt     %   Input string (implicit). Push three more copies
  k       %   Convert to lowercase
  <f      %   Indices of characters that had their code point increased by
          %   the lowercase conversion, i.e. that were uppercase letters
  2e      %   Convert to 2-row matrix. This pads a zero in the lower-right 
          %   corner if necessary
  tAZ)    %   Keep only columns that don't contain zeros. Thus if there
          %   was a character that can't be swapped it will be ignored             
  )       %   Get 2-row matrix of characters at those positions
  P       %   Flip vertically. This does the swapping
  5M      %   Push matrix of original indices again
  (       %   Write the swapped characters onto their original positions
  Yo      %   Change case. In the first iteration, this prepares the
          %   string so the second iteration will process the letters that
          %   were originally lowercase. In the second iteration, it
          %   undoes the change of case 
          % End (implicit)
          % Display (implicit)

6

Bash + Unix实用程序,77 62 57 56 54字节

sed -r "s/([$1)([^$1*)([$1)/\3\2\1/g"||$0 a-z]|$0 A-Z]

在标准输入中输入。在标准输出中输出。

(在最后一个版本中,stderr碰巧也被写入了,但是PPCG共识似乎没关系- 完全忽略了stderr。

编辑1:感谢@Dennis提供15个字节!改进之处:(a)通过标准输入输入;(b)将2个sed脚本合并为一个;(c)通过bash参数扩展将tr替换为替换;(b)和(c)在编辑2中消失了。

编辑2:短5个额外字节。在Edit 1中使用函数调用来替换(b)和(c)。

编辑3:再加上一个字节-通过]作为函数参数的一部分。

编辑4:在没有参数的情况下,将两个函数调用替换为对程序本身的调用。

试验台和样品输出:

for x in 'lLEhW OroLd!' 'rpGOZmaimgn uplRzse naC DEoO LdGf' 'eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg' 'NraWgCi: Nsas-eNEiTIsev rNsiTG!!' '(^_^)' 'AWCTY HUOS RETP' 'hwn oeesd acsp nawyya' 'SpMycaeIesKyBorekn' "D's mroyr, Ivam. I'e faardi I act'n od htta."; do ./swapping <<<"$x" 2>/dev/null; done

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.

6

ES6,185个 95字节

i=>(o=[...i]).map((c,j)=>/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?o[o[j]=o[b],b]=c:j:0)&&o.join``

在@ Neil,@ Arnauld和@ edc65的帮助下,解决方案大大缩短了

说明

f = i =>
  // Get array of characters from input string
  (o = [...i])
    .map((c, j) => 
      // Check if it's a text character, otherwise skip it
      /[a-z]/i.test(c) ? 
        // Get last character position for case
        // merged with setting a variable for if the character is lowercase
        // merged with storing the current case character position,  
        // under properties on the array (with keys "true" or "false")
        o[e = c>"Z"] =
          // Check if there exists a character position to switch with
          // merged with storing the current position for quick access
          1/(b=o[e]) ? 
            // This statement will end up returning the Array subset, 
            // which will be falsy in the above conditional since (1/[])==false
            o[
              // Switch left character to the right
              o[j]=o[b]
            // Switch right character to the left
            ,b]=c : 
            // No character exists for case, so return current character position
            j
         // It was not a text character, so do nothing
         :0
      )
  // Join array and return as result
  && o.join``;

`lLEhW OroLd!
NraWgCi: Nsas-eNEiTIsev rNsiTG!!
rpGOZmaimgn uplRzse naC DEoO LdGf
eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
(^_^)
AWCTY HUOS RETP
hwn oeesd acsp nawyya
SpMycaeIesKyBorekn
D's mroyr, Ivam. I'e faardi I act'n od htta`
  .split`\n`
  .map(testCase => console.log(f(testCase)));


6个字节,当我们删除第二条语句时,括起来的括号是多余的:)很好。

2
请忽略我的最后评论。这是99:/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
Arnauld

2
[o[b],o[j]]=[c,o[b]]可能是o[o[j]=o[b],b]=c
edc65

真正的技巧是使用true和false作为数组的索引
edc65

谢谢大家,现在降至95。以一种有意义的方式来记录解决方案变得非常困难。XD @ edc65将它们存储为数组对象的属性,而不是索引。是的Arnauld知道它们已存储在字符数组中,但是我认为对象的重用更多是幸运的事故,它来自于另外的建议。最初,它存储在一个单独的对象上,这当然对于挑战的范围是完全不必要的。

3

Python,82字节

lambda s:S(r.lower(),t,S(r,t,s))
import re
S=re.sub
r='([A-Z])(.*?)'*2
t=r'\3\2\1'

在线尝试!


它是如何工作的?甚至叫lambda吗?
Sarge Borsch

lambda是实际的(函数)提交。其他所有内容只是在调用lambda之前必须执行的随附代码。
丹尼斯

3

QBasic,229个字节

LINE INPUT s$
FOR i=1TO LEN(s$)
c$=MID$(s$,i,1)
IF"@"<c$AND"[">c$THEN
IF u THEN MID$(s$,u,1)=c$:MID$(s$,i,1)=u$
u=-i*(u=0)
u$=c$
ELSEIF"`"<c$AND"{">c$THEN
IF l THEN MID$(s$,l,1)=c$:MID$(s$,i,1)=l$
l=-i*(l=0)
l$=c$
END IF
NEXT
?s$

战略

我们遍历输入字符串。当遇到大写字母时,我们将其及其位置存储起来。第二次遇到大写字母时,我们使用这些存储的值将其与前一个字母交换。小写字母相同。

(我打算发布一个使用数组的较长版本,因为我认为QBasic字符串是不可变的。然后我偶然发现了一个MID$(strng$, index, length) = replacement$运行良好的事实。学习和生活。)

取消高尔夫+评论

LINE INPUT text$

FOR i = 1 TO LEN(text$)
  char$ = MID$(text$, i, 1)
  IF "A" <= char$ AND "Z" >= char$ THEN
    ' Uppercase
    IF upperIndex = 0 THEN
      ' This is the first of a pair of uppercase letters
      ' Store the letter and its index for later
      upperLetter$ = char$
      upperIndex = i
    ELSE
      ' This is the second of a pair of uppercase letters
      ' Put it at the position of the previous uppercase letter
      ' and put that letter at this letter's position
      MID$(text$, upperIndex, 1) = char$
      MID$(text$, i, 1) = upperLetter$
      upperIndex = 0
    END IF
  ELSEIF "a" <= char$ AND "z" >= char$ THEN
    ' Lowercase
    IF lowerIndex = 0 THEN
      ' This is the first of a pair of lowercase letters
      ' Store the letter and its index for later
      lowerLetter$ = char$
      lowerIndex = i
    ELSE
      ' This is the second of a pair of lowercase letters
      ' Put it at the position of the previous lowercase letter
      ' and put that letter at this letter's position
      MID$(text$, lowerIndex, 1) = char$
      MID$(text$, i, 1) = lowerLetter$
      lowerIndex = 0
    END IF
  END IF
NEXT i

PRINT text$

2

C ++ 11(GCC),154个 149字节

#include<algorithm>
[](std::string s){int*p,u,l=u=-1;for(auto&c:s)(c|32)-97<26U?p=&(c&32?u:l),~*p?(std::swap(c,s[*p]),*p=-1):*p=&c-&s[0]:0;return s;}

1
您也应该#include<string>或切换到C ++ 14并声明一个通用lambda [](auto s)并假定s为of std::string。同样,声明[](auto&s)允许您免于返回字符串,因为允许修改输入参数以用作输出。
Karl Napf '17

2

Qbasic,436408字节

LINE INPUT a$:b=len(a$):FOR a=1TO b:t$=MID$(a$,a,1)
IF"@"<t$AND"[">t$THEN
b$=b$+"U":u$=u$+t$
ELSEIF"`"<t$AND"{">t$THEN
b$=b$+"L":l$=l$+t$
ELSE b$=b$+t$
END IF:NEXT
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT
FOR x=1TO b:t$=MID$(b$,x,1)
IF"U"=t$THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF"L"=t$THEN l=l+1:z$=z$+MID$(h$,l,1)
ELSE z$=z$+t$
END IF:NEXT:?z$

多亏了DLosc,节省了一个字节。通过更改非字母字符的处理方式节省了更多。

这基本上包括三个部分:

  • 将输入分为3个字符串(大写,小写和一个映射(还包含其他字符))
  • 翻转大写和小写字母
  • 使用地图(重新)构造输出。

更详细的解释(请注意,这是代码的早期版本,但原理仍然适用):

' --- Part I: Reading the input
LINE INPUT a$
'This FOR loop takes one character at a time
b=len(a$):FOR a=1TO b
' And checks in what category the character belongs
t$=MID$(a$,a,1):SELECT CASE t$
' For each group, char t$ is added to that group (u$ for uppercase, 
' l$ for lowercase. The map in b$ is updated with a U or L on this index,
' or with the non-letter char t$.
CASE"A"TO"Z":b$=b$+"U":u$=u$+t$
CASE"a"TO"z":b$=b$+"L":l$=l$+t$
CASE ELSE:b$=b$+t$
END SELECT:NEXT

' --- Part II: Swapping within case-groups
' Loop through u$ and l$ twp chars at a time, and add those chunks in reverse order
' to g$ and h$. Because mid$ doesn't fail past the end of a string (but returns ""), 
' this automatically compensates for odd-length groups.
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT

' --- Part III: Read the map to put it all back together
FOR x=1TO b:t$=MID$(b$,x,1)
' See what group was in this spot, then read the next char from the flipped string.
' This keeps an index on those strings for the next lookup.
IF t$="U"THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF t$="L"THEN l=l+1:z$=z$+MID$(h$,l,1)
' The map contains a non-letter char, just drop that in
ELSE z$=z$+t$
' And finally,display the end result.
END IF:NEXT:?z$

2

PHP,108 93 83字节

<?=preg_replace([$a="/([a-z])([^a-z]*)([a-z])/",strtoupper($a)],"$3$2$1",$argv[1]);

先前版本(93字节)

<?=preg_replace(["/([a-z])([^a-z]*)([a-z])/","/([A-Z])([^A-Z]*)([A-Z])/"],"$3$2$1",$argv[1]);

感谢@ user59178提醒我preg_replace()可以将字符串数组作为参数。


原始答案(108字节)

$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

代码被包装在此处以适应可用空间。
可以从命令行执行:

$ php -d error_reporting=0 -r '$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));' 'lLEhW OroLd!'

通过压缩$f第一次调用内部的分配,可以在PHP 7上缩短1字节的版本:

echo($f=preg_replace)("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

可以在Github上找到带有测试用例和未发布版本的两种解决方案。


1
preg_replace可以进行一系列替换,因此您只需要一个电话。此外,它的使用时间<?=比短echo。有了这些,很容易将答案减小到93个字节。
user59178

您是正确的preg_replace()。我忘了 我不喜欢<?=(我认为<?这不是语言的一部分,它只是一个标记),我喜欢编写可通过命令行使用执行的简短的单行程序php -r。但是出于代码高尔夫的目的,您又是对的。我可以使用保存1个字节<?=
axiac

1

Mathematica,96个字节

s[#,r="([a-z])(.*?)([a-z])"]~(s=StringReplace[#,RegularExpression@#2->"$3$2$1"]&)~ToUpperCase@r&

Leo的Retina answer的端口,它使用正则表达式。


老实说,我对mathematica没有内置函数感到惊讶,我的意思是,如果“复活节周日何时”,“日落时分”和“法国的形状是什么”得到内置函数,那么这个也应该内置!
sagiksp


1

Bean,83个字节

十六进制转储:

00000000 26 53 d0 80 d3 d0 80 a0 5d 20 80 0a a1 81 81 00  &SÐ.ÓÐ. ] ..¡...
00000010 23 81 01 20 80 0a a1 81 81 02 23 81 01 a8 db c1  #.. ..¡...#..¨ÛÁ
00000020 ad da dd a9 a8 db de c1 ad da dd aa bf a9 a8 db  .ÚÝ©¨ÛÞÁ.Úݪ¿©¨Û
00000030 c1 ad da dd 29 a4 b3 a4 b2 a4 31 a8 db e1 ad fa  Á.ÚÝ)¤³¤²¤1¨Ûá.ú
00000040 dd a9 a8 db de e1 ad fa dd aa bf a9 a8 db e1 ad  Ý©¨ÛÞá.úݪ¿©¨Ûá.
00000050 fa dd 29                                         úÝ)
00000053

等效的JavaScript:

a.replace(/([A-Z])([^A-Z]*?)([A-Z])/g,'$3$2$1').replace(/([a-z])([^a-z]*?)([a-z])/g,'$3$2$1')

说明:

隐式地将输入的第一行未格式化为a(因为换行符不能是加扰的字符串的一部分),并通过依次替换大写然后小写的对来隐式输出未加密的字符串。

在这里尝试演示。

在这里尝试测试套件。


1

Ruby,81个字节

puts f=->(i,s){i.gsub /([#{s})([^#{s}*)([#{s})/,'\3\2\1'}[f[$*[0],'a-z]'],'A-Z]']

1

JavaScript(ES6),80个字节

基于狮子座的视网膜答案

s=>eval("s"+(r=".replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')")+r.toLowerCase())

之所以可行,是因为代码.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')中唯一的大写字符是AZ,用于描述字符范围。这正是我们需要转换为小写字母才能处理第二遍的内容。

测试用例


实际上,它与Dennis的Python答案非常相似。
Arnauld

1

ES6 155-195字节

我知道已经有一个更好的答案,但是我想尝试不使用正则表达式的方法。这个也可以在标点符号上工作,但这似乎违反了(^_^)测试。在这种情况下,我还有另一个c()功能,如下所示。

f=(s)=>{d={};s=[...s];for(i in s){b=s[i];for(j in s)if(i<j&!d[i]&c(s[j])==c(b)){d[j]=1;s[i]=s[j];s[j]=b;break}}return s.join('')}
c=c=>~(c.charCodeAt()/32)

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> )_^^(

c=c=>((c!=c.toUpperCase())<<1|c!=c.toLowerCase())||c.charCodeAt()

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> (^_^)

说明

f=(s)=>{
    d={};        //list of indexes already swapped
    s=[...s];        //string to array, stolen from above ES6 answer
    for(i in s){
        b=s[i];        //keep a note of what we are swapping
        for(j in s)        //iterate over the array again
            if( i<j & !d[i] & c(s[j])==c(b) ){
                        //only pay attention after we pass i'th
                        //only swap if this char hasn't been swapped
                        //only swap if both chars in same 'category'
                d[j]=1;        //note that the latter char has been swapped
                s[i]=s[j];
                s[j]=b;
                break        //avoid swapping on the same 'i' twice
            }
    }
    return s.join('')        //return as string
}

1

Perl 6、56字节

{for "A".."Z","a".."z" ->@c {s:g/(@c)(.*?)(@c)/$2$1$0/}}

将字符串变量作为参数,并就地对其进行修改,以便在调用lambda之后,该变量包含结果。

比在Perl中更长的时间,因为:

  • 新的regex语法更冗长,例如,写出字符类看起来像<[A..Z]>而不是[A-Z]
  • 正则表达式是在编译时解析的一流源代码,如果字符串包含一个自包含的子正则表达式,则只能在运行时将字符串插入到它们中(即,您不能将字符串插入字符类中)。
  • Explict EVAL允许更大的灵活性,它要求高尔夫不友好的use MONKEY-SEE-NO-EVAL;实用性。

从正面看,@变量中的数组可以在正则表达式中直接引用,并被视为替代。


Perl 6、65字节

{reduce ->$_,@c {S:g/(@c)(.*?)(@c)/$2$1$0/},$_,"A".."Z","a".."z"}

功能版本(将结果输出为lambda的返回值)。


1

R,343字节

笨拙的R解决方案:

f <- function(x) {
        y=unlist(strsplit(x,""))
        z=data.frame(l=ifelse(y %in% letters,0,ifelse(y %in% LETTERS,1,2)),s=y)
        l <- list(which(z$l==0),which(z$l==1))
        v <- unlist(l)
        for(j in 1:2) for (i in seq(1,ifelse(length(l[[j]])%%2==1,length(l[[j]])-2,length(l[[j]])-1),2)) l[[j]][i:(i+1)] <- rev(l[[j]][i:(i+1)])
        z[v,] <- z[unlist(l),]
        return(z$s)
    }

f("D's mroyr, Ivam. I'e faardi I act'n od htta.")

# [1] I ' m   s o r r y ,   D a v e .   I ' m   a f r a i d   I   c a n ' t   d o   t h a t .

1

Python 2,181字节

比原本应该更长的时间,但是无论如何:

def F(s):
 for l in[i for i,c in enumerate(s)if c.isupper()],[i for i,c in enumerate(s)if c.islower()]:
  for a,b in zip(l[0::2],l[1::2]):s=s[:a]+s[b]+s[a+1:b]+s[a]+s[b+1:]
 print s

这首先创建两个列表:一个为大写字符的索引,一个为小写字符的索引。这些列表中的每一个都以成对索引循环,并切换这些索引处的字符。

我明天会打高尔夫球,但是现在该睡觉了


1

,28字节

Y[XLXU]aRy.`.*?`.y{Sa@0a@va}

将输入作为命令行参数。在线尝试!

说明

这是一个正则表达式解决方案,使用内置的正则表达式变量XL(小写字母`[a-z]`)和XU(大写字母`[A-Z]`)。

                              a is 1st cmdline arg; v is -1 (implicit)
Y[XLXU]                       Yank a list containing XL and XU into y
         y.`.*?`.y            Concatenate y, `.*?`, and y itemwise, giving this list:
                              [`[a-z].*?[a-z]`; `[A-Z].*?[A-Z]`]
       aR                     In a, replace matches of each regex in that list...
                  {        }  ... using this callback function:
                   Sa@0a@v     Swap the 0th and -1st characters of the match
                          a    and return the resulting string
                              Print (implicit)

当to的第二个参数R是一个列表时,替换将顺序执行;因此,小写替换和大写替换不会互相干扰。



1

AWK121个 129字节

BEGIN{FS=OFS=""}{for(a=1;a<=NF;a++){if($a~/[A-Z]/?U>0?p=U+(U=0):0*(U=a):$a~/[a-z]/?L>0?p=L+(L=0):0*(L=a):0>0){t=$a;$a=$p;$p=t}}}1

在线尝试!注意:链接有8个额外的字节以允许多行输入

用法是相当典型的,但是确实需要使用一个版本,AWK该版本接受一个空字符串作为字段分隔符(大多数版本,gawk但我很确定原始版本AWK会失败:()

这非常简单,因为它只是遍历每个字符并检查是否以前找到过这种情况之一。如果是这样,它将交换字符并重置检查的索引。在学习方面,我以前从未在赋值语句中使用过赋值语句AWK。由于某种原因,它从未出现过。:)

通过说BEGIN通过命令行分配或类似方法在块外分配OFS和FS,我也许可以节省几个字节,但是这种方式“更干净”。

添加TIO链接后,我发现我有一个转录错误,需要8个字节来修复:((我遗漏了0*(U=a):



1

Stax,18 个字节

âß:}\]ó☺æ■jφ╛jz/Φi

运行并调试

通用方法是基于正则表达式的。

  • 两次做:
  • 查找与的所有匹配项[a-z].*?[a-z]
  • 交换比赛中的第一个和最后一个字符。
  • 反转大小写。

1

R223163 字节 148字节

编辑:-60字节通过实现for循环

编辑:-15字节从朱塞佩

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));x=sum(l|1)%/%2;u[l[1:(x*2)]]=u[c(matrix(l,2)[2:1,1:x])]};cat(intToUtf8(u,T),sep="")

在线尝试!

通过测试字符是小写还是大写,将它们放置在矩阵中,将矩阵反转以提取交换格式的值来工作。然后用输出catscan(,'')如果代码多于一行,则请在线尝试使用该代码,因此在单行代码中会出现分号。


我在您的链接上得到168,但是这个高尔夫是163
朱塞佩

也带来了162
朱塞佩

可能有效;该x伪造账目聪明一点,但摆脱m=matrix了4个字节为好。
朱塞佩

scan(,'')问题呢?并减少“法律责任!” 在TIO中scan(,'')或以其他方式获取输入?
Sumner18


0

Java 7,117个字节

String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

编辑:只是注意到我有一个与@Leo的Retina答案类似的答案,即使我已经独立考虑过。

取消高尔夫:

String c(final String s) {
  String x = "([a-z])(.*?)([a-z])",
         y = "$3$2$1";
  return s.replaceAll(x, y).replaceAll(x.toUpperCase(), y);
}

测试代码:

在这里尝试。

class M{
  static String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

  public static void main(String[] a){
    System.out.println(c("lLEhW OroLd!"));
    System.out.println(c("rpGOZmaimgn uplRzse naC DEoO LdGf"));
    System.out.println(c("eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg"));
    System.out.println(c("NraWgCi: Nsas-eNEiTIsev rNsiTG!!"));
    System.out.println(c("(^_^)"));
    System.out.println(c("AWCTY HUOS RETP"));
    System.out.println(c("hwn oeesd acsp nawyya"));
    System.out.println(c("SpMycaeIesKyBorekn"));
    System.out.println(c("D's mroyr, Ivam. I'e faardi I act'n od htta."));
  }
}

输出:

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.