Fizz-Buzzify Строка


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"
"АТОМ" -> "БУЗЗФИЗЗБУЗЗБУЗЗ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • Можно использовать любой стандартный метод ввода / вывода .

  • Применяются стандартные лазейки .

  • Вам разрешено принимать данные только в родном типе String вашего языка. То же самое относится и к выходу.

  • Вы можете предположить, что ввод не будет пустым.

  • Самый короткий код в байтах на каждом языке выигрывает. Удачи и Fizz-Buzz!


Ответы:


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 (код символа). Очень умное решение, мне еще нужно улучшить свои навыки работы с углем!
Чарли

Как вы делаете это в Charcoal всего за 24 байта ...
Эрик Аутгольфер

В какой кодировке это 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непосредственно в поток или интегрировать 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":...
Mr. 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.

Ungolfed код:

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 задать направление рыбы, /и \зеркала , которые отражают его, а ?значит «сделать следующую инструкцию , если верхняя вещь в стеке не равен нулю, в противном случае перепрыгивать через следующую инструкцию».

В первой строке рыба принимает символ input ( i); если это равно -1 для EOF, оно останавливается ( :0(?;); получает код мод 2 ( :2%$); и он помещает 1 или 0 в стек в зависимости от того, является ли код символа меньше или больше, чем код «^» ( "^"(). Следующие три строки перенаправляют рыбу на правильную строку шипения / жужжания, затем последняя строка печатает ее (по одной oдля каждого символа) и отправляет рыбу обратно в начало.


@ Аарон, это здорово! Я думал об этой идее, но не смог заставить ее работать. Хотите опубликовать это как собственное решение?
Не дерево

@ Аарон, вы также нашли ошибку в TIO или в онлайн-интерпретаторе - в этом интерпретаторе !или ?после пробела просто пропускает пробел, но TIO ждет, пока не пропустится следующая не пробельная вещь ...
Не дерево

@ Аарон, твое представление намного лучше моего, поэтому ты можешь опубликовать его самостоятельно, а я удалю это.
Не дерево

!должен пропустить пробелы AFAIK, но онлайн-переводчик дополняет свое кодовое пространство пробелами, что, вероятно, вы и видите
Аарон


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 байтов

спас 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и ""в конце строки
Mr. Xcoder,


145 байтов , удалите ненужные пробелы
Mr. Xcoder

Спасибо @ Mr.Xcoder Я все еще привыкаю к ​​F # и когда отступы значительны!

1
И кстати, добро пожаловать в PPCG! Я совсем не знаю F #, просто удалил материал, чтобы посмотреть, что произойдет :)
Mr. Xcoder,

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 = нечетный), затем используйте этот список для индексации в список fizzи buzz. Приведите это к строке, а затем для случаев, когда ввод <91 (ниже, чем Z), мы применяем upperфункцию, чтобы получитьFIZZ или a BUZZ.

д интерпретируется справа налево:

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 байт больше!
streetster


1

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

Un-golfed:

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

Кроме того, эта услуга не является бесплатной. Вы должны добавить кредитную карту, чтобы проверить свою заявку, если я не скопирую ее. Подумайте об изменении службы тестирования.
г-н Xcoder

Для того, чтобы заставить его работать, вы должны превратить его в$0.characters.map{...}
Mr. Xcoder

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

1
Как я вижу, объявление старой функции все еще действует в Swift 4, например func f(s:String){...}, поэтому вы можете сохранить 9 байтов, используя следующий код, который использует printвместо return: pastebin.com/06kiiGaJ . Если это не сработает, дайте мне знать.
Мистер Кскодер

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или 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), либо функцией. В настоящее время ваш фрагмент.
Стивен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.