提示


41

对于今天的挑战,您必须编写一个可替换字符串大小写的程序或函数。但是,您必须忽略非字母字符。这意味着每个字母字符必须有一个不同的情况下,比前面下面的字母字符。例如,这比每隔一个字母大写更复杂。如果您使用诸如

hello world

并将所有其他字符转换为大写,您将获得:

hElLo wOrLd

如您所见,小写字母o后面是小写字母w。这是无效的。相反,您必须忽略空格,从而得到以下结果:

hElLo WoRlD

所有非字母字符必须保持相同。只要输出始终交替,输出就可以以大写或小写开头。这意味着以下内容也是可接受的输出:

HeLlO wOrLd

不管输入大小写如何,您的程序都应该可以工作。

输入字符串将只包含可打印的ASCII,因此您不必担心不可打印的字符,换行符或unicode。您的提交可以是完整程序,也可以是函数,并且您可以采用任何合理的格式进行输入和输出。例如,函数自变量/返回值,STDIN / STDOUT,读/写文件等。

例子:

ASCII                                   ->  AsCiI
42                                      ->  42
#include <iostream>                     ->  #InClUdE <iOsTrEaM>
LEAVE_my_symbols#!#&^%_ALONE!!!         ->  lEaVe_My_SyMbOlS#!#&^%_aLoNe!!!
PPCG Rocks!!! For realz.                ->  PpCg RoCkS!!! fOr ReAlZ.
This example will start with lowercase  ->  tHiS eXaMpLe WiLl StArT wItH lOwErCaSe
This example will start with uppercase  ->  ThIs ExAmPlE wIlL sTaRt WiTh UpPeRcAsE
A1B2                                    ->  A1b2

由于这是,因此会出现标准漏洞,并且以字节为单位的最短答案会成功!


32
唉,我刚刚意识到这米姆由xD
β衰变

@BetaDecay哈哈哈,那不是我的意图。只是不幸的时机。我虽然将其视为一种迷你聊天挑战,但我喜欢它背后的想法,因为它比看起来要难得多。
DJMcMayhem

4
下一个挑战是打印一张ascii cowsay
海绵宝宝

1
该死!我刚刚为此编写了一个CJam脚本(就像昨天一样)并将其删除。
硕果累累

2
标题或至少使用厄运企鹅或Sporks的企鹅的标题可能有些遗漏。
伊恩(Ian)

Answers:


19

JavaScript(ES6),66 63字节

从大写开始。

s=>s.replace(/[a-z]/gi,c=>c[`to${(s=!s)?'Low':'Upp'}erCase`]())

测试用例


正是我要怎么做。我我可以看到您可以在其中保存几个字节的地方,但是我在手机上,因此无法正常测试。
毛茸茸的

是的,我建议使用三元组。
毛茸茸的

1
s=!s技巧如何起作用?
Kritixi Lithos

7
@KritixiLithos由于s是输入字符串,!s第一计算结果为false(除非输入字符串是空的,在这种情况下,评估为true- ,但一个空字符串无论如何也不会产生任何匹配)。之后,它变成一个标准的布尔运算,在false和之间交替true。另外,我们现在不介意丢失的内容,s因为它已经用于feed了.replace()
Arnauld

3
@MayorMonty不幸的是,那会匹配一些符号。诸如之类的输入"A[I"将失败。
Arnauld

12

05AB1E11 8字节

码:

lvyJ¤aiš

使用05AB1E编码。在线尝试!

说明:

l           # Lowercase the input
 vy         # For each element..
   J        #   Join the entire stack into a single string
    ¤a      #   Check if the last character is alphabetic
      iš    #   If true, swapcase the entire string

我喜欢我盲目尝试的方法,知道我必须超过11个字节。然后将其从17字节慢慢变为11字节,然后意识到lvy¾Fš}Da½J这正是您已经拥有的._。
魔术章鱼缸

1
@carusocomputing有一个更简单的8字节解决方案:p
Adnan

4
哦,是的,超级容易哈哈。
魔术章鱼缸

2
@Octopus对此有一些讨论,但是我同时使用了“ osable”和“ osabie”。
阿德南

1
@octopus我真的是说Oh-Five-Ay-Bee-One-Eee,我不是一个有创造力的人。
Magic Octopus Urn

10

GNU Sed,33岁

  • @TobySpeight节省了5个字节

分数包括+1,表示要进行-r标记。

s/([a-z])([^a-z]*.?)/\U\1\L\2/gi

在线尝试


8

果冻,13个字节

nŒsTm2
ŒlŒuǦ

在线尝试!

这个怎么运作

ŒlŒsǦ  Main link. Argument: s (string)

Œl      Cast to lowercase.
    Ǧ  At indices returned by the helper link...
  Œu        apply uppercase.


nŒsTm2      Helper link. Argument: s (string)

 Œs         Apply swapcase to s.
n           Perform vectorizing not-equal comparison.
   T        Compute the truthy indices.
    m2      Select every other one, starting with the first.

7

Japt16 14字节

r"%l"_m"uv"gT°

在线尝试!

说明

r              // RegEx replace input
 "%l"          // [A-Za-z] as first arg to replace
     _         // created function Z=>Z as second arg to replace
       "uv"gT° // alternates "u" & "v"
      m        // map Z to either "u" upper or "v" lower

非常好!您可以删除,。除非是数字(即[12]),否则Japt会知道它们是不同的项目。我相信您也可以删除&1
奥利弗·

谢谢@obarakon。Japt文档很少。
鲍威尔

感谢您使用Japt。随时在Japt聊天室中提出问题,建议等。还有Japt thread技巧。:)
奥利弗(Oliver)

_m"uv"gT°真好 我只是建议。
奥利弗·

@obarakon是的,我在聊天中看到ETH在哪里回答了您的问题,这让我尝试了一些事情。
鲍威尔


5

爱丽丝,18字节

/olZlYuN
@iy.u..//

在线尝试!

说明

该程序遵循一个鲜为人知的模板,该模板完全以序数模式运行。该代码的线性化版本为:

il.l.uN.YuZyo@

代码说明:

i - push input onto stack            ["Hello world!"]
l - convert to lowercase             ["hello world!"]
. - duplicate                        ["hello world!", "hello world!"]
l - convert to lowercase (should be no-op, but avoids what seems to be a bug in the TIO implementation)
. - duplicate again                  ["hello world!", "hello world!", "hello world!"]
u - convert to uppercase             ["hello world!", "hello world!", "HELLO WORLD!"]
N - difference between sets          ["hello world!", "helloworld"]
. - duplicate reduced string         ["hello world!", "helloworld", "helloworld"]
Y - unzip (extract even positions)   ["hello world!", "helloworld", "hlool", "elwrd"]
u - convert to uppercase             ["hello world!", "helloworld", "hlool", "ELWRD"]
Z - zip evens back into string       ["hello world!", "helloworld", "hElLoWoRlD"]
y - perform substitution             ["hElLo WoRlD!"]
o - output                           []
@ - terminate

如果不使用l重复项,则之后的堆栈N["helloworld", "helloworld"]。我强烈怀疑这是一个错误。


5

C(tcc)60 57 56字节

感谢DigitalTrauma注意到,位5是ASCII大写/小写字母的唯一区别。

特别感谢zch打了三个字节。

从RJHunter的想法再节省一个字节

l;f(char*s){for(;*s=isalpha(*s)?*s&95|++l%2<<5:*s;s++);}

在线尝试!


打了一些高尔夫球,然后对其进行了修改,以便可以在所有gcc,tcc和clang上使用。FWIW,gcc将字符串文字放在只读存储器中,所以我strdup()以前在测试驱动程序代码中获取指向读写存储器的指针。
Digital Trauma

1
@DigitalTrauma对此表示感谢。我应该认识到第5位是上下之间的差异。不错!
cleblanc

我也尝试过使该版本具有递归性,但无法使其更短。
Digital Trauma

您可以用替换内部条件*s&~32|++l%2<<5以节省3个字节。
zch

由于输入保证为可打印的ASCII,因此可以替换&~33&95以保存另一个字节。
RJHunter

4

Java 8,99字节

a->{String r="";int i=0;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?i++%2<1?c|32:c&~32:c);return r;}

说明:

在这里尝试。

a->{                          // Lambda with char-array parameter and String return-type
  String r="";                //  Result-String
  int i=0;                    //  Flag for alteration
  for(int c:a)                //  Loop over the characters of the input
    r+=(char)                 //   And append the result-String with the following (converted to char):
      (c>64&c<91|c>96&c<123?  //    If it's a letter:
       i++%2<1?               //     And the flag states it should be lowercase:
        (c|32)                //      Convert it to lowercase
       :                      //     Else (should be uppercase):
        (c&~32)               //      Convert it to uppercase
      :                       //    Else:
       c);                    //     Simply append the non-letter character as is
                              //  End of loop (implicit / single-line body)
  return r;                   //  Return result-String
}                             // End of method

我无法缩短它,但是您可能可以使用(c+"").matches("[A-Za-z]")Character.isLetter(c)保存字节。
TheLethalCoder

@TheLethalCoder两者都比c>64&c<91|c>96&c<123不过更长。而且由于int无论如何我都会使用Character.toUpperCase(...)Character.toLowerCase(...)零件(这些:(char)(c&~32)(char)(c|32)),因此我怀疑是否可以使用其中任何一个将其缩短。
凯文·克鲁伊森

1
我认为您将
无能为力

@TheLethalCoder好的。:)在某些情况下,第一种方法可能会对其他挑战有所帮助,但是对于这种挑战而言,它的长度要短一些。不管怎么说,还是要谢谢你。
凯文·克鲁伊森

a->{String r="";int i=0,f=32;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?(f=~f):c);return r;} ??
罗曼·格拉夫(RomanGräf)

4

Ruby,57 55 47 41字节

字节数包括用于命令行选项的两个字节。
像这样运行它:$ ruby -p0 alternate_case.rb <<< "some input"

gsub(/\p{L}/){($&.ord&95|32*$.^=1).chr}

使用该p0选项,一次就消耗了整个输入,而魔术全局$.变量增加为1。此后在0和1之间切换,并用于保持状态。

适用于多行输入; 在线尝试!

感谢Ventero出色的输入-请查看评论以获取详细信息。


1
伙计,如果不是因为$.每次gets调用都会自动增加,带有-p标志的完整程序会更短……
Value Ink

1
1&$.+=1允许您删除括号。为了完整起见,还有另一个全局整数-不幸的是,它是只读的:$$

1
关于命令行标志的另一件事:-p0使解释器一次读取所有可用的输入-因此您的代码仅被调用一次,从而允许您自由使用$.。将其与指定时gsub隐式操作的事实相结合,可以使整个程序大大缩短:标记为48个字符,标记为2 个字符。$_.gsub!-pgsub(/[a-z]/i){[$&.upcase,$&.downcase][1&$.+=1]}p0

1
最后,我保证:)一旦使用完-p0,您实际上可以在$.来回翻转的方式中保存更多的字符:由于现在可以保证在1调用代码时就可以使用了$.^=1

2
事实证明,我撒谎了,我还有另一句话:D由于保证输入仅包含可打印的ASCII,因此我们可以在正则表达式中使用Ruby对Unicode类别的支持:/\p{L}/(Unicode类别Letter)比短一个字符/[a-z|/i

3

Brachylog,25个字节

{ḷ|ụ}ᵐ.{ḷ∈Ạ&}ˢ¬{s₂{∈Ạ}ᵐ}∧

在线尝试!

这既漫长又缓慢。

说明

{   }ᵐ.                       The Output is the result of mapping on each char of the Input:
 ḷ                              Lowecase the char
  |                             Or
   ụ                            Uppercase the char
       {    }ˢ                In the Ouput, select the chars that:
        ḷ∈Ạ&                    when lowercased are in "abc...xyz" (ie are letters)
              ¬{       }∧     In that new string, it is impossible to find:
                s₂              a substring of 2 consecutive chars
                  {∈Ạ}ᵐ         where both of them are in the lowercase alphabet

3

MATL16 15字节

Xktkyy-f2L))5M(

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

说明

考虑输入“ hello world”

Xk    % To upper case
      % STACK: 'HELLO WORLD'
t     % Duplicate top element
      % STACK: 'HELLO WORLD', 'HELLO WORLD'
k     % To lower case
      % STACK: 'HELLO WORLD', 'hello word'
yy    % Duplicate top two elements
      % STACK: 'HELLO WORLD', 'hello word', 'HELLO WORLD', 'hello word'
-     % Difference (of code points; element-wise)
      % STACK: 'HELLO WORLD', 'hello word', [-32 -32 -32 -32 -32 0 -32 -32 -32 -32 -32]
f     % Indices of nonzeros
      % STACK: 'HELLO WORLD', 'hello word', [1 2 3 4 5 7 8 9 10 11]
2L)   % Keep only even-indexed values (*)
      % STACK: 'HELLO WORLD', 'hello word', [2 4 7 9 11]
)     % Reference indexing (get values at indices)
      % STACK: 'HELLO WORLD', 'elwrd'
5M    % Push (*) again
      % STACK: 'HELLO WORLD', 'elwrd', [2 4 7 9 11]
(     % Assignment indexing (write values at indices). Implicit display
      % STACK: 'HeLlO wOrLd

'


3

Perl 6的 32  30个字节

{S:g/<:L><-:L>*<:L>?/$/.tclc()/}

试试吧

{S:g{<:L><-:L>*<:L>?}=$/.tclc}

试试吧

展开:

{  # bare block lambda with implicit parameter 「$_」

  S            # string replace (not in-place) implicitly against 「$_」

  :global

  {

    <+ :L >    # a letter
    <- :L >*   # any number of non-letters
    <+ :L >?   # an optional letter

  }

  =

  $/.tclc()    # uppercase the first letter, lowercase everything else
}

3

q / kdb +,51 42 38字节

解:

{@[x;;upper]1#'2 cut(&)x in .Q.a}lower

例:

q){@[x;;upper]1#'2 cut(&)x in .Q.a}lower"hello world"
"HeLlO wOrLd"

笔记:

.Q.a        // abcde...xyz lowercase alphabet
(&) x in    // where, returns indices for where x (hello world) is an alpha
2 cut       // splits list into 2-item lists
1#'         // takes first item of each 2-item list; ie the indices to uppercase
@[x;;upper] // apply (@) upper to x at these indices

2

V17,13字节

VUÍშáü$©/ì&

在线尝试!

验证所有测试用例!

HeXdUmP:

00000000: 5655 cde1 83a8 e1fc 24a9 2fec 26         VU......$./.&

说明:

这使用了压缩的正则表达式 ™️,因此在解释它之前,让我们扩展正则表达式:

:%s/\v\a.{-}(\a|$)/\l&

VU转换一切为大写。然后我们运行:

:%                      " On every line:
  s/\v                  "   Substitute:
      \a                "     A letter
        .{-}            "     Followed by as few characters as possible
            (\a|$)      "     Followed by either another letter or an EOL
                  /     "   With:
                   \l   "     The next character is lowercased
                     &  "     The whole text we matched

旧的/更有趣的答案:

:se nows
Vuò~h2/á


2

CJam26 24字节

qeu{_'[,65>&,T^:T{el}&}%

在线尝试!

说明

q         e# Read all input.
eu        e# Uppercase it.
{         e# For each character:
 _        e#  Duplicate it.
 '[,65>&  e#  Set intersection with the uppercase alphabet.
 ,        e#  Length (either 0 or 1 in this case).
 T^:T     e#  XOR with T (T is initially 0), then store the result back in T.
 {el}&    e#  If The result of the XOR is true, lowercase the character.
}%        e# (end for)

2

Pyth,11个字节

srR~xZ}dGrZ

在这里尝试

说明

              # Z = 0; Q = eval(input())
srR~xZ}dGrZQ  # Auto-fill variables
         rZQ  # lowercase the input
 rR           # Apply the r function to each letter of the input with
   ~xZ}dG     # ... this as the other argument
   ~          # use the old value of the variable Z, then update it with the value of ...
    xZ        # Z xor ...
      }dG     # the variable d is a lowercase letter
              # because of how mapping works in pyth, d will contain the current letter
              # This causes Z to flip between 0 and 1, alternately upper and lower casing
              # the current character if it is a letter

2

PowerShell,86字节

-join($args[0]|%{if($_-match"[a-z]"-and($i=!$i)){"$_".toupper()}else{"$_".tolower()}})

输入是一个[char[]]数组。

代码中的注释以供解释

# Join the array of string and char back together.
-join
    # Take the first argument and pass each element ([char]) down the pipe. 
    ($args[0]|%{
        # Check if this is a letter. Second condition is a boolean that changes at every pass 
        # but only if the current element is a letter. If not the condition never fires
        if($_-match"[a-z]"-and($i=!$i)){
            # Change the character to uppercase
            "$_".toupper()
        }else{
            # Output the character to lowercase. 
            # Special characters are not affected by this method
            "$_".tolower()
        }
    })

2

Haskell,105 83 + 2 4 + 1个分隔符字节= 108 86 88字节

import Data.Char
f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
_#l=l

功能是(1#),以小写开头。在线尝试!

可悲的是,这比Java和C#的答案更长。这要感谢ØrjanJohansen通过将三行合并为一个来节省22个字节!


2
只见它需要那些长期进口功能,因此我甚至没有尝试......但这是一个有点多,您可以合并一些行:f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
与Orjan约翰森

很抱歉,但我认为1#这不能算作匿名功能。以我的理解,一个人应该能够将一个匿名函数绑定到一个标识符,但是例如f=1#将无法工作。相反,您需要该部分(1#)的+2个字节。我们在Haskell的高尔夫社区准则中也隐含了这一点,尽管也许应该修改这些准则以明确提及这种情况。
Laikoni '17

@Laikoni好的,答案已更新
通用显示名称

2

Google表格,264字节

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),CHAR(CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))+MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32),MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1))))

这是一个很大的混乱,但如果将其扩展出来,它会容易一些:

=ArrayFormula(
  JOIN(
    "",
    IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),
      CHAR(
        CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))
        +
        MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32
      ),
      MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)
    )
  )
) 

伪逻辑将像这样运行:

For each character {                                    // ArrayFormula()
  If (character is a letter) {                          // REGEXMATCH(MID())
    Return CHAR(                                        // CHAR()
      CODE(UPPER(letter))                               // CODE(UPPER(MID()))
      +
      If (nth letter found and n is odd) {32} else {0}  // MOD(LEN(REGEXREPLACE(LEFT())))
    )
  } else {
    Return character                                    // MID()
  }
}

2

Perl 5,24个字节

23个字节+ 1个字节(用于)-p

感谢@Dada提供-2个字节。

s/\pl/--$|?uc$&:lc$&/eg

在线尝试!


整齐。\pl而不是[a-z]2字节的话:)
Dada

@Dada,我真的不知道!我怎么不知道!谢谢!
Dom Hastings

我想我是从Ton Hospel那里学到的,然后我不时地使用它(实际上,我经常会忘记它,[a-z]而是使用它!)。如果您想知道,它来自perlrecharclass ;)
Dada


1

C 64字节

B;R(char *s){for(;*s=isalpha(*s)?(B=!B)?*s|=32:*s&=~32:*s;s++);}

利用ascii编码,其中大小写字母的偏移量为0x20。


您不需要在char与之间的''空格*s
cleblanc

这看起来与@cleblanc的答案非常相似。
Digital Trauma

我在@cleblanc的帖子使用toUpper()和toLower()时发布了它。
user230118

1
我的意见暗示该方法是在18:29:34Z。 cleblanc对此进行编辑的时间是18:37:36Z。您的答案发布在18:38:21Z。因此,我猜想cleblanc的回答是在您发帖之前不到一分钟。您的回答与我的建议非常相似,但是我想这就是代码高尔夫的本质-通常,使用同一语言的解决方案会收敛到同一件事-因此,我会让它滑动:)
Digital Trauma

1

视网膜,32字节

T`l`L
01T`L`l`[A-Z][^A-Z]*[A-Z]?

在线尝试!

首先将输入转换为大写,然后将输入分组为包含最多两个大写字母的匹配项。如果最后一个字母没有一对,则它仅包含一个字母的唯一时间。然后,将这些匹配项的第一个字母小写。

01第二阶段,粗略地翻译:不要更改此阶段基于匹配数的行为,但仅将更改应用到每场比赛的第一个字符。


1

PHP 5,54字节

<?=preg_filter('/\pL/e','($0|" ")^a^aA[$i^=1]',$argn);

1

C#,100字节

s=>{var r="";int m=0;foreach(var c in s)r+=char.IsLetter(c)?(char)(++m%2>0?c|32:c&~32):c;return r;};

1

Groovy,79个字节

{x=0;it.toUpperCase().collect{(it==~/\w/)?x++%2?it:it.toLowerCase():it}.join()}

1

Python 3,192字节

x=list(input())
s=[]
for i in x[1::2]:
 s.append(i)
 x.remove(i)
s.reverse()
while len(x)<len(s):
 x.append("")
while len(x)>len(s):
 s.append("")
for i in range(len(x)):
 print(end=x[i]+s[i])

在线尝试!


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.