Фибоначчи + Физз Базз = Фибоначчи!


74

Фибоначчи + FizzBuzz = Фибоначчи!


Ваша задача - создать программу Fibo Nacci!

  • Программа Фибоначчи выводит первые 100 чисел Фибоначчи (начиная с 1).
  • Если число Фибоначчи делится на 2 и 3 (т.е. оно делится на 6), то вместо числа выведите FiboNacci.
  • В противном случае, если число Фибоначчи делится на 2, выведите число Фибоначчи вместо числа.
  • В противном случае, если число Фибоначчи делится на 3, выведите Nacci вместо числа.

правила

  • Программа не должна принимать никаких данных.
  • Программа должна выводить новую строку ( \n) после каждой записи.
  • Программа не должна ничего печатать в STDERR.
  • Программа должна вывести первые 100 записей Фибоначчи (начиная с 1).
  • Стандартные лазейки не разрешены (по умолчанию).
  • Это поэтому выигрывает самый короткий код в байтах!

Вот ожидаемый результат:

1
1
Fibo
Nacci
5
Fibo
13
Nacci
Fibo
55
89
FiboNacci
233
377
Fibo
Nacci
1597
Fibo
4181
Nacci
Fibo
17711
28657
FiboNacci
75025
121393
Fibo
Nacci
514229
Fibo
1346269
Nacci
Fibo
5702887
9227465
FiboNacci
24157817
39088169
Fibo
Nacci
165580141
Fibo
433494437
Nacci
Fibo
1836311903
2971215073
FiboNacci
7778742049
12586269025
Fibo
Nacci
53316291173
Fibo
139583862445
Nacci
Fibo
591286729879
956722026041
FiboNacci
2504730781961
4052739537881
Fibo
Nacci
17167680177565
Fibo
44945570212853
Nacci
Fibo
190392490709135
308061521170129
FiboNacci
806515533049393
1304969544928657
Fibo
Nacci
5527939700884757
Fibo
14472334024676221
Nacci
Fibo
61305790721611591
99194853094755497
FiboNacci
259695496911122585
420196140727489673
Fibo
Nacci
1779979416004714189
Fibo
4660046610375530309
Nacci
Fibo
19740274219868223167
31940434634990099905
FiboNacci
83621143489848422977
135301852344706746049
Fibo
Nacci

Каталог

Закуска Стек Сниппает в нижней части этого поста генерирует каталог из ответов а) в виде списка кратчайшего раствора на язык и б) в качестве общих лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

## Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


6
А как насчет языков с самым высоким целочисленным типом всего 64 бита? :( Разве не достаточно 90 фиб.
Чисел

3
@ Zereges В этом отношении, я извиняюсь. :(
Kritixi Lithos

28
Может быть, это следует называть "Fizzo Nacci"
LegionMammal978

4
@SztupY Поскольку вывод в этом вопросе полностью инвариантен, вам даже не нужны целые числа. Просто отнеситесь к этому вопросу как к вопросу о колмогоровской сложности (я даже добавил тег) и переходите оттуда.
Крис Джестер-Янг

3
@ ChrisJester-Young это все еще неоправданное ограничение, которое может заставить творческих разработчиков избежать этой задачи. И большинство решений (включая 2-е по популярности) уже
ломаются

Ответы:


18

Pyth, 37 байт

Я перебираю числа Фибоначчи вместо того, чтобы генерировать их заранее, так как это действительно мало.

K1V100|+*"Fibo"!%=+Z~KZ2*"Nacci"!%Z3Z

Попробуйте онлайн.


Поздравляем с победой в этом соревновании! Мне понравилось, что это решение было быстрым.
Kritixi Lithos

45

Python 2, 62 байта

a=b=1;exec"print~a%2*'Fibo'+~a%3/2*'Nacci'or a;a,b=b,a+b;"*100

Не сильно отличается от стандартного FizzBuzz, правда.


1
Это потрясающе.
Дж Аткин

Мне нужно запомнить эту петлевую конструкцию для моего следующего Ruby Golf. Это потрясающе.
хлопнуть

21

C ++ 11 метапрограммирование, 348 байт

#include<iostream>
#define D static const unsigned long long v=
template<int L>struct F{D F<L-1>::v+F<L-2>::v;};template<>struct F<2>{D 1;};template<>struct F<1>{D 1;};template<int Z>struct S:S<Z-1>{S(){auto&s=std::cout;auto l=F<Z>::v;s<<(l%2?"":"Fibo")<<(l%3?"":"Nacci");(l%2&&l%3?s<<l:s)<<"\n";}};template<>struct S<0>{S(){}};int main(){S<100>s;}

Потому что, почему бы и нет. Он компилируется warning C4307: '+': integral constant overflow, работает нормально, но 93+ числа Фибоначчи не отображаются правильно (из-за переполнения), поэтому это недопустимая запись (но я не смог выиграть с таким количеством байтов)

Ungolfed

#include <iostream>
#define D static const unsigned long long v = 
template<int L>struct F { D F<L - 1>::v + F<L - 2>::v; };
template<>struct F<2> { D 1; };
template<>struct F<1> { D 1; };

template<int Z>struct S : S<Z - 1>
{
    S()
    {
        auto&s = std::cout;
        auto l = F<Z>::v;
        s << (l % 2 ? "" : "Fibo")
          << (l % 3 ? "" : "Nacci");
        (l % 2 && l % 3 ? s << l : s) << "\n";
    }
};

template<>struct S<0>
{
    S() { }
};

int main()
{
    S<100>s;
}

Вы можете использовать разнесенные строки ( template <char H, char ...T>) в ваших шаблонах для (теоретически) обработки значений произвольной длины. Тогда нужно просто изучить последние 2 символа в каждой строке, чтобы определить делимость на 2 и / или 3.
Мего

@ Мего, я тебя не понимаю. Как это поможет мне обрабатывать значения, которые не вписываются в 64 бит. Кроме того, вам нужны все цифры, чтобы узнать, делится ли число на 3.
Зерегес

Строки могут быть произвольно длинными (до тех пор, пока у вас не закончится память). И ты прав, я испортил свой комментарий. Тем не менее, вы можете вычислить цифровую сумму, чтобы определить делимость на 3.
Mego

@Mego Реализация добавления этих строк потребует гораздо больше усилий.
Зерегес

1
Вы могли бы использовать диалект гну и использовать __uint128_t, возможно.

14

C #, 175 171 152 145 байтов

class c{static void Main(){for(dynamic a=1m,b=a,c=0;c++<100;b=a+(a=b))System.Console.WriteLine(a%6>0?a%2>0?a%3>0?a:"Nacci":"Fibo":"FiboNacci");}}

несжатый:

class c {
    static void Main()
    {
        for (dynamic a = 1m, b = a, c = 0; c++ < 100; b = a + (a = b))
            System.Console.WriteLine(a%6>0?a%2>0?a%3>0?a:"Nacci":"Fibo":"FiboNacci");
    }
}

Даже сжимая результат с DeflateStream, самое низкое, которое я мог получить, было 191 символом, так что это, вероятно, очень близко к наилучшему из возможных ответов на c #. Позор BigInteger требуется.
Джодрелл

"используя Систему"; даст еще один -1 в размере.
olegz

1
Мне все еще приходилось ставить префикс System.Numerics для System несмотря на использование: -S, поэтому я не уверен, что использование будет работать.
Джодрелл

1
Вы можете сохранить 3 символа, заменив ==0s на >0и инвертируя троичные:class c{static void Main(){for(System.Numerics.BigInteger a=1,b=1,c=0;c++<100;b=a+(a=b))System.Console.WriteLine(a%6>0?a%2>0?a%3>0?a:(object)"Nacci":"Fibo":"FiboNacci");}}
Bob

3
Вы можете сохранить еще 7 символов, изменив decimal a=1,b=1на dynamic a=1m,b=aи затем вы можете потерять (object):)
Timwi

13

Oracle SQL, 212 байт

Не язык игры в гольф, но я должен был попробовать ...

Объединение всех строк с помощью \n:

WITH F(R,P,C)AS(SELECT 1,0,1 FROM DUAL UNION ALL SELECT R+1,C,P+C FROM F WHERE R<100)SELECT LISTAGG(NVL(DECODE(MOD(C,2),0,'Fibo')||DECODE(MOD(C,3),0,'Nacci'),''||C),CHR(13))WITHIN GROUP(ORDER BY R)||CHR(13)FROM F

SQLFIDDLE

Или с одной записью из последовательности на строку (162 байта):

WITH F(R,P,C)AS(SELECT 1,0,1 FROM DUAL UNION ALL SELECT R+1,C,P+C FROM F WHERE R<100)SELECT NVL(DECODE(MOD(C,2),0,'Fibo')||DECODE(MOD(C,3),0,'Nacci'),''||C)FROM F

2
Удивительно, только для использования SQL
Уэйн Вернер

Просто используйте последний, так как он «эквивалентен» выводу «на строку». И это действительно хороший кусок кода. Отлично сработано!
Исмаэль Мигель

@IsmaelMiguel Если он запускается в SQL * Plus (или другом интерфейсе командной строки), то после каждой строки будет вывод новой строки (как часть того, как он сообщает о результатах запроса). Однако это является функцией CLI, а не языка SQL - чтобы соответствовать правилу, The program should output a new line (\n) after every entryя оставлю его как более длинный код, но более короткий код можно сделать совместимым (без использования CLI), добавив ||CHR(13)перед финальным FROMдля 171 персонажа.
MT0

Не могли бы вы использовать "\n"? Кажется, работает на MySQL. («Бег» select length("\n")возвращает 1, а «Бег» select "\n"не возвращается n, как и в случае « select "\p"возврата» pиз-за недопустимого побега)
Исмаэль Мигель

SELECT LENGTH('\n') FROM DUALвыводит 2в Oracle как '\n'не конвертируется в CHR(13).
MT0

11

ShapeScript , 83 байта

11'1?1?+'77*2**!""'"%r
"@+@0?2%1<"Fibo"*1?3%1<"Nacci"*+0?_0>"@"*!#%'52*0?**!"'"$""~

Попробуйте онлайн!


15
Буквально похоже, что мой кот прыгнул на клавиатуру, когда я пытался включить липкие клавиши. Хорошая работа.
этап

2
@ Фаза в переносном смысле. Или это, или вы не смотрите слишком близко. Или у вас крошечный кот или гигантская клавиатура. Потому что этому коту удалось набрать Fibo и Nacci, но в противном случае избегать всех буквенных ключей, кроме одного r.
Джон Дворак

3
@JanDvorak Я думаю, что в Phase есть макросы для этого;)
Уэйн Вернер

2
@phase 1. Почему ваша кошка в вашей комнате ?; 2. почему вы хотите включить липкие ключи? 3? Почему у вас нет стола-ловушки для кошек, чтобы ваш кот не прыгнул на клавиатуру?
Nzall

7

Java, 407 398 351 308 байт

Игра в гольф с помощью @Geobits и @SamYonnou

Распространить слово: Verbose == Java

import java.math.*;class A{public static void main(String[]w){BigInteger a=BigInteger.ZERO,b=a.flipBit(0),c,z=a,t=a.flipBit(1),h=t.flipBit(0),s=t.flipBit(2);for(int i=0;i<100;i++){System.out.println(b.mod(s).equals(z)?"FiboNacci":b.mod(t).equals(z)?"Fibo":b.mod(h).equals(z)?"Nacci":b);c=a;a=b;b=c.add(b);}}}

Безголовая версия:

import java.math.*;

class A
{
  public static void main(String[]w)
  {
    BigInteger a=BigInteger.ZERO,b=a.flipBit(0),c,z=a,t=a.flipBit(1),h=t.flipBit(0),s=t.flipBit‌​(2);
    for(int i=1;i<=100;i++) {
      System.out.println(b.mod(s).equals(z)?"FiboNacci":b.mod(t).equals‌​(z)?"Fibo":b.mod(h).equals(z)?"Nacci":b);                
      c=a;a=b;b=c.add(b);
    }
  }
}

1
Это может быть в гольф больше. Импорт java.math.*вместо всего этого. Используйте константы для BigIntegers ONEи ZEROвместо них new. Удалить publicиз класса. Упакуйте все, кроме printlnутверждения в forтеле внутри объявления цикла и т. Д. Я рекомендую просмотреть советы по игре в гольф на Java в целом.
Geobits

@ Geobits Готово! «Мне жаль, что я не был знаком с BigIntegerего различными техниками игры в гольф.
Носок

Хранение BigInteger.ZERO, использование flipBit (...) в качестве альтернативы новому BigInteger (...) и некоторые другие мелочи, которые вы можете получить до 308:import java.math.*;class A{public static void main(String[]w){BigInteger a=BigInteger.ZERO,b=a.flipBit(0),c,z=a,t=a.flipBit(1),h=t.flipBit(0),s=t.flipBit(2);for(int i=0;i<100;i++){System.out.println(b.mod(s).equals(z)?"FiboNacci":b.mod(t).equals(z)?"Fibo":b.mod(h).equals(z)?"Nacci":b);c=a;a=b;b=c.add(b);}}}
SamYonnou

Похоже, BigIntegerвсегда возвращается, BigInteger.ZEROкогда какая-то операция типа add(...)оценивается как ноль, так что вы можете использовать ==вместо .equals(z), также вы можете покончить с сохранением s=t.flipBit‌​(2)(6) и вместо этого выполнить какое-то умное внутреннее назначение, например, так: import java.math.*;class A{public static void main(String[]w){BigInteger a=BigInteger.ZERO,b=a.flipBit(0),c,d,z=a,t=a.flipBit(1),h=t.flipBit(0);for(int i=0;i<100;i++){System.out.println((c=b.mod(t)).add(d=b.mod(h))==z?"FiboNacci":c==z?"Fibo":d==z?"Nacci":b);c=a;a=b;b=c.add(b);}}}эти изменения уменьшают его до 280
SamYonnou

2
Я думаю, что вы имеете в видуVerbose.isEqualTo(Java)
Cyoce

7

Mathematica, 80 байт

a=b_/;#∣b&;Print/@(Fibonacci@Range@100/.{%@6->FiboNacci,%@2->Fibo,%@3->Nacci})

Адаптация моего старого решения FizzBuzz.


1
@JacobAkkerboom Извините, исправлено. Кроме того, для версий менее 10.3 заменить Echoна Print.
LegionMammal978

5

Рубин, 71 66 байт

a=b=1;100.times{puts [b,f='Fibo',n='Nacci',f,b,f+n][~b%6];a=b+b=a}

ungolfed:

a = b = 1 #starting values
100.times{
  # create an array, and selects a value depending on the current number
  puts([b, 'Fibo', 'Nacci', 'Fibo', b, 'FiboNacci'][~b%6])
  a=b+b=a # magic
}

Я работал над этим дольше, чем хотел бы администратор, и не могу найти способ улучшить его. f,n=%w[Fibo Nacci], f,n='Fibbo','Nacci'И f='Fibbo';n='Nacci'все они имеют один и тот же количество символов. +1
Шелваку

1
Вы можете сохранить три байта, используя [b,f='Fibo',n='Nacci',f,b,f+n][~b%6], и еще два, удалив скобки в a=b+b=a.
Примо

Спасибо @Primo. Это хитрый трюк с ~оператором. Никогда раньше не видел. И теперь я знаю, почему отрицательные индексы являются частью рубина :)
MegaTom

Действительно нужно puts [вместо puts[?
Эрик Outgolfer

1
Розы красные, Фиалки синие, для Хаскелла и Руби я понятия не имею.
Эрик Outgolfer

5

> <> , 116 байт

01:n1&61>.
ao:@+:v
vv?%2:<
">:3%?vv^16<
o>:3%?!v~v<&
bov"ci"< 6 ;
io"   n  6~?
Focv1&<   o=
"o">+:aa*!o^
>^>"aN"ooo^

Попробуйте онлайн!


6
Добро пожаловать на сайт! :)
DJMcMayhem

Вы могли бы, вероятно, объединить оба 3%раздела
Джо Кинг

@JoKing Вы бы так подумали, но на самом деле они приводят к разным результатам, если n% 3! = 0. Я уверен, что есть способ объединить их, но это будет означать реструктуризацию всей программы, и я думаю, что на самом деле это будет дольше.
hakr14


4

C #, 498 392 320 байт

Я просто очень хотел сделать это с помощью linq, очень жаль, что мне пришлось написать собственную функцию суммирования для BigInteger, которая действительно убила его :-(

using System.Linq;using System.Numerics;using System.Collections.Generic;static class a{static void Main(){var f=new List<BigInteger>(){1,1};while(f.Count<100)f.Add(f.Skip(f.Count-2).Take(2).Aggregate((a,b)=>b+a));f.ForEach(x=>{System.Console.WriteLine(x%6==0?"FiboNacci":x%2==0?"Fibo":x%3==0?"Nacci":x.ToString());});}}

Ungolfed:

using System.Linq;
using System.Numerics;
using System.Collections.Generic;
static class a
{
    static void Main()
    {
        var f=new List<BigInteger>(){1,1};
        while(f.Count<100)
            f.Add(f.Skip(f.Count-2).Take(2).Aggregate((a,b)=>b+a));
        f.ForEach(x=>
        {
            System.Console.WriteLine(x%6==0?"FiboNacci":x%2==0?"Fibo":x%3==0?"Nacci":x.ToString());
        });
    }
}

Редактирование: до 320 байт благодаря LegionMammal978 за совокупное предложение и благодаря ответу olegz на C # за сокращение x% 6 для X% 2 && x% 3, а также использованию троичных операторов в одном операторе WriteLine.


4
Вы слышали о Aggregateфункции LINQ?
LegionMammal978

Замените «сумму» на «т», чтобы побрить 6 байтов.
Xantix

3

Python 2, 171 121 байт

«Грубая сила подхода».

a=[1,1]
print 1
for _ in"q"*99:print[a[1],"Fibo","Nacci","FiboNacci"][a.append(a.pop(0)+a[0])or(1-a[0]%2)+(a[0]%3<1)*2]

3

Javascript, 93 90 86 байт

for(a=0,b=1,i=100;i--;a=[b,b=a+b][0])console.log((b%2?'':'Fibo')+(b%3?'':'Nacci')||b)

1
Вы можете сохранить четыре байта, изменив a=[b,b=a+b][0]на b=a+b,a=b-a. Кроме того, в совершенно несвязанной заметке мне нравится, как ты отвечаешь очень быстро в Stack Overflow, хе-хе,
Хорошего

2

Python 2, 100 байт

x=[1,1]
exec"x+=[x[-1]+x[-2]];"*98
print"\n".join(["Fibo"*(i%2==0)+"Nacci"*(i%3==0)or`i`for i in x])

Для больших чисел, добавляет Lв конец, показывая, что это длинное число.

Если это проблема, вот 104-байтовое решение

x=[1,1]
exec"x+=[x[-1]+x[-2]];"*98
print"\n".join(["Fibo"*(i%2==0)+"Nacci"*(i%3==0)or str(i)for i in x])

Вы можете сократить forцикл, используя этот совет: codegolf.stackexchange.com/a/5047/42736 . В частности, execсовет выглядит хорошо.
Дж Аткин

+1 за exec <program_string>*nтрюк. Приятно!
agtoever

2

Javascript (ES6), 137 134 байта

g=x=>(a=[1,1],f=(x)=>(a[x]=y=a[x-1]+a[x-2],(y%2&&y%3?y:(!(y%2)?'Fibo':'')+(!(y%3)?'Nacci':''))+'\n'+((++x<99)?f(x):'')),'1\n1\n'+f(2))

Рекурсивная функция, которая вычисляет fibonnacci, помещает его в массив, затем выводит Fibo, Nacci или число и вызывает себя для вычисления следующего до 100.

Это ломается в 73 из-за точности числа JavaScript. Единственный способ обойти это - добавить свой собственный расчет битов.


Это не работает, происходит неправильно после того, 5527939700884757 + 8944394323791464 = 14472334024676220как это должно быть, 14472334024676221потому что JavaScript использует 16-битную точность с плавающей точкой, а это требует 17-битной точности. Вы также должны напечатать 1дважды.
Джордж Райт

Добавил печать 1 дважды. Для точности мне нужно изменить все в коде, чтобы он работал (не используя Number, но Uint32Array и вычисляя биты за битами)
Науак

2

QBasic, 144 141 байт

Не особенно маленький, но он превосходит C ++ и C #

r=1:FOR i=1 TO 046:a$="":q=p+r
IF q MOD 2=0 THEN a$="Fibo"
IF q MOD 3=0 THEN a$=a$+"Nacci"
IF a$="" THEN a$=STR$(q)
PRINT a$:r=p:p=q:NEXT

Нет объявлений, используется :везде, где это возможно, потому что это на 1 байт дешевле, чем CRLF. К счетчику цикла добавляется 0: Basic будет переполнен на 47-м символе Фибоначчи, поэтому будет компенсирован дополнительный байт, который должен быть там.

РЕДАКТИРОВАТЬ: Нил спас меня 3 байта: 141 байт.


Вы можете удалить первое, a$+так как на данный момент известно, что это пустая строка.
Нил

2

Wolfram Language, 84 байта

Вид обмана конечно, из-за встроенного Fibonacci.

t=Fibonacci@Range@100;g=(t[[#;;;;#]]=#2)&;g[3,Fibo]g[4,Nacci]g[12,FiboNacci]Print/@t

Пример команды для запуска скрипта

/Applications/Mathematica.app/Contents/MacOS/WolframKernel -script ~/Desktop/fibo.wl

2

Perl, 74 байта

map{print+(Fibo)[$_%2].(Nacci)[$_%3]||$_ for$a+=$b||1,$b+=$a}1..50

Требуется следующая опция командной строки:, -lMbigintсчитается 8.


Образец использования

$ perl -lMbigint fibo-nacci.pl

Perl, 79 байт

use bigint;map{print+(Fibo)[$_%2].(Nacci)[$_%3]||$_,$/for$a+=$b||1,$b+=$a}1..50

То же, что и выше, не требуя никаких параметров командной строки.


2

GolfScript, 47 байт

100,{1.@{.@+}*;..2%!'Fibo'*\3%!'Nacci'*+\or}%n*

объяснение

100,            # push 0..99
{               # map
  1.@           # push 1 twice, rotate counting var to the top
  {             # apply that many times
    .@+         # copy the top, rotate and add
                # if the stack is [a b], this produces: [a b b] -> [b b a] -> [b b+a]
  }*
  ;..           # discard the top, duplicate twice
  2%!'Fibo'*\   # divisible by 2 ? 'Fibo' : ''
  3%!'Nacci'*   # divisible by 3 ? 'Nacci' : ''
  +\or          # concatenate, if empty use the numeric value instead
}%
n*              # join all with a newline

2

PARI / GP, 76 73 байта

Сохраненные три байта любезно предоставлены Митчем Шварцем .

for(n=b=!a=1,99,b=a+a=b;print(if(b%2,"",Fibo)if(b%3,if(b%2,b,""),Nacci)))

Образец использования

$ gp -qf < fibo-nacci.gp

1
Короче не использовать встроенный; Я получил 73 сfor(i=b=!a=1,99,b=a+a=b; ...
Митч Шварц

1
@MitchSchwartz это раньше называлось fibo;)
primo

2

> <>, 128 119 байт

111&v       >:3%0=?v>  v
?;ao>:2%0=?v :3%0=?v :n>:}+&:1+&aa*=
            ^oooo < ^ooooo <
           >"obiF"^>"iccaN"^

Я бесстыдно украл заимствованную существующую программу FizzBuzz и модифицировал ее так, чтобы она работала для последовательности Фибоначчи. Это выводит числа навсегда. Теперь это исправлено, т.е. выводит только 100 номеров. Попробуй это здесь .


2
Вы должны вывести только первые 100 чисел Фибоначчи, не больше и не меньше.
Kritixi Lithos

@ ΚριτικσιΛίθος Я наконец-то нашел способ сделать так, чтобы он выводил только 100 чисел.
DanTheMan

Это выводит 101 число на TIO, но не работает на связанном сайте
Джо Кинг

1

Pyth, 51 байт

V.Wn100lHaZ+@Z_1@Z_2[1 1)|+*"Fibo"}2JPN*"Nacci"}3JN

Создает последовательность Фибоначчи, а затем решает, что печатать.

                    [1 1)                           - H = [1,1]
  Wn100lH                                           - While len(H)!=100 
         aZ+@Z_1@Z_2                                - H.append(H[-1]+H[-2])
V.                                                  - For N in H:
                                    JPN             - Set J to the prime factorization of H
                           *"Fibo"}2J               - If there is a 2 in the factorization, add "Fibo" to a string
                                       *"Nacci"}3J  - If there is a 3 in the factorization, add "Nacci" to a string
                          +                         - Join them together
                         |                        N - If the string isn't empty (If it isn't divisible by 2 or 3), print N
                                                    - Else print the string

Чтобы проверить, попробуйте это (только первые 20 чисел)

V.Wn20lHaZ+@Z_1@Z_2[1 1)|+*"Fibo"}2JPN*"Nacci"}3JN

Сколько времени занимает запуск самой программы?
Kritixi Lithos

Я понятия не имею, что за 30 секунд, потраченных на то, чтобы понять, что разработка таких больших простых факторизаций, вероятно, сильно замедлит процесс.
Синий

1

Clojure, 127 байт

(def f(lazy-cat[1 1](map +' f(rest f))))(doseq[x(take 100 f)](println(str(if(even? x)'Fibo)({0'Nacci}(mod x 3)(if(odd? x)x)))))

Ungolfed:

(def fib (lazy-cat [1 1] (map +' fib (rest fib))))

(doseq [x (take 100 fib)]
  (println (str (if (even? x) 'Fibo)
                ({0 'Nacci}
                 (mod x 3)
                 (if (odd? x) x)))))

Некоторые хитрости используются:

  • Это довольно мало, defчто дает саму последовательность Фибоначчи, бесстыдно украдено у Конрада Гаруса .
  • strможет принимать символы в качестве входных данных. Сумасшедший, верно?
  • Карты и значения по умолчанию являются кратчайшим способом записи ifв некоторых случаях.

Что такое lazy-cat?
Kritixi Lithos

@ ΚριτικσιΛίθος Он лениво объединяет несколько последовательностей. В этом случае он объединяет первые два элемента последовательности Фибоначчи ( [1 1]) с результатом суммирования каждого элемента в последовательности Фибоначчи с последующим элементом.
Сэм Эстеп

Правильно ли я догадываюсь, что это в основном версия Clojure fibs = 0 : 1 : zipWith (+) fibs (tail fibs)?
Сохам Чоудхури

@ SohamChowdhury Да, насколько я могу судить.
Сэм Эстеп



1

Javascript (ES2015), 99 байт

f=n=>n<3?1:f(n-1)+f(n-2);for(i=0;i<100;)console.log((f(++i)%2?'':'Fibo')+(f(i)%3?'':'Nacci')||f(i))

Ungolfed:

// fibonacci function
var fibonacci = (n) => n < 3 ? 1 : fibonacci(n-1) + fibonacci(n-2) // (implicit return)

for (var i = 0; i<100;) {
  var output = fibonacci(++i) % 2 !== 0 ? '' : 'Fibo';
  output += fibonacci(i) % 3 !== 0 ? '' : 'Nacci';
  console.log(output || fibonacci(i));
}

Используйте alertвместо console.log; сбривает несколько байтов.
Kritixi Lithos

1

F #, 202 163 149 байт

Seq.unfold(fun(a,b)->printfn"%s"(a%6m|>function|0m->"FiboNacci"|2m|4m->"Fibo"|3m->"Nacci"|_->string a);Some(1,(b,a+b)))(1m,1m)|>Seq.take 100|>Seq.sum

Это файл FSX (F # script)


Я удивлен, что это работает
asibahi

1

PHP, 75 байт

<?for(;4e20>$b=bcadd($a,$a=$b)?:1;)echo[Fibo][++$i%3].[Nacci][$i%4]?:$b,~õ;

Удивительно конкурентоспособный. Требует PHP v5.5 или выше. Я предполагаю настройки по умолчанию, так как они без .ini (вы можете отключить локальный .ini с помощью -nопции).


Образец использования

$ php -n fibo-nacci.php

С -n bcaddне работает даже когда bcmathустановлен. Без -n большого количества материала выводится на stderr.
Сильвестр

Работает на моей коробке (ях).
Примо

1

Пролог, 182 байта

f(A,B,X):-X<100,C is A+B,Z is X+1,(Y is B mod 6,Y=0->writeln('FiboNacci');(Y is B mod 2,Y=0->writeln('Fibo');(Y is B mod 3,Y=0->writeln('Nacci');writeln(B)))),f(B,C,Z).
p:-f(0,1,0).

Попробуйте онлайн здесь.
Чтобы запустить программу, используйте запрос:

p.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.