Fizz-Buzzify một chuỗi


21

Bạn sẽ được cung cấp một Chuỗi chỉ chứa các chữ cái của Bảng chữ cái tiếng Anh, cả chữ thường và chữ hoa (ASCII 65-90 và 97-122). Nhiệm vụ của bạn là xuất phiên bản Chuỗi Fizz-Buzzified.

Làm thế nào để Fizz-Buzzify một chuỗi?

  • Mỗi chữ cái có một chỉ mục chẵn trong bảng chữ cái tiếng Anh (bảng chữ cái phải là 1 chỉ mục a->1,b->2,...,z->26:) sẽ được chuyển thành fizznếu nó là chữ thường và FIZZnếu nó là chữ hoa ( f -> fizz, F -> FIZZ).

  • Mỗi chữ cái có một chỉ số lẻ trong bảng chữ cái tiếng Anh sẽ được chuyển thành buzznếu nó là chữ thường và BUZZnếu nó là chữ hoa ( e -> buzz, E -> BUZZ).

  • Chúng ta hãy có một ví dụ, để minh họa thuật toán, sử dụng chuỗi CodeGolf(khoảng trắng được thêm vào cho rõ ràng):

    "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)
    
  • Nếu nó thuận tiện hơn cho ngôn ngữ của bạn, bạn cũng có thể để các khoảng trống đơn giữa các nhóm ( fizz, buzz, FIZZ, BUZZ). Do đó, một kết quả như fizzBUZZbuzzbuzzcũng có thể được trả lại là fizz BUZZ buzz buzz. Các dải phân cách khác không được phép.


Các trường hợp thử nghiệm:

Đầu vào -> Đầu ra 

"trứng" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Đặt lại" -> "FIZZbuzzbuzzbuzzfizz"
"ATOM" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • Bất kỳ phương pháp tiêu chuẩn cho I / O đều có thể được sử dụng.

  • Lỗ hổng mặc định áp dụng.

  • Bạn chỉ được phép nhận đầu vào trong loại Chuỗi gốc của ngôn ngữ của mình. Áp dụng tương tự cho đầu ra.

  • Bạn có thể cho rằng đầu vào sẽ không trống.

  • Mã ngắn nhất tính bằng byte trong mọi ngôn ngữ sẽ thắng. Chúc may mắn và Fizz-Buzz!


Câu trả lời:


7

Than , 26 24 byte

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

Hãy thử trực tuyến! Ban đầu được lấy cảm hứng từ @CarlosAlejo. Chỉnh sửa: Đã lưu 2 byte bằng cách lặp qua các chữ cái fizz / buzz thay vì gán tạm thời. Giải trình:

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

Cuối cùng tôi đã hiểu giải pháp của bạn. Tôi nghĩ rằng đã Ordinal(i)trả về vị trí của ichar trong chuỗi ban đầu của nó, nhưng nó trả về giá trị ASCII (mã ký tự). Giải pháp rất thông minh, tôi vẫn cần cải thiện rất nhiều kỹ năng Than của mình!
Charlie

Cách bạn thực hiện việc này trong
Char

Trong đó mã hóa là 24 byte?
Ruslan

@Ruslan Trong trang mã tùy chỉnh của Char than .
Neil

6

C #, 92 byte

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

Được đăng thực tế cùng lúc nhưng bạn đã lưu một byte vào giải pháp của tôi bằng cách ra lệnh cho ternary theo cách ngắn hơn +1
TheLethalCoder

@TheLethalCoder ahh, xin lỗi về điều đó.
LiefdeWen

Không có gì để xin lỗi về chúng tôi đăng cách nhau 12 giây! Và của bạn là ngắn hơn!
TheLethalCoder

C # sẽ cho phép bạn sử dụng x%2trực tiếp như một boolean, mà không cần <1một phần? Nếu vậy, bạn có thể lưu một số byte theo cách đó.
Brian J

@BrianJ Không, nó không làm điều đó ngầm
LiefdeWen



4

Java (OpenJDK 8) , 105 100 94 91 90 byte

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

Hãy thử trực tuyến!

Nhiều golf, rất byte, vì vậy Java!

Rất được chơi bởi @KevinCruijssen 9 byte!


Tôi nghĩ rằng có lẽ các luồng sẽ làm cho điều này ngắn hơn, vì vậy tôi đã viết một. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Than ôi, nó dài 105 ký tự :( Nếu họ chỉ có thể thêm jointrực tiếp vào luồng hoặc tích hợp một toList, thực sự, mọi thứ hợp lý sẽ tốt.
Olivier Grégoire

1
In trực tiếp thay vì trả về Chuỗi ngắn hơn 6 byte và sử dụng getBytes()thay vì toCharArray()ngắn hơn 3 byte:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen

Bạn đã quên 3 byte bổ sung bằng cách thay đổi toCharArray()thành getBytes(). :)
Kevin Cruijssen

1
Tôi đã nhấp vào trước khi chỉnh sửa của bạn và không thấy nó sau đó;) Ngoài ra, tôi chỉ nghĩ về nó trước khi xem bình luận của bạn xD
Olivier Grégoire

3

JavaScript (ES6), 79 77 byte

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

Các trường hợp thử nghiệm


3

C #, 97 byte

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

Tôi không biết C #, nhưng bạn không thể sử dụngc%2>1?c>96?"fizz":"buzz":...
Ông Xcoder



3

Tiếng Anh đơn giản , 820 632 610 byte

Ông Xcoder đề nghị loại bỏ bẫy lỗi không cần thiết, giúp lưu 22 byte.

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.

Mã bị đánh cắp:

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 tiếng Anh đơn giản có sẵn tại github.com/Folds/english . IDE chạy trên Windows. Nó biên dịch thành mã x86 32 bit.


1
"Bạn có thể cho rằng đầu vào sẽ không trống." vì vậy tôi nghĩ bạn có thể thảIf the s is "", exit.
Ông Xcoder

@ Mr.Xcoder - Cảm ơn bạn. Hóa ra cái bẫy không cần thiết ngay cả khi s trống.
Jasper

2

Than , 40 36 byte

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

Hãy thử trực tuyến!

Giải trình:

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"

Một thay thế có cùng số byte:

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

Hãy thử trực tuyến! ( Phiên bản dài dòng )

  • 4 byte được lưu nhờ Neil!

1
Sử dụng Counthoặc Ordinaltương ứng thay vì Findđể tiết kiệm cho bạn một số byte.
Neil

Toàn bộ ifđược tính là một tuyên bố duy nhất vì vậy bạn không cần {}s. Tôi cũng đã lưu một byte bằng cách di chuyển Uppercasebên trong a Ternary: Hãy thử trực tuyến!
Neil

Vẫn tốt hơn, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχcho 26 byte. (Deverbosifier không thích phiên bản này.)
Neil

@Neil Cảm ơn bạn rất nhiều, nhưng tôi thậm chí không thể hiểu phiên bản cuối cùng của bạn, vì vậy tôi không thể tin vào nó, tôi sẽ cảm thấy vì đó không phải là câu trả lời của riêng tôi. Tôi rất vinh dự được bạn vượt qua nếu bạn viết bài của riêng mình. :-)
Charlie

2

> <> , 68 byte

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

Hãy thử trực tuyến , hoặc xem nó tại sân chơi cá !

(Nhưng hãy xem câu trả lời của Aaron ngắn hơn 13 byte!)

Nếu bạn không quen thuộc với> <>, sẽ có một con cá bơi qua mã ở dạng 2D và các cạnh được bọc. Các biểu tượng >, <, ^vthiết lập sự chỉ đạo của cá, /\là gương phản ánh nó, và ?có nghĩa là "làm chỉ lệnh kế tiếp nếu điều đầu trên stack là khác không, nếu không nhảy qua các hướng dẫn tiếp theo".

Trong dòng đầu tiên, cá lấy một ký tự đầu vào ( i); nếu nó -1 cho EOF, nó dừng lại ( :0(?;); nó nhận được mã char 2 ( :2%$); và nó đẩy 1 hoặc 0 trên ngăn xếp tùy thuộc vào việc mã số nhỏ hơn hoặc lớn hơn mã số của "^" ( "^"(). Ba dòng tiếp theo chuyển hướng cá đến chuỗi fizz / buzz bên phải, sau đó dòng cuối cùng in nó (một ocho mỗi ký tự) và gửi cá trở lại bắt đầu.


@Aaron, thật tuyệt! Tôi đã nghĩ về ý tưởng đó nhưng không thể thực hiện được. Bạn có muốn đăng nó như là giải pháp của riêng bạn?
Không phải là một cái cây

@Aaron, bạn cũng đã tìm thấy một lỗi trong TIO hoặc trình thông dịch trực tuyến - trong trình thông dịch đó !hoặc ?theo sau là khoảng trắng chỉ bỏ qua khoảng trắng, nhưng TIO đợi cho đến khi thứ không phải không gian tiếp theo bỏ qua
Không phải là cây

@Aaron, bài đăng của bạn tốt hơn nhiều so với của tôi, vì vậy bạn có thể tự đăng bài và tôi sẽ xóa bài này.
Không phải là một cái cây

!nên bỏ qua khoảng trắng AFAIK, nhưng trình thông dịch trực tuyến đệm không gian mã của nó với khoảng trắng, đó có thể là những gì bạn đang thấy
Aaron


2

> <> , 55 byte

Dựa trên câu trả lời của cây .

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

Thay vì đại diện cho 4 đầu ra có thể có trong mã, tôi chỉ đại diện cho các phiên bản viết hoa của chúng và thêm 32 vào mã ký tự để có được các trường hợp tương đương nhỏ.

Hãy thử trực tuyến!

Mã đã sửa đổi cho trình thông dịch trực tuyến , giúp đệm không gian mã của nó với các ô trống:

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

2

Perl5 , 50 + 1 byte

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

Tạo một danh sách 128 mục ánh xạ các ký tự ASCII thành từ mã thích hợp.


1

05AB1E , 22 byte

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

Hãy thử trực tuyến!

Giải trình

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

Giải pháp thay thế 22 byte

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


1

F # , 154 153 145 byte

đã lưu 1 9 byte nhờ @Mr. 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""

Hãy thử trực tuyến!


Tiết kiệm 1 byte bằng cách xóa khoảng trống giữa concat""trên dòng cuối cùng
Ông Xcoder


145 byte , xóa khoảng trắng không cần thiết
Ông Xcoder

Cảm ơn @ Mr.Xcoder Tôi vẫn quen với F # và khi thụt lề là đáng kể!

1
Và BTW, Chào mừng bạn đến với PPCG! Tôi hoàn toàn không biết F #, chỉ cần xóa nội dung để xem điều gì xảy ra :)
Ông Xcoder

1

Toán học, 134 byte

""<>{(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 byte

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

Nó giả định import static java.util.stream.Collectors.*;


1

q / kdb +, 48 byte

Dung dịch:

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

Ví dụ:

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"

Giải trình:

Khá đơn giản, lấy chuỗi đầu vào, chuyển thành các giá trị ASCII, tạo danh sách 1 hoặc 0 tùy thuộc vào số lẻ hay chẵn (gợi ý A = 65 = lẻ), sau đó sử dụng danh sách này để lập chỉ mục vào danh sách fizzbuzz. Truyền chuỗi này thành một chuỗi và sau đó đối với trường hợp đầu vào <91 (thấp hơn Z), chúng tôi áp dụng upperhàm để lấy a FIZZhoặc a BUZZ.

q được giải thích từ phải sang trái:

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

Tôi không biết ngôn ngữ này, nhưng bạn có thể xóa khoảng cách giữa mod2không?
Ông Xcoder

Thật không may, nó có thể được viết như mod[x;2]thể chúng ta không muốn có bất kỳ khoảng trắng nào - nhưng điều đó sẽ tăng thêm 1 byte!
streetster


1

Swift 4 , 144 135 byte

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

Chưa chơi gôn:

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

Những gì tôi đang làm là lặp qua từng ký tự trong chuỗi. Tôi chuyển đổi từng giá trị ASCII của nó, sau đó kiểm tra xem nó là số chẵn hay lẻ, rồi kiểm tra xem nó là chữ hoa hay chữ thường và xuất giá trị khớp từ vòng lặp. Sau đó tôi nối tất cả các phần tử của mảng kết quả thành một chuỗi và in nó.

Giải pháp này sử dụng Swift 4, vì vậy chưa có cách nào để dễ dàng kiểm tra trực tuyến.

Cảm ơn @ Mr.Xcoder đã tiết kiệm cho tôi 9 byte!


error: value of type 'String' has no member 'map', bởi vì một Chuỗi không được tự động chuyển đổi thành một danh sách trong thời gian chạy.
Ông Xcoder

Ngoài ra, dịch vụ đó không miễn phí. Bạn phải thêm một thẻ tín dụng để kiểm tra trình của bạn nếu tôi không sao chép-dán nó. Xem xét thay đổi dịch vụ thử nghiệm.
Ông Xcoder

Để làm cho nó hoạt động, bạn phải biến nó thành$0.characters.map{...}
Ông Xcoder

@ Mr.Xcoder Cloud 9 có một tầng miễn phí, trong đó bạn chỉ có một không gian làm việc riêng tư và không gian làm việc công cộng không giới hạn. Bạn sẽ có thể đăng nhập thông qua GitHub. Tôi chưa bao giờ chia sẻ bất cứ điều gì với nó vì vậy tôi không chắc nó có hoạt động không. Ngoài ra, tôi nên đề cập đến việc tôi đang sử dụng Swift 4, trong đó String phù hợp với Bộ sưu tập. Điều này có nghĩa là nó có chức năng bản đồ.
Caleb Kleveter

1
Như tôi có thể thấy, khai báo hàm cũ vẫn còn hiệu lực trong Swift 4 func f(s:String){...}, do đó, bạn có thể lưu 9 byte bằng cách sử dụng mã sau, sử dụng printthay vì return: pastebin.com/06kiiGaJ . Nếu nó không hoạt động, cho tôi biết.
Ông Xcoder

1

R, 150 123 108 byte

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

Phải ngắn hơn khi sử dụng ASCII? Nó ngắn hơn. Xem lịch sử chỉnh sửa cho câu trả lời cũ, được sử dụng letters.

Kiểm tra từng chữ cái cho (1) xem nó có phải là vốn hay không ( >91) và đó là a fizzhay a buzz.


-3

Java

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

6
Xin chào! Chào mừng đến với PPCG! Chúng tôi là một cộng đồng chơi gôn, vì vậy chúng tôi cố gắng lấy càng nhiều byte càng tốt - điều này bao gồm các byte trong tên biến và khoảng trắng, có thể được xóa khỏi câu trả lời của bạn. Ngoài ra, các bài nộp phải là một chương trình đầy đủ (bao gồm cả chương trình soạn sẵn public static void main) hoặc một chức năng. Hiện tại, của bạn là một đoạn.
Stephen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.