Код-Гольф: послідовність Фарі (I)


10

Виклик

У цьому завданні вам буде дано ціле число N (менше 10 ^ 5), виведіть послідовність Фарі порядку N.

Вхід N задається в один рядок, введення закінчується EOF.

Вхідні дані

4
3
1
2

Вихідні дані

F4 = {0/1, 1/4, 1/3, 1/2, 2/3, 3/4, 1/1}
F3 = {0/1, 1/3, 1/2, 2/3, 1/1}
F1 = {0/1, 1/1}
F2 = {0/1, 1/2, 1/1}

Обмеження

  • Кількість входів не перевищуватиме 10 ^ 6 значень
  • Ви можете використовувати будь-яку мову на ваш вибір
  • Найкоротше рішення виграє!

Це отримає loooong ..... вихід, який я маю на увазі.
st0le

Чи дозволено N = 0?
Ельвекс

4
Що з заголовком »(I)«?
Joey

2
@Joey: Хм. зараз є послідовність Фарі (II). Має бути перше видання! :-)
mellamokb

1
@mellamokb: Хоча, це проблема з кодом, тому жодне зіткнення заголовка в будь-якому випадку. Але так, такий варіант відповідає на моє запитання.
Joey

Відповіді:


5

J, 96

('F',],' = {0/1',', 1/1}',~('r';'/')rplc~', ',"1":"0@(3 :'}./:~~.,(%~}:\)i.1x+y')&".);._2(1!:1)3

( /:~~.,(%~}:\)i.>:x:yдає список; решта - це введення / виведення та форматування (із поганим стилем))

Наприклад:

4
3
1
2
F4 = {0/1, 1/4, 1/3, 1/2, 2/3, 3/4, 1/1}
F3 = {0/1, 1/3, 1/2, 2/3, 1/1}          
F1 = {0/1, 1/1}                         
F2 = {0/1, 1/2, 1/1}  

Правки

  • (114 → 106) Додавання чіткого,
  • (106 → 105) Шапка [:в Ат@
  • (105 → 101) Видалити зайве ":перетворення
  • (101 → 99) Використовуйте інфікс \для списку
  • (99 → 96)

Я отримую |value error: rplc. Ви впевнені, що load 'strings'раніше не ходили на сесії і забули про неї?
Джессі Мілікан

1
@Jesse: абсолютно. Я (майже) ніколи не користуюся 'strings'. Я просто використовую середовище linux-j-7.01 за замовчуванням.
Вісімнадцять

Тьфу ... я перейшов на j602 для wd і тепер мені може знадобитися переключитися назад. :)
Джессі Мілікан

3

Загальний Лісп, 156

(do((l()()))((not(set'n(read()()))))(dotimes(j n)(dotimes(i(1+ j))(push(/(1+ i
)(1+ j))l)))(format t"~&F~D = {0/1~{, ~A~}/1}"n(sort(delete-duplicates l)'<)))

(нові рядки не потрібні)

Дуже жорстоко, але мови з рідними раціоналами - це запрошення до цього.

Неозолоті з коментарями:

                                        ; at each iteration:
(do ((l()()))                           ; - reset l to nil
    ((not (set 'n (read()()))))         ; - read a term (nil for eof)
                                        ;   assign it to n
                                        ;   stop looping if nil
  (dotimes (j n)                        ; for j in 0..n-1
    (dotimes (i (1+ j))                 ;   for i in 0..j
      (push (/ (1+ i) (1+ j)) l)))      ;     prepend i+1/j+1 to l
  (format t "~&F~D = {0/1~{, ~A~}/1}"   ; on a new line, including 0/1,
                                        ; forcing the format for 1
          n                             ; print sequence index, and
          (sort                         ; sorted sequence of
           (delete-duplicates l)        ;   unique fractions
           '<)))                        ; (in ascending order)

3

Пітон, 186 чол

import sys
p=sys.stdout.write
while 1:
 a=0;b=c=x=1;d=y=N=input();p("F%d = {%d/%d, %d/%d"%(d,a,b,c,d))
 while y-1:x=(b+N)/d*c-a;y=(b+N)/d*d-b;p(", %d/%d"%(x,y));a=c;c=x;b=d;d=y
 p("}\n")

+ 1, але ви впевнені, що це буде швидко за 10 ^ 6 кількість входів?
Кіхотичний

@ Debanjan Ні. Це було б дуже повільно для 10 ^ 6 входів. Однак вона є лінійною за складністю (за кількістю термінів).
fR0DDY

2

J, 156 135 117 112

d=:3 :0
wd;'F';(":y);' = {';(}.,(', ';2|.'/';|.)"1(<@":)"0(2)x:/:~~.,(-.@>*%)"0/~i.x:>:y),<'}'
)
d@".;._2(1!:1)3

j602 або подібне (wd ). Вхід на stdin, вихід на stdout.

Все ще спантеличено, як виграти вихідний код, який становить 100 символів.

Редагувати: (156-> 135) Tacit-> явний для довгих монадійних ланцюгів дієслів, менше генерації списку мозкових головок

Редагувати: (135-> 117) Знайдено ріе . Мене взяли досить довго. Перемикається обробка струни навколо.

Редагувати: (117-> 112) Трохи менший спосіб розумного вилучення дробів вище 1. Потрібно відкрити.


Може бути, ви можете опустити одну з двох своїх x:?
Енадкс

@Eelvex: зліва - 2 & x:, наприклад, розділити раціональне число на чисельник і знаменник.
Джессі Мілікан

оїк. Шкода ... :(
Eelvex

2

Гольфскрипт (101)

~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

2

Рубі, 110 108 102 97 94 92 91 89

#!ruby -lp
$_="F#$_ = {#{a=[];1.upto(eval$_){|d|a|=(0..d).map{|n|n.quo d}};a.sort*', '}}"

Я думаю, ви повинні вивести "0/1" та "1/1" замість "0" та "1" відповідно. Також, чи працює це лише для рубіну 1.9?
Ельвекс

1
@Eelvex: Він робить вихід 0/1 та 1/1 у моїй системі. І так, для цього потрібно 1,9 (через буквені символи).
Lowjacker

1

Хаскелл, 148

f n="F"++show n++" = {"++(intercalate", ".("0/1":).map(\(i:%d)->show i++"/"++show d).sort.nub$[i%d|d<-[1..n],i<-[1..d-1]])++"}"
main=interact$f.read
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.