Это было весело! Однако с тремя цифрами веселье закончилось слишком рано. Эта задача похожа, но мы продолжим веселье.
Соревнование
Выведите как можно больше цифр Золотого сечения φ. Золотое сечение определяется как число, которое удовлетворяет φ = (φ + 1) / φ, и первые 100 цифр определяются как:
1,6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Эта задача не о вычислении φ! Речь идет о печати как можно большего количества цифр без использования какого-либо метода для этого дважды. Так что найдите как можно больше творческих способов получить свои цифры!
ограничения
Само по себе печатание цифр φ было бы слишком простым, поэтому вот правила:
- Вы должны построить число по порядку слева направо , либо печатая его по частям, либо создавая строку слева направо и печатая ее в конце - вы даже можете сгенерировать массив цифр, а затем соединить его и распечатайте его, пока вы делаете это по порядку. В следующих правилах «печать» и «вывод» могут относиться к любому из этих процессов (например, если вы строите строку, и строка содержит
1.6
то, что считается1.6
уже напечатанным). - За ваш код вы получаете бюджет в 15 символов на цифру . Период не засчитывается в этот бюджет, но также должен быть напечатан. Обратите внимание, что ограничение распространяется только на общий размер кода: вы можете использовать более 15 символов для любой цифры, если вы не используете больше в среднем. На самом деле, вы можете создать «долг» в персонажах и «погасить его» позже. Например, для печати у
1.618
вас есть 60 символов. - Стандартные библиотеки include / import не учитываются в размере кода. Но вы не можете дать эти псевдонимы бесплатно!
- Вы не должны использовать цифру, которую вы в настоящее время генерируете, или те, которые вы уже напечатали. Например,
1
в вашем исходном коде может нигде не появляться, потому что это самая первая цифра. Код, который выводит8
in,1.618
может использовать любую или все цифры[0234579]
, но ни одну из[168]
. Для этой цели все литералы, которые эквивалентны одной цифре, обрабатываются как эта цифра . Так что, если ваш язык может представлять,9
как'\t'
вы не можете использовать это где-либо, где вы не могли бы использовать9
вместо этого. - Вы не должны производить несколько цифр одновременно. Должна быть возможность четко разделить ваш код на куски, которые генерируют одну цифру за раз.
Вы не должны ссылаться на какую - либо встроенную функцию, математический / логический / побитовый / строковый оператор, переменную или константу, которые вы использовали в коде, который сгенерировал более раннюю цифру. Исключением являются преобразование целых чисел в строку, конкатенация строк и функции печати, которые могут вам понадобиться для каждой отдельной цифры. Обратите внимание, что не имеет значения, под каким именем вы ссылаетесь на какое-либо встроенное: просто потому, что вы используете псевдоним встроенного в
PI
обоих,p
иq
это не значит, что вы можете использовать егоp
один раз иq
один раз. Кроме того, вы имеете право использовать имя дважды , если это относится к двум различным встроенным функциям, как строкаlength
и массивlength
.Если ваш язык программирования не имеет функций, используйте ваше лучшее суждение о том, каким будет эквивалент - например, для сценариев bash, при вызове других программ следует соблюдать правила, наложенные на функции
- Ваша заявка должна быть написана на одном языке. Поэтому не нужно выполнять переводчик другого языка, чтобы получить доступ к встроенным языкам.
Последствия
Следующие пункты все подразумеваются вышеуказанными правилами, но я добавляю их здесь, чтобы избежать вопросов, которые уже возникли в песочнице:
- Вам не разрешается перезаписывать части вашего вывода, печатая некоторые пробелы (обычно
'\b'
) между ними. - Циклы, которые генерируют / выводят несколько цифр, запрещены. (Циклы, которые вычисляют одну цифру, все же хорошо.)
- Использование запутанной версии
(1 + √5)/2
или деление чисел Фибоначчи для получения более чем одной цифры запрещено. - Вы не можете предварительно вычислить 10 цифр и сохранить их в 10 переменных, а затем просто ссылаться на них, потому что эти ссылки на переменные не генерируют цифру - код, заполняющий переменную, делает, что является нарушением правила 6.
- Фактически, вы не можете повторно использовать любые предыдущие (или промежуточные результаты), потому что это будет означать, что две цифры будут совместно использовать код для генерации .
- В противном случае вы можете использовать любые средства (которые не должны быть чисто математическими) для генерации цифр. (А ты должен!)
- На самом деле нет необходимости что-либо вычислять, если вы можете извлечь правильные цифры из разных мест, используя вашу стандартную библиотеку.
- Вы можете использовать оператор несколько раз, генерируя одну цифру, поэтому
2+2+2
будет честной игрой генерировать первую цифру6
(хотя она вряд ли самая короткая). - Вы можете использовать любые литералы так часто, как хотите, потому что они не являются встроенными константами. Поэтому до тех пор, пока вам не нужно печатать
5
, вы можете использовать5
в своем коде столько символов, сколько захотите. - Вы не можете жестко закодировать вывод, потому что это будет связано с использованием цифр, которые вы выводите.
Вкратце: не используйте метод генерации цифр дважды и не используйте цифру, которую вы выводите в данный момент или уже напечатали.
Если вы обнаружите лазейку, которая позволяет получить (квази) бесконечный счет, пожалуйста, не разрушайте задачу, используя ее, но дайте мне знать, чтобы я мог увидеть, можно ли исправить лазейку, не нарушая ничего.
счет
Программа, которая печатает наибольшее количество цифр, корректно побеждает. В случае связи более короткий код нарушает связь.
Пожалуйста, добавьте версию без комментариев, которая определяет, какая часть вашего кода генерирует какую цифру.
PS: если кто-то бьет 100 цифр выше, вот еще несколько .
источник
x = (x+1)/x
(илиx^2 = x+1
) (илиx^2-x+1
).Ответы:
PHP, 100 цифр
Я, вероятно, немного изменяю правила, но в PHP есть десятки констант на выбор:
Это, вероятно, не очень переносимый код, но он отлично работает в моей системе. Вот код, который его сгенерировал:
источник
<?for(;;);
использует 9 МБ памяти. Теперь я знаю, почему ... Мне нравится само наложенное ограничение @ kernigh # 7, которое закрывает такую лазейку. Кроме того, что бы это ни стоило, выходные данные в моей системе таковыPerl - 37 цифр
392 байта в настоящее время (10,6 на цифру).
Выход:
Добровольные ограничения
Я добавил несколько дополнительных ограничений, чтобы ограничить использование языковых функций, которые могли бы тривиализировать проблему. Например, разыменование
@{...}
массива и окончательный индекс массива$#{...}
используются только один раз. Каждый массив используется генерируется другим способом (сравните[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). Кроме того, ни один символ или голое слово не используются более одного раза, хотя это явно разрешено в описании вызова. Я думаю, что это хорошая идея для perl (или любого языка со специальными переменными только для int (есть ли другие?)), Потому что он ограничивает количество неявных int-преобразований.Частей
источник
Python 2.7, 19 цифр, 231 соответствующий символ
источник
Ruby 2.1 для 54 цифр, 808 символов
Эта программа работает с
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Системы, отличные от OpenBSD 5.5, могут иметь разные значения для нескольких цифр.Интерпретации
Ограничения этой задачи, особенно ограничение 6, не являются точными для Ruby. Поэтому я добавляю свои собственные интерпретации:
$<.fileno
, а двойное двоеточие получает константы, как вIO::LOCK_NB
. Имя метода или константы является частью операции. Поскольку()
.
::
не являются операторами, я не применяю к ним ограничение 6. Я могу использовать их повторно, чтобы генерировать больше цифр.Array#count
иEnumerable#count
не являются одной и той же функцией для ограничения 6. Оба метода действуют одинаково, ноArray#count
переопределяютEnumerable#count
с другой реализацией. Если я используюArray#count
для создания одной цифры, я могу использоватьEnumerable#count
для создания другой цифры.Mutex.new
,Random.new
,Time.new
и так далее относятся к той же методе,Class#new
. Я использую,SignalException.new
чтобы сгенерировать одну цифру. Из-за ограничения 6 я больше никогда не смогу использоватьClass#new
.Float
иIO
являются константами! Я использую,IO::LOCK_NB
чтобы сгенерировать одну цифру. Из-за ограничения 6 я больше никогда не смогу использоватьIO
. Эта интерпретация связывает только Ruby, а не другие языки, где имена пакетов не являются константами.[]
{}
//
''
. Я всегда могу использовать такие литералы, чтобы генерировать больше цифр.File::APPEND
иIPSocket::LOCK_UN
два имени для одного и того же числа 8. Ограничение 6 говорит: «не имеет значения, под каким именем вы ссылаетесь на какой-либо встроенный». ПотомуFile::APPEND
иIPSocket::LOCK_UN
отличаются только по имени, они должны быть таким же постоянным, поэтому я не могу использовать их для двух цифр.$SAFE
является встроенной глобальной переменной, а не функцией, оператором, константой или литералом.$SAFE
имеет значение 0. С помощью лазейки, я могу использовать повторно,$SAFE
чтобы генерировать каждую цифру 0 в программе. Я закрываю лазейку, интерпретируя ограничение 6 для ограничения глобальных переменных.Комментарии
Первая линия
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Ruby анализирует эту строку и загружает шесть частей своей стандартной библиотеки, как если быrequire 'date'
,require 'digest'
и так далее. Я не считаю эти 56 символов, потому что ограничение 3 исключает «импорт / включение стандартной библиотеки».Остальная часть программы вызывает
print
длинный список аргументов, чтобы преобразовать их в строки и вывести их по порядку. Аргументы таковы:1
from2/2
: Division Fixnum # /.
from?.
: буквенная односимвольная строка6
из9-3
: вычитание Fixnum # -1
от3&5
: поразрядно и Fixnum # &3
снова.8
от2*4
: умножение Fixnum # *0
от2^2
: побитовый эксклюзив или Fixnum # ^3
от7%4
: модуль Fixnum #%3
от55>>4
: сдвиг вправо Fixnum # >>9
от5+4
: дополнение Fixnum # +8
от2<<2
: сдвиг влево Fixnum # <<8
от-~7
: отрицание дополнения Fixnum # - @ Fixnum # ~7
от5|2
: побитовое или Fixnum # |4
от2**2
: возведение в степень Fixnum # **9
от(2r+2+5).to_i
: рациональное сложение Rational # + Rational # to_i2r
новы в Ruby 2.1.2r+2
вызывает Rational # + и возвращает другое рациональное; снова2r+2+5
вызывает Rational # + .2/1
и плавает, как2.0
. Чтобы исправить это, я конвертирую в целое число: to_i округляет до нуля, ceil округляет вверх, этаж округляет вниз.8
от(2.2+5).ceil
: дополнение float Float # + Float # ceil()
и.
снова ставить точки .9
от(55r/5-2).floor
: рациональное деление и вычитание Rational # / Rational # - Rational # floor4
от(2.2*2).to_i
: умножение с плавающей точкой Float # * Float # to_i8
от(2r*2*2).ceil
: рациональное умножение Rational # * Rational # ceil4
от(2.2**2).floor
: рациональное возведение в степень Rational # **8
от2.to_bn<<2
: сдвиг влево с большим числом OpenSSL Fixnum # to_bn OpenSSL :: BN # <<2
from__LINE__
: магическая константа для текущего номера строки0
from$<.to_i
: файловый дескриптор стандартного ввода IO # to_i4
fromIO::LOCK_NB
: флаг для неблокирующей блокировки файлаIO
. По интерпретации 7 я больше не могу использовать какую-либо константу со значением 4.5
fromErrno::EIO::Errno
: номер ошибки ввода / вывода8
fromFile::APPEND
: флаг для добавления в файлIO
, ноFile
наследую от константIO
, такFile::APPEND
что это другой способ получитьIO::APPEND
.6
from'aaaaaa'.size
: длина строки String # size8
from?a.encoding.name.sub(/\D+/,'')
: часть имени кодировки String # encoding Кодировка # name String # sub3
from%w[a a a].size
: длина массива Array # size4
from%w[a b c d].to_set.size
: количество элементов в наборе Array # to_set Set # size3
from%w[a a a].count
: считать все элементы Array # count6
отSocket::AF_NS
: номер для семейства адресов NS5
сDate.jd(Date::ITALY).wday
: номер дня недели для пятницы 15 октября 1582 года, когда Италия перешла на григорианский календарь Date :: jd Date # wday6
от*Digest::MD5.digest(?j).scan(/\d/)
: первая цифра ASCII в двоичном дайджесте MD5 дайджеста "j" :: MD5 :: дайджест String # scan*
Передает элементы массива в качестве аргументовprint
. Этот массив ["6"].3
изSet[?a,?b,?c].count
: считать все элементы Set :: [] Enumerable # count8
отSignalException.new('FPE').signo
: номер SIGFPE Class # new SignalException # signo1
изFloat::ROUNDS
: режим округления, здесь 1 для округления до ближайшего1
сbegin
(новая строка)exit false
(новая строка)rescue Object
(новая строка)$!.status
(новая строка)end
: выход из состояния для сбояSystemExit.new(false).status
, что и в интерпретации 3, я больше не могу называть Class # new . Вместо этого я поднимаю и спасаю SystemExit.7
fromProcess::RLIMIT_NPROC
: номер ограничения ресурса для количества процессов для одного пользователя7
от:aaaaaaa.size
: длина символа символ # размер2
fromPrime.first
: первое простое число Enumerable # first0
from?/.next
: следующая строка после "?" Строка # следующая3
from{a:p,b:p,c:p}.size
: длина хэша Hash # size String # p0
отSTDIN.lineno
: текущий номер строки для стандартного ввода IO # белья$<
. Я используюSTDIN
. Разница в том, что$<
это глобальная переменная иSTDIN
является константой. Программа может установить$<
другой вход, ноSTDIN
всегда имеет исходное значение$<
.3
from?a.crypt('at')[/\d/]
: первая цифра ASCII в зашифрованном пароле String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: индекс первого ключа: a, значение: a в хэше Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: индекс, где строка соответствует / b / Regexp # = ~1
from[?a,?b].index(?b)
: индекс первого "b" в массиве Array # index7
from:aaaaaaab=~/b/
: индекс, где символ соответствует / b / Symbol # = ~9
from?\t.ord
: ASCII значение табуляции "\ t" String # ord8
from'aaaaaaaab'=~/b/
: индекс, где строка соответствует / b / String # = ~0
fromopen(?/).pos
: позиция в файле после открытия корневого каталога "/" в виде файла Kernel # open IO # pos5
from'aaaaab'.index(?b)
: индекс первого "b" в строке String # index7
from?\a.bytes{|b|break b}
: ASCII значение оповещения "\ a" Строка # байт6
from'aaaaaaa'.rindex(?a)
: индекс последнего "a" в строке String # rindex2
from%w[a a].map.size
: размер перечислителя, который отображается из массива Array # map Enumerator # sizeисточник
new
Действительно ли всегда вызывается одна и та же имплементация или она переопределена в подклассах? [ctd.]Java, 21 цифра, 276 символов
источник
7-4
&-4+7
, это умно! :)7
не постоянная, а буквальнаяРубин, 74 знака, 10 цифр
Это только начало; Я должен идти, поэтому я улучшу это позже.
У меня есть 76 символов, сохраненных на потом, когда это станет сложнее!
источник
Рубин, 17 цифр, 168 байтов
Ungolfed:
Я еще не был вынужден делать что-то особенно умное, я могу вернуться и добавить цифры.
источник
succ
иnext
псевдонимы.$.
дважды. Хотя, должен любить$....
: DГольфскрипт , 17 цифр
Простая попытка. В Golfscript может быть много не буквенно-цифровых однобуквенных встроенных модулей, но в целом он не имеет много встроенных модулей!
источник
5,)\; # range, right uncons, flip, and pop
.Баш, 5 цифр в 65 символов
Я скоро обновлю это! На данный момент он просто печатает
1.6180
и не содержит никаких цифр.объяснение
Следующие методы используются для генерации цифр:
1: выход из состояния
false
6: длина строки
1:
nl
злоупотребление8:
kill
номера сигналов0: числовое значение пустого выражения
источник
Mathematica
98 цифр, в868378 символов.Выход:
источник
#
с разрешенной цифрой и отбрасыванием одного из черточек.Юлия - 23 цифры из 345 символов (15 точно за цифру)
Выход: 1.6180339887498948482045
Я интерпретировал символы и строки как пригодные для использования, пока я не использовал повторно определенный символ или строку (символы в строке можно использовать повторно, если строка не использовалась); однако я не позволял себе напрямую использовать значение int символа. Есть один не-ASCII символ (й).
Более читабельным способом (не реальный код):
источник
C ++ 12,4 символа на строку, было 14 символов на строку для каждой цифры
Исправлена моя ошибка повторного использования операторов.
Не уверен, что использование таких символов считается литералами символов или нет? Если этот код приемлем, он может быть продолжен навсегда, и долг будет возвращен.
источник
-
оператор. Также мне нравится, как вы посчитали комментарий для длины строки. : D1
для производства0
(что запрещено, потому что1
появился ранее в золотом сечении). Также вам нужно сосчитать#define S
(не другой), так как это не включение, а просто определение сокращенного псевдонима.