Fizz-Buzzify струна


21

Вам буде дано рядок, що містить лише літери англійського алфавіту, як малі, так і великі (ASCII 65-90 та 97-122). Ваше завдання - вивести Fizz-Buzzified версію рядка.

Як розпалити струну?

  • Кожна літера, що має рівний індекс в англійському алфавіті (алфавіт повинен бути 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"


Відповіді:


7

Вугілля деревне , 26 24 байт

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

Спробуйте в Інтернеті! Спочатку надихнула @CarlosAlejo. Редагувати. Збережено 2 байти, перебираючи на літери fizz / buzz, а не призначаючи тимчасові. Пояснення:

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)повернув позицію ichar у початковій рядку, але він повертає її значення ASCII (код символу). Дуже розумне рішення, мені ще потрібно багато вдосконалити свої навички деревного вугілля!
Чарлі

Як ти це робиш
на Вугільному вугіллі

У якому кодуванні це 24 байти?
Руслан

@ Руслан На спеціальній кодовій сторінці деревного вугілля .
Ніл

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частини? Якщо так, можливо, ви зможете зберегти деякі байти таким чином.
Брайан Дж

@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безпосередньо в потік або інтегрувати a toList, насправді, все розумне було б добре.
Олів'є Грегоар

1
Друк безпосередньо замість повернення рядка на 6 байт коротший, а використання getBytes()замість цього toCharArray()- додаткові 3 байти коротше:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Кевін Круїйсен

Ви забули додаткові 3 байти, змінивши toCharArray()на getBytes(). :)
Кевін Кройсейсен

1
Я натискав перед вашою редагуванням і не бачив її згодом;) Крім того, я просто подумав про це, перш ніж побачити ваш коментар xD
Олів'є Грегоар

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



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.
кинутись

@ 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
Використовуйте Countабо Ordinalвідповідно замістьFind щоб заощадити кілька байт.
Ніл

Весь ifрахується як одне твердження, тому вам не потрібно {}s. Я також зберегла байт, перемістивши Uppercaseвсередину Ternary: Спробуйте в Інтернеті!
Ніл

Ще краще, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχна 26 байт. (Deverbosifier не любить цю версію.)
Ніл

@Neil Дякую дуже, але я не можу навіть зрозуміти вашу останню версію, тому я не можу взяти на це кредит, я відчуваю, що це не моя власна відповідь. Мені буде честь перемогти вас, якщо ви напишете власний пост. :-)
Чарлі

2

> <> , 68 байт

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

Спробуйте в Інтернеті або подивіться це на рибному майданчику !

(Але подивіться на відповідь Аарона, який на 13 байт коротший!)

Якщо ви не знайомі з <<>, там є риба, яка плаває через код у 2D, а краї загортаються. Символи >, <, ^і vзадати напрямок риби, /і \дзеркала , які відображають його, а ?значить «зробити таку інструкцію , якщо верхня річ в стеці не дорівнює нулю, в іншому випадку перестрибувати через таку інструкцію».

У першому рядку риба має символ введення ( i); якщо це -1 для EOF, він зупиняється ( :0(?;); він отримує charcode mod 2 ( :2%$); і він натискає 1 або 0 на стек залежно від того, чи є charcode меншим або більшим, ніж charcode з "^" ( "^"(). Наступні три рядки перенаправляють рибу на правий рядок fizz / buzz, потім останній рядок роздруковує її (по одному oдля кожного символу) та відправляє рибу назад до початку.


@Aaron, це чудово! Я думав про цю ідею, але не зміг змусити її працювати. Чи хотіли б ви розмістити це як власне рішення?
Не дерево

@Aaron, ви також знайшли помилку або в TIO, або в інтернетному інтерпретаторі - в цьому інтерпретаторі !або ?за ним пробіл просто пропускає простір, але TIO чекає, поки пропустить наступну непросторову річ ...
Не дерево

@Aaron, ваш твір набагато кращий, ніж мій, тому ви можете опублікувати його самостійно, і я видалю цю.
Не дерево

!слід пропускати пробіли AFAIK, але інтернет-перекладач прошиває свій кодовий пробіл пробілами, і це, мабуть, те, що ви бачите
Аарон


2

> <> , 55 байт

На підставі не є дерево в відповідь .

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

Замість того, щоб представляти чотири можливі результати у коді, я представляю лише їхні великі версії та додаю 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 байт

збережено 1 9 байт завдяки @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""

Спробуйте в Інтернеті!


Збережіть 1 байт, видаливши пробіл між останнім рядком concatта ""в останньому рядку
Містер Xcoder


145 байт , видаліть зайвий пробіл
містер Xcoder

Дякую @ Mr.Xcoder, я все ще звикаю до F # і коли відступ значущий!

1
І BTW, Ласкаво просимо до PPCG! Я взагалі не знаю F #, просто видалили речі, щоб побачити, що відбувається :)
Містер Xcoder

1

Математика, 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 = непарний), а потім скористайтеся цим списком для індексації до списку fizzта buzz. Закиньте це на рядок, а потім для випадків, коли вхід <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

Я не знаю цієї мови, але ви можете видалити пробіл між modі 2?
Містер Xcoder

На жаль, ні, це можна було б записати так, mod[x;2]ніби ми не хотіли жодного пробілу - але це звивається на 1 байт більше!
Стрітер


1

Швидкий 4 , 144 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', тому що String не автоматично перетворюється в список під час виконання.
Містер Xcoder

Крім того, ця послуга не безкоштовна. Ви повинні додати кредитну карту, щоб перевірити ваше подання, якщо я не скопіюю його. Подумайте про зміну служби тесту.
Містер Xcoder

Для того, щоб він працював, ви повинні перетворити його на$0.characters.map{...}
містера Xcoder

@ Mr.Xcoder Cloud 9 має вільний рівень, у якому ви отримуєте лише одне приватне робоче місце та необмежену кількість публічних робочих просторів. Ви повинні мати можливість увійти через GitHub. Я ніколи нічого з цим не ділився, тому не був впевнений, чи спрацює це. Крім того, я повинен був зазначити, що я використовую Swift 4, де String відповідає колекції. Це означає, що він має функцію карти.
Калеб Клеветер

1
Як я бачу, стара версія декларації досі діє в Swift 4, func f(s:String){...}отже, ви можете зберегти 9 байт, використовуючи наступний код, який використовується printзамість return: pastebin.com/06kiiGaJ . Якщо це не працює, дайте мені знати.
Містер Xcoder

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є це великим капіталом чи ні ( ) та чи є це fizzчи а 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
Привіт! Ласкаво просимо до PPCG! Ми - гольф-спільнота, тому ми намагаємось зняти якомога більше байтів - це включає байти у змінних імен та пробілів, які можна видалити з вашої відповіді. Окрім того, подання має бути або повною програмою (включаючи подібну табличку public static void main), або функцією. Наразі ваш - фрагмент.
Стівен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.