Послідовність Філі Боконач


14

Леонардо з Пізи (бл. 1175 - бл. 1245) більш відомий як Фібоначчі . Але це насправді коротке для латинського "filius Bobog" (син Боконача), який був складений протягом 18 століття (згідно Вікіпедії ).

У цьому виклику вам буде надано порядковий номер (в прямому сенсі) від 1- го до 20- го, і вам потрібно повернути відповідний термін у послідовності Фібоначчі .

Поворот у тому, що порядковий номер буде вказаний латиною.

Приклад : "дуодецим" → .89

Повна таблиця вводу / виводу

 input              | meaning | output
--------------------+---------+--------
 "primus"           |   1st   |    0
 "secundus"         |   2nd   |    1
 "tertius"          |   3rd   |    1
 "quartus"          |   4th   |    2
 "quintus"          |   5th   |    3
 "sextus"           |   6th   |    5
 "septimus"         |   7th   |    8
 "octavus"          |   8th   |   13
 "nonus"            |   9th   |   21
 "decimus"          |  10th   |   34
 "undecimus"        |  11th   |   55
 "duodecimus"       |  12th   |   89
 "tertius decimus"  |  13th   |  144
 "quartus decimus"  |  14th   |  233
 "quintus decimus"  |  15th   |  377
 "sextus decimus"   |  16th   |  610
 "septimus decimus" |  17th   |  987
 "duodevicesimus"   |  18th   | 1597
 "undevicesimus"    |  19th   | 2584
 "vicesimus"        |  20th   | 4181

Правила

  • Гарантоване введення буде точно одним із описаних вище рядків.
  • Якщо це допоможе, ви можете взяти його в повному регістрі. Але він повинен бути узгодженим для всіх записів. Змішані справи не допускаються.
  • Залежно від алгоритму та мови жорстке кодування або обчислення умов послідовності може виграти або програти байтами. Обидва підходи прямо дозволені.
  • Це !

Веселий факт: є latin.stackexchange.com
JayCe

Відповіді:


8

R , 91 86 байт

Подивіться індекс суми байтів у грубій таблиці пошуку UTF8 з використанням жорстокої інформації та використовуйте магічну функцію генерування Фібоначчі, щоб дати відповідь.

function(x)round(1.618^match(sum(!x)%%93,!'%(-1!5+3JOSCW6')*.2765)
"!"=utf8ToInt

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

Редагувати: -2 байти за рахунок покращеного числового округлення

Редагувати: -3 байти зі зміною пошуку (спасибі за підказку, @Giuseppe!)


Хотіли зробити щось подібне з пошуку UTF8. Якби не було поняття, ти міг би подібних Fibonnaci. ймовірно, коротше, ніж я хотів зробити ( chartrUTF8 суми з UTF8 значення значення поля, а потім intToUtf8вихід chartr.
JayCe


Здається, не вдалося "sextus decimus", Джузеппе.
J.Doe

1
Ви виявилися правильним @Giuseppe, виявилося, що в ньому є 3 чарівні 2-значні модулі, для яких сума байтів була унікальною, 69, 88 і 93, а 88 - той, якому не потрібно було додавати будь-яку константу, щоб зробити зрозуміла струна.
J.Doe

9
Іноді я відчуваю, що половина кодегольфа знаходить потрібне число як модуль ...
Джузеппе

4

Ruby, 104 93 байт

->x{[8,4181,3,144,21,13,0,1,233,5,987,0,377,55,0,89,1,1597,34,610,0,2,2584][x.sum%192%76%23]}

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

Просто бере суму байтів, модуль 192, модуль 76, модуль 23, та індексує в таблицю пошуку. (Магічні числа, знайдені грубою силою.)


4

Чисто , 87 байт

Усі втечі, крім \n , трактуються як один байт, оскільки штраф компілятора з фактичними значеннями сировини. (У TIO та SE є проблеми, оскільки він не є дійсним UTF-8, і тому тут уникнуто)

FryAmTheEggman зробив приємну демонстрацію / вирішення: ось

import StdEnv
$s=hd[i\\i<-k 1 0&c<-:"\340\152\060\065\071\354\172\045\223\n\255\362\132\137\143\026\244\051\344\270"|c==sum s]
k b a=[a:k(a+b)b]

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

Визначає функцію $ :: [Char] -> Int, яка використовує унікальність у підсумовуванні великих знаків значень, щоб визначити, який термін у послідовності (породжений функцією помічника k) повернути.


4

6502 код машини (C64), 82 байти

00 C0 20 9E AD 20 A3 B6 A8 88 A9 05 4A 90 02 49 B1 71 22 88 10 F6 29 1F C9 07
B0 02 69 0D A8 BE 32 C0 B9 1E C0 4C CD BD 00 00 00 00 03 00 0A 00 06 10 01 00
FF 00 02 00 00 00 00 00 08 00 15 0D DB 02 18 90 3D 55 79 05 FF E9 62 22 01 59
01 37 FF 03

Для цього використовується хеш (звичайно), але оптимізований для короткої реалізації на 6502, скориставшись перевагами встановленого прапорця за допомогою зсуву та додатково використаним. Чарівні числа для хешування були виявлені грубим форсуванням з невеликою програмою С; тоFF байти нещасними отвори в хеш - таблиці;)

Кількість байтів: 2-байтна адреса завантаження, 38 байт-код, 42 байти хеш-таблиці для значень.

Демонстрація в Інтернеті

Використання: SYS49152"[ordinal]"наприклад SYS49152"DUODECIMUS". (зауважте, що літери відображаються великими літерами у конфігурації C64 за замовчуванням).

Важливо : Перед першим запуском видайте NEWкоманду. Це потрібно, тому що команда C64 BASIC LOADпоєднується з деякими векторами BASIC, навіть при завантаженні машинної програми на якусь абсолютну адресу (наприклад, тут $C000/ 49152).

Прокоментували розбирання :

         00 C0                          ; load address
.C:c000  20 9E AD    JSR $AD9E          ; evaluate expression
.C:c003  20 A3 B6    JSR $B6A3          ; evaluate as string
.C:c006  A8          TAY                ; length to y register
.C:c007  88          DEY                ; decrement (start at last char)
.C:c008  A9 05       LDA #$05           ; start value for hash
.C:c00a   .hashloop:
.C:c00a  4A          LSR A              ; shift right
.C:c00b  90 02       BCC .skip          ; shifted bit zero? -> skip xor
.C:c00d  49 B1       EOR #$B1           ; xor "magic" value
.C:c00f   .skip:
.C:c00f  71 22       ADC ($22),Y        ; add current character (plus carry)
.C:c011  88          DEY                ; previous character
.C:c012  10 F6       BPL .hashloop      ; pos >= 0? -> repeat
.C:c014  29 1F       AND #$1F           ; mask lowest 5 bits
.C:c016  C9 07       CMP #$07           ; larger than 7 ?
.C:c018  B0 02       BCS .output        ; -> to output
.C:c01a  69 0D       ADC #$0D           ; add 13
.C:c01c   .output:
.C:c01c  A8          TAY                ; hash to y register
.C:c01d  BE 32 C0    LDX .lb-8,Y        ; load low byte from hashtable
.C:c020  B9 1E C0    LDA .hb-8,Y        ; load high byte from hashtable
.C:c023  4C CD BD    JMP $BDCD          ; to output of 16bit number
.C:c026   .hb:
.C:c026  00 00 00 00 .BYTE $00,$00,$00,$00
.C:c02a  03 00 0A 00 .BYTE $03,$00,$0A,$00
.C:c02e  06 10 01 00 .BYTE $06,$10,$01,$00
.C:c032  FF 00 02 00 .BYTE $FF,$00,$02,$00
.C:c036  00 00 00 00 .BYTE $00,$00,$00,$00
.C:c03a   .lb:
.C:c03a  08 00 15 0D .BYTE $08,$00,$15,$0D  ; second byte used in .hb as well
.C:c03e  DB 02 18 90 .BYTE $DB,$02,$18,$90
.C:c042  3D 55 79 05 .BYTE $3D,$55,$79,$05
.C:c046  FF E9 62 22 .BYTE $FF,$E9,$62,$22
.C:c04a  01 59 01 37 .BYTE $01,$59,$01,$37
.C:c04e  FF 03       .BYTE $FF,$03

C64 BASIC V2 тестовий набір

(містить машинну програму в DATAрядках)

Демонстрація в Інтернеті

0fOa=49152to49231:rEb:pOa,b:nE
1?"primus",:sY49152"primus":?
2?"secundus",:sY49152"secundus":?
3?"tertius",:sY49152"tertius":?
4?"quartus",:sY49152"quartus":?
5?"quintus",:sY49152"quintus":?
6?"sextus",:sY49152"sextus":?
7?"septimus",:sY49152"septimus":?
8?"octavus",:sY49152"octavus":?
9?"nonus",:sY49152"nonus":?
10?"decimus",:sY49152"decimus":?
11?"undecimus",:sY49152"undecimus":?
12?"duodecimus",:sY49152"duodecimus":?
13?"tertius decimus",:sY49152"tertius decimus":?
14?"quartus decimus",:sY49152"quartus decimus":?
15?"quintus decimus",:sY49152"quintus decimus":?
16?"sextus decimus",:sY49152"sextus decimus":?
17?"septimus decimus",:sY49152"septimus decimus":?
18?"duodevicesimus",:sY49152"duodevicesimus":?
19?"undevicesimus",:sY49152"undevicesimus":?
20?"vicesimus",:sY49152"vicesimus":?
21dA32,158,173,32,163,182,168,136,169,5,74,144,2,73,177,113,34,136,16,246,41,31
22dA201,7,176,2,105,13,168,190,50,192,185,30,192,76,205,189,0,0,0,0,3,0,10,0,6
23dA16,1,0,255,0,2,0,0,0,0,0,8,0,21,13,219,2,24,144,61,85,121,5,255,233,98,34,1
24dA89,1,55,255,3


3

C (gcc) , 135 129 байт

6 байт вниз за пропозицією стельової кішки та Логерна

f;i;b;o;n(char*a){for(f=i=b=o=0;*a;o+=21*b+++*a++-70);for(b=1,o="TACIHAAJQFSAAARCAMGKDANPEAOAAL"[o%30];--o>65;f=b,b=i)i=f+b;a=i;}

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

Пояснення:

f; i; b; o; // Variables

n (char *a)
{
     // Calculate a silly hash of incoming string
     for (f = i = b = o = 0; *a; o += 21 * b++ + *a++ - 70);

     // Use the hash to index into the array of number values
     // and calculate the corresponding Fibonacci sequence element
     for
     (
         b = 1, 
         o = "TACIHAAJQFSAAARCAMGKDANPEAOAAL"[o % 30]; 

         --o > 65; 
         f = b, b = i
     )
         i = f + b;

     // implicit return
     a = i;
}

Ви можете замінити return i;наa=i;
Логерн

2

Pyth , 54 байти

L?>b1+ytbyttbbyxc."axnÛ±r†XVW‹(„WîµÏ£"2+hQ@Q618

Тестовий набір

Зверніть увагу: оскільки код використовує деякі недруковані символи, він може відображатися неправильно на Stack Exchange. Надане посилання веде до робочого та копіювально-вставного джерела.

Короткий короткий опис, Q[0]+Q[618%len(Q)]дає унікальні результати для всіх прийнятих матеріалів Q.


1

Python 2 , 292 байт

f=lambda x:x>1and f(x-1)+f(x-2)or x
def g(t):
	for i,c in zip("pr secun ter qua qui sex sep oc no ec".split(),range(1,11))+zip("un duo es ev".split(),(1,2,20,"-")):t=t.replace(i,str(c))
	return f(abs(eval("+".join("".join((" ",c)[c in"0123456789-"]for c in t).split()).replace("+-+","-")))-1)

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

Генератор Фібоначчі безсоромно викрав цю відповідь .

Розбиває кожне слово внизу на його змістовні складові частини та відкидає решту (наприклад, у «дуодеспісимусі», ми дбаємо лише про «дует ев ес» -> «2 - 20» -> abs («2-20») -> 18).

Передає обчислене значення (мінус 1 до 0-зміщення) функції генератора Фібоначчі.

Пояснення без вогню:

# Fibonacci function
f=lambda x:x>1and f(x-1)+f(x-2)or x

def g(t):
    # generates a list of key, value pairs like [("pr", 1, ..., ("ec", 10)] +
    values = zip("pr secun ter qua qui sex sep oc no ec".split(), range(1,11))

    # adds values to existing list
    values += zip("un duo es ev".split(),(1,2,20,"-"))

    # replace the matching values in the string with the appropriate number/sign.
    # ORDER MATTERS - if "un" is searched for before "secun", this generates incorrect values.
    for i,c in values:
        t = t.replace(i,str(c))

    # replace each non-digit, non-minus character in string with "c"
    t = [(" ",c)[c in"0123456789-"]for c in t]

    # convert space-replaced array back to a string
    # then split it on spaces, creating an array of values
    t = "".join(t).split()

    # turn the array back into a string, with each individual item separated by "+"
    # this will cause "-" to become "+-+" (since "-" is ALWAYS between two numbers), so prelace that sequence with "-"
    t = "+".join(t).replace("+-+","-")

    # evaluate the string as an expression, and take the absolute value for when - occurs
    t = abs(eval(t))

    # pass the value, minus 1 for 0-offset, to the Fibonacci function.
    return f(t-1)

1

Python 2 , 97 79 байт

lambda s:int(1.618**('RV3NJ^[KDP=Z62AWeG<C'.find(chr(hash(s)%69+48)))*.4474+.5)

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

По-перше, ми хочемо перетворити з латинської на число n; це досягається шляхом тиражування вхідного рядка достатньо разів, щоб переконатися, що в ньому є принаймні 11 символів; а потім символи 3rd і 10th (нульові індекси) утворюють унікальну пару беручи хеш-мод 69 і перетворюючи його на друкований знак.

Зараз у нас є n. Щоб знайти число nФібоначчі, ми можемо використовувати метод округлення , використовуючи лише стільки цифр точності, скільки нам потрібно до Fib (20).


1

JavaScript (Node.js) , 100 97 95 92 91 байт

x=>1.618**(p=parseInt)("1 jgf7  ei 490dbch62385a"[p(x.length+x,32)%12789%24],36)*.4474+.5|0

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

Попередження: РОБОТИ ВІД НЕВЕРХІТНОСТІ ПЛАТИВНОГО ТОЧКА

JavaScript не має ні вбудованої хеш-функції, ні достатньо короткої функції символу до ASCII ( String.charCodeAtце найкоротше вже), тому мені потрібно визначити просту хеш-функцію самостійно.

Використовували той же метод округлення, що і Шас Браун після обчислення хешу.

Після цілого дня жорстокого форсування знайдеться краще:

b32_to_dec(x.length + x) % 12789 % 24 (* неточність з плаваючою комою)

b32_to_dec(x.length + x) % 353 % 27 (* неточність з плаваючою комою)

b36_to_dec(x.length + x[2]) % 158 % 29 - 4

b36_to_dec(x[2] + x.length) % 741 % 30

b36_to_dec(x[0] + x[2] + x.length) % 4190 % 27

parseInt(x.length + x, 32) результат

primus 7310236636
secundus 9773632960476
tertius 272155724764
quartus 269453490140
quintus 269461747676
sextus 7054
septimus 9774067964892
octavus 266721394652
nonus 192700380
decimus 254959770588
undecimus 350449413217244
duodecimus 36520018280274912 **NOT PRECISE**
tertius decimus 1302947875804
quartus decimus 1300245641180
quintus decimus 1300253898716
sextus decimus 37774
septimus decimus 42759416798172
duodevicesimus 43016381192006637977600 **NOT PRECISE**
undevicesimus 1326703556626028691456 **NOT PRECISE**
vicesimus 351376069188572

Версія без використання неточності плаваючої точки: 95 байт

x=>1.618**(p=parseInt)("52d7i 6  he 8309jafc 41bg"[p(x.length+x[2],36)%158%29-4],36)*.4474+.5|0

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

b36_to_dec(x.length + x[2]) % 158 % 29 - 4

Таблиця хешу

 Latin word           | Length | 3rd | Hash | Decimal | %158 | %29-4
----------------------+--------+-----+------+---------+------+-------
 primus               |      6 | i   | 6i   |     234 |   76 |    14
 secundus             |      8 | c   | 8c   |     300 |  142 |    22
 tertius              |      7 | r   | 7r   |     279 |  121 |     1
 quartus              |      7 | a   | 7a   |     262 |  104 |    13
 quintus              |      7 | i   | 7i   |     270 |  112 |    21
 sextus               |      6 | x   | 6x   |     249 |   91 |     0
 septimus             |      8 | p   | 8p   |     313 |  155 |     6
 octavus              |      7 | t   | 7t   |     281 |  123 |     3
 nonus                |      5 | n   | 5n   |     203 |   45 |    12
 decimus              |      7 | c   | 7c   |     264 |  106 |    15
 undecimus            |      9 | d   | 9d   |     337 |   21 |    17
 duodecimus           |     10 | o   | 10o  |    1320 |   56 |    23
 tertius decimus      |     15 | r   | 15r  |    1503 |   81 |    19
 quartus decimus      |     15 | a   | 15a  |    1486 |   64 |     2
 quintus decimus      |     15 | i   | 15i  |    1494 |   72 |    10
 sextus decimus       |     14 | x   | 14x  |    1473 |   51 |    18
 septimus decimus     |     16 | p   | 16p  |    1537 |  115 |    24
 duodevicesimus       |     14 | o   | 14o  |    1464 |   42 |     9
 undevicesimus        |     13 | d   | 13d  |    1417 |  153 |     4
 vicesimus            |      9 | c   | 9c   |     336 |   20 |    16
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.