使字符串嗡嗡作响


21

您将得到一个仅包含英文字母的字母,小写和大写字母(ASCII 65-90和97-122)的字符串。您的任务是输出Fizz-Buzzified版本的String。

如何对字符串进行Fizz-Buzzify?

  • 如果英文字母中的每个字母均具有偶数索引(该字母必须为1索引:),则将其a->1,b->2,...,z->26转换fizz为小写字母和FIZZ大写字母(f -> fizz, F -> FIZZ)。

  • buzz如果英文字母的小写字母和BUZZ大写字母(e -> buzz, E -> BUZZ)都会变成英文字母。

  • 让我们举个例子,使用字符串CodeGolf(为清楚起见添加空格)来说明算法:

    "C o d e G o l f" ->  "BUZZ buzz fizz buzz BUZZ buzz fizz fizz"
     ^ ^ ^ ^ ^ ^ ^ ^
     1 1 0 1 1 1 0 0       (1 is odd index, 0 is even index)
    
  • 如果您的语言更方便,您也可以在组()之间留一个空格fizz, buzz, FIZZ, BUZZ。因此,类似的结果fizzBUZZbuzzbuzz也可以作为返回fizz BUZZ buzz buzz。不允许使用其他分隔符。


测试用例:

输入->输出 

“鸡蛋”->“ buzzbuzzbuzz”
“ CodeGolf”->“ BUZZbuzzfizzbuzzBUZZbuzzfizzfizz”
“重置”->“ FIZZbuzzbuzzbuzzfizz”
“ ATOM”->“ BUZZFIZZBUZZBUZZ”
“ yOuArEgReAt”->“ buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz”

  • 可以使用任何标准的I / O方法

  • 默认漏洞适用。

  • 仅允许以您的语言的本机String类型进行输入。输出同样如此。

  • 您可以假定输入将不为空。

  • 每种语言中以字节为单位的最短代码获胜。祝你好运和嘶嘶声!


Answers:


7

木炭26 24字节

FθF⎇﹪℅ι²buzz¦fizz⎇№αι↥κκ

在线尝试!最初的灵感来自@CarlosAlejo。编辑:通过遍历嘶嘶声/嗡嗡声而不是分配给临时字母,节省了2个字节。说明:

Fθ          Loop over the input (i = loop variable)
  F         Choose and loop over the word (k = loop variable)
   ⎇        Ternary
    ﹪℅ι²    If i has an odd ASCII code
    buzz
    fizz
            Print (implicit)
  ⎇         Ternary
   №αι      If i is an uppercase letter
    ↥κ      Uppercase(k)
     κ      k

我终于了解了您的解决方案。我以为Ordinal(i)i字符在其原始字符串中返回了char 的位置,但它返回了其ASCII值(字符代码)。非常聪明的解决方案,我仍然需要提高很多木炭技能!
查理

如何在仅24字节的木炭中执行此操作...
Erik the Outgolfer

这24个字节采用哪种编码?
Ruslan

@Ruslan在Charcoal的自定义代码页中
尼尔

6

C#,92个字节

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))

几乎在同一时间发布,但是您通过以更短的方式对三进制进行排序+1节省了一个字节
TheLethalCoder

@TheLethalCoder啊,对此感到抱歉。
LiefdeWen

抱歉,我们相距12秒!而你的矮一些!
TheLethalCoder

C#是否可以让您x%2直接用作布尔值,而无需该<1部分?如果是这样,您可能能够以这种方式保存一些字节。
Brian J

@BrianJ不,它不会隐式执行
LiefdeWen



4

的Java(OpenJDK的8) 105 100 94 91 90个字节

s->{for(int i:s.getBytes())System.out.print(i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ");}

在线尝试!

很多高尔夫球,非常字节,所以Java!

@KevinCruijssen非常喜欢9个字节!


我认为也许流可以使此过程更短,所以我写了一篇。s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));唉,这是105个字符长:(如果他们可以在加join直接在流或整合toList,实际上,任何明智的将是一件好事。
奥利维尔·格雷瓜尔

1
直接打印而不是返回字符串要短6个字节,而使用getBytes()替代而不是toCharArray()s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
要再返回

通过更改toCharArray()为,您忘记了额外的3个字节getBytes()。:)
Kevin Cruijssen

1
我在您所做的编辑之前单击过,之后没有看到它;)另外,我只是在考虑您的评论之前就考虑过xD
OlivierGrégoire17年

3

JavaScript(ES6),79 77字节

s=>s.replace(/./g,c=>['BUZZ','buzz','FIZZ','fizz'][parseInt(c,36)%2*2|c>'Z'])

测试用例


3

C#,97个字节

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))

我不懂C#,但您不能使用c%2>1?c>96?"fizz":"buzz":...
Xcoder先生17年



3

纯英文的820 632 610个字节

Xcoder先生建议消除不必要的错误陷阱,该陷阱可节省22个字节。

A fizzy string is a string.
To convert a s string to a z fizzy string:
Clear the z.
Slap a r rider on the s.
Loop.
If the r's source's first is greater than the r's source's last, exit.
Put the r's source's first's target in a b byte.
If the b is not any letter, bump the r; repeat.
Put "FIZZ" in a t string.
If the b is d, put "BUZZ" in the t.
If the b is _, lowercase the t.
Append the t to the z.
Bump the r.
Repeat.
To decide if a b byte is d:
Put the b in a n number.
If the n is odd, say yes.
Say no.
To decide if a b byte is _:
Put the b in a c byte.
Lowercase the c.
If the c is the b, say yes.
Say no.

取消程式码:

A fizzy string is a string.

To convert a string to a fizzy string:
  Clear the fizzy string.
  Slap a rider on the string.
  Loop.
    If the rider's source's first is greater than the rider's source's last, exit.
    Put the rider's source's first's target in a byte.
    If the byte is not any letter, bump the rider; repeat.
    Put "FIZZ" in another string.
    If the byte is odd, put "BUZZ" in the other string.
    If the byte is lower case, lowercase the other string.
    Append the other string to the fizzy string.
    Bump the rider.
  Repeat.

To decide if a byte is odd:
  Put the byte in a number.
  If the number is odd, say yes.
  Say no.

To decide if a byte is lower case:
  Privatize the byte.
  Lowercase the byte.
  If the byte is the original byte, say yes.
  Say no.

普通英语IDE可以在github.com/Folds/english上找到。IDE在Windows上运行。它编译为32位x86代码。


1
“您可以假定输入将不会为空。” 所以我认为你可以放弃If the s is "", exit.
Xcoder先生

@ Mr.Xcoder-谢谢 事实证明,即使s为空,也不需要陷阱。
贾斯珀

2

木炭40 36字节

Fθ¿№αι¿﹪⌕αι²FIZZ¦BUZZ¿﹪⌕βι²fizz¦buzz

在线尝试!

说明:

Fθ                                      for every char i in the input:
   ¿№αι                                    if i is found in the uppercase alphabet
       ¿﹪⌕αι²                             if i is an even uppercase char
              FIZZ¦BUZZ                    print "FIZZ" or else "BUZZ"
                       ¿﹪⌕βι²             if i is an even lowercase char
                              fizz¦buzz    print "fizz" or else "buzz"

具有相同字节数的替代方法:

AfizzφAbuzzχFθ¿№αι¿﹪⌕αι²↥φ↥χ¿﹪⌕βι²φχ

在线尝试!详细版本

  • 多亏了尼尔,节省了4个字节!

1
分别使用CountOrdinal代替,Find以节省一些字节。
尼尔

整个都if算作一个语句,因此您不需要{}。我还通过移动Uppercase里面的a来节省了一个字节Ternary在线尝试!
尼尔

更好的Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχ是26个字节。(Deverbosifier不喜欢这个版本。)
Neil,

@Neil非常感谢,但我什至不明白您的上一版本,因此我无法相信它,我会觉得这不是我自己的答案。如果您写自己的帖子,我很荣幸被您淘汰。:-)
查理(Charlie)

2

> <>,68个字节

<vv?("^"$%2:;?(0:i
v\?\"zzif"
v \\"zzub"
v \ "ZZIF"
v  \"ZZUB"
\oooo

在线尝试,或在鱼游乐场观看!

(但是请看亚伦的答案,该答案要短13个字节!)

如果您不熟悉> <>,​​那么会有一条鱼在2D代码中游走,并且边缘会缠绕。的符号><^v设定鱼的方向,/并且\都是镜子,反映它,并?表示“做下一个指令,如果堆栈顶部的事情是不为零,否则跳过下一条指令”。

在第一行中,鱼使用输入字符(i);如果EOF为-1,则停止(:0(?;);它得到charcode mod 2(:2%$); 并根据字符代码是否小于或大于“ ^”("^"()的字符将1或0压入堆栈。接下来的三行将鱼重定向到正确的嘶嘶声/嗡嗡声字符串,然后最后一行将其打印出来(o每个字符一个),并将鱼发回起点。


@Aaron,太好了!我确实想到了这个主意,但无法使它生效。您想将其发布为您自己的解决方案吗?
不是一棵树

@Aaron,您还在TIO或在线解释器中发现了一个错误-在该解释器中,!或者?后面跟空格只是跳过了空格,但是TIO等待直到下一个非空格的事情要跳过…
不是树

@Aaron,您的提交比我的提交要好得多,因此您可以自己发布它,我将删除它。
不是一棵树

!应该跳过空格AFAIK,但是在线解释器会在代码空间中填充空格,这可能是您所看到的
Aaron


2

> <>,55个字节

基于不是树的答案

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"!
^>{:}" "*+ol1=?

我只代表它们的大写版本,而不是代表代码中的4个可能的输出,并在字符代码中加上32以获取小写字母的等效项。

在线尝试!

在线解释器的修改后的代码,该代码用空单元格填充其代码空间:

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"     !
^>{:}" "*+o l1=?

2

Perl5,50 + 1字节

perl -nE'say+((FIZZ,BUZZ)x48,(fizz,buzz)x16)[unpack"C*",$_]'

创建一个128个项目的列表,该列表将ASCII字符映射到正确的代码字。


1

05AB1E,22字节

v‘FIZZÒÖ‘#yÇÉèAyåil}J?

在线尝试!

说明

v                        # for each char y of input string
 ‘FIZZÒÖ‘#               # push the list ['FIZZ','BUZZ']
          yÇÉ            # check if y has an odd character code
             è           # use this to index into the list
              Ayåi       # if y is a member of the lowercase alphabet
                  l}     # convert to lowercase
                    J?   # unwrap from list and print

替代22字节解决方案

ÇÉAISå·+‘FIZZÒÖ‘#Dl«èJ


1

F# 154个 153 145字节

@Mr节省了1 9个字节。Xcoder

let g s=
 Seq.map(fun c->match int c with
|x when x>64&&x<91->if x%2=0 then"FIZZ"else"BUZZ"
|x->if x%2=0 then"fizz"else"buzz")s
|>String.concat""

在线尝试!


删除最后一行之间的空格concat""以节省1个字节
Xcoder先生,2017年


145个字节,删除不必要的空白
Xcoder先生,2017年

谢谢@ Mr.Xcoder我仍然习惯于F#,当缩进很重要时!

1
顺便说一句,欢迎来到PPCG!我根本不了解F#,只是删除了一些东西以查看会发生什么:)
Xcoder先生,2017年

1

Mathematica,134个字节

""<>{(s=Max@ToCharacterCode@#;If[96<s<123,If[EvenQ@s,c="fizz",c="buzz"]];If[64<s<91,If[EvenQ@s,c="FIZZ",c="BUZZ"]];c)&/@Characters@#}&

1

Java 8,89字节

s->s.chars().mapToObj(i->i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ").collect(joining());

它假设 import static java.util.stream.Collectors.*;


1

q / kdb +,48个字节

解:

raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$

例子:

q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"egg"
"buzzbuzzbuzz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"CodeGolf"
"BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"Reset"
"FIZZbuzzbuzzbuzzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"ATOM"
"BUZZFIZZBUZZBUZZ"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"yOuArEgReAt"
"buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

说明:

非常简单,将输入字符串转换为ASCII值,创建一个1或0的列表,具体取决于它是奇数还是偶数(提示A = 65 = odd),然后使用该列表将索引索引为fizzbuzz。将其强制转换为字符串,然后在输入<91(小于Z)的情况下应用upper函数获取a FIZZ或a BUZZ

q从右到左解释:

raze{@[string `fizz`buzz x mod 2;where x < 91;upper]}"i"$ / ungolfed version
                                                     "i"$ / cast input to ascii values
    {                                               }     / anonymous lambda
     @[                         ;            ;     ]      / apply 
                                              upper       / upper-case
                                 where x < 91             / indices where input is less than 91 (ie uppercase)
                         x mod 2                          / returns 0 if even and 1 if odd
              `fizz`buzz                                  / 2 item list, which we are indexing into
       string                                             / cast symbols to strings `buzz -> "buzz"
raze                                                      / raze (merge) list into a single string

我不知道这种语言,但你可以删除之间的空间mod2
Xcoder先生17年

不幸的是,可以这样写,就mod[x;2]好像我们不想使用任何空格一样-但是最后多了1个字节!
streetster


1

迅速4144个 135字节

func f(s:String){print(s.map{let d=Int(UnicodeScalar("\($0)")!.value);return d%2<1 ?d>90 ?"fizz":"FIZZ":d>90 ?"buzz":"BUZZ"}.joined())}

未打高尔夫球:

func f(s:String){
    print(
        s.map{
            let d=Int(UnicodeScalar("\($0)")!.value)
            return d%2 < 1 ? d > 90 ? "fizz" : "FIZZ" : d > 90 ? "buzz" : "BUZZ"
        }.joined()
    )
}

我正在做的是遍历字符串中的每个字符。我将每个值转换为其ASCII值,然后检查它是偶数还是奇数,然后检查它是大写还是小写,并从循环中输出匹配的值。然后,我将结果数组的所有元素连接到一个字符串中并进行打印。

该解决方案使用Swift 4,因此尚无法轻松在线对其进行测试。

感谢@ Mr.Xcoder为我节省了9个字节!


error: value of type 'String' has no member 'map',因为在运行时不会将字符串自动转换为列表。
Xcoder先生17年

另外,该服务不是免费的。如果我不复制粘贴,则必须添加信用卡以测试您的提交。考虑更改测试服务。
Xcoder先生17年

为了使其正常工作,您必须将其变成$0.characters.map{...}
Xcoder先生,2017年

@ Mr.Xcoder Cloud 9具有免费层,在该层中,您只有一个私有工作区和无限个公共工作区。您应该能够通过GitHub登录。我从来没有与它分享过任何东西,所以我不确定它是否会起作用。另外,我应该提到我正在使用Swift 4,其中String符合Collection。这意味着它具有地图功能。
卡勒布·克利夫特

1
如我所见,旧的函数声明在Swift 4中仍然有效,例如func f(s:String){...},因此您可以使用以下代码(print而不是returnpastebin.com/06kiiGaJ)保存9个字节。如果它不起作用,请告诉我。
Xcoder先生17年

1

R,150 123 108个字节

i=ifelse
cat(i(sapply(el(strsplit(scan(,''),'')),utf8ToInt)>91,i(x%%2,'buzz','fizz'),i(x%%2,'BUZZ','FIZZ')))

使用ASCII必须更短吗?它更短。有关旧答案的信息,请参见编辑历史记录letters

检查每个字母是否为(1)是否为大写(>91)以及为a fizz还是a buzz


-3

爪哇

str.chars().forEach(ch ->{
    if(ch >= 97)
        strb.append(ch % 2 == 0 ? "fizz" : "buzz");
    else
        strb.append(ch % 2 == 0 ? "FIZZ" : "BUZZ");
});

6
你好!欢迎来到PPCG!我们是一个高尔夫社区,因此我们尝试提取尽可能多的字节-这包括变量名和空格中的字节,可以从您的答案中删除它们。此外,提交的内容必须是完整程序(包括样板public static void main)或函数。目前,您的片段。
斯蒂芬
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.