Один OEIS за іншим


95

Станом на 13/03/2018 16:45 UTC, переможець відповісти # 345 , на Scrooble . Це означає, що конкурс офіційно закінчений, але сміливо продовжуйте публікувати відповіді, до тих пір, поки вони дотримуються правил.

Крім того, досить швидко прокричати трійку відповідачів у кількості відповідей:

1. NieDzejkob - 41 відповідь

2. KSmarts - 30 відповідей

3. Hyper Neutrino - 26 відповідей


Це відповідне ланцюгове запитання, яке використовує послідовності від OEIS та тривалість попереднього подання.

Цей ланцюжок відповідей на запитання буде діяти наступним чином:

  • Я опублікую першу відповідь. Усі інші рішення повинні випливати з цього.
  • Наступний користувач (назвемо їх користувачемA) знайде послідовність OEIS, в якій його індексний номер (див. Нижче) такий же, як і довжина мого коду.
  • Використовуючи послідовність, вони повинні кодувати програмою, яка використовує ціле число в якості вводу, n та видає n-е число у цій послідовності.
  • Далі вони розміщують своє рішення після мого, і новий користувач (userB) повинен повторити те саме.

nЙ член послідовності є терміном п раз після того , як перший, що працюють з першим значенням є першим значенням дано на його сторінці OEIS. У цьому питанні ми будемо використовувати 0-індексацію для цих послідовностей. Наприклад, з A000242 та n = 3правильним результатом було б 25 .

Однак!

Це не , тому найкоротший код не має значення. Але довжина вашого коду все ж має вплив. Щоб запобігти дублюванню послідовностей, ваш номер рахунку повинен бути унікальним . Це означає, що жодна інша програма, подана тут, не може бути такою ж довжиною в байтах, як ваша.

Якщо не існує послідовності для подальшої довжини останньої публікації, то послідовність для вашої публікації є найнижчою невикористаною послідовністю. Це означає, що використовувані послідовності також повинні бути унікальними, і що послідовність не може бути такою ж, як ваш номер рахунку.

Після того, як відповідь буде опублікована і нових тижнів відповіді не було розміщено більше тижня, відповідь до останнього розміщеного (той, хто не розірвав ланцюг), виграє.

Вхід і вихід

Застосовуються загальні правила введення та виведення даних. Введення має бути цілим чи строковим поданням цілого числа, а вихід має бути правильним значенням у послідовності.

Форматування

Як і в більшості питань, будь ласка форматувати свою відповідь , як це

# N. language, length, [sequence](link)

`code`

[next sequence](link)

*anything else*

Правила

  • Перш ніж опублікувати відповідь, ви повинні почекати принаймні 1 годину після публікації відповіді.
  • Ви можете не публікувати двічі (або більше) поспіль.
  • Номер індексу послідовності - це число після Aчастини та з вилученими нульовими нулями (наприклад, для A000040номера індексу - 40)
  • Ви можете припустити, що ні вхідний, ні потрібний вихід не будуть виходити за межі чисельного діапазону ваших мов, але, будь ласка, не зловживайте цим, вибираючи мову, наприклад, наприклад, лише номер 1.
  • Якщо довжина вашої подачі перевищує 65536 символів, будь ласка, надайте посилання на спосіб доступу до коду (наприклад, пастина).
  • n ніколи не перевищуватиме 1000 або не вийде за межі послідовності, просто щоб запобігти невідповідності точності не зупиняти мову від змагань.
  • Кожні 150 (дійсних) відповідей збільшується кількість разів використання мови. Таким чином, після розміщення 150 рішень, кожна мова може бути використана двічі (з урахуванням усіх попередніх відповідей). Наприклад, коли було опубліковано 150 відповідей, Python 3 може використовуватися двічі, але через те, що він уже був використаний один раз, це означає, що він може бути використаний лише один раз, поки не буде опубліковано 300 відповідей.
  • Будьте корисні та опублікуйте посилання на наступну послідовність, яка буде використана. Це не потрібно, але це рекомендація.
  • Різні версії мов, наприклад, Python 2 та Python 3 - це різні мови . Як правило, якщо різні версії обидва доступні в програмі Try It Online, вони є різними мовами, але майте на увазі, що це загальне правило, а не жорстка відповідь.
  • Це не заборонено, але, будь ласка, намагайтеся не копіювати код зі сторінки OEIS, а намагайтеся вирішити його.
  • Жорстке кодування дозволено лише в тому випадку, якщо послідовність обмежена. Зауважте, що відповідь, яка спонукала це ( №40 ), є винятком із правила. Кілька відповідей на початку твердого коду ланцюга, але їх можна проігнорувати, оскільки немає користі у видаленні ланцюжка до, скажімо, №100.

Фрагмент ланцюжка відповідей


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

Чи добре, якщо програмі потрібна краща точність з плаваючою комою для вбудованого float/ doubleтипу, щоб отримати значення для більших n?
NieDzejkob

1
@Giuseppe Ні, оскільки ви генеруєте числа, роблячи математику, а не просто розміщуючи їх у масив / рядок
caird coinheringaahing

2
@cairdcoinheringaahing На мою думку, це гарна константа гамми. Він не працює «теоретично» для більшої кількості.
користувач202729

Відповіді:


4

345. brainfuck , 162 байт, A000301

+<<,[>>[>]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[>+>+<<-]>>[<<+>>-]<[<]<-]>>[>]+<[-]++<[>[>>+>+<<<-]>>>[<<<+>>>-]<<[>[>+>+<<-]>>[<<+>>-]<<<-]>[-]>[<<+>>-]<<<<-]>>too golfy.

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

Наступна послідовність!

Це приймає як введення символ з кодовою точкою n(за специфікаціями BF) і виводить таким же чином. Щоб побачити цифри, пропоную використовувати @ Timwi's EsotericIDE .

Пояснення:

+<<,                                  Initialize the tape with the first two Fibonacci numbers. Take loop counter from input.
[                                     n times:
  >>[>]                                 Move to the end of the tape. 
  <<[>>+>+<<<-]>>>[<<<+>>>-]            Add fib(n-2)...
  <<[>+>+<<-]>>[<<+>>-]                 and fib(n-1). Store on the end of the tape.
  <[<]<-                                Move back to start of tape. Update loop counter.
]                                     End loop.
>>[>]+<[-]++<                         Delete the extra Fibonacci number and prepare for exponentiation. 
[                                     fib(n) times:
  >[>>+>+<<<-]>>>[<<<+>>>-]<<           Copy the base (2) to preserve it.
  [>[>+>+<<-]>>[<<+>>-]<<<-]            Multiply what started as a 1 by the base.
  >[-]>[<<+>>-]<<<<-                    Clean up and update loop counter.
]                                     End loop.
>>too golfy.                          Add some bytes, for all sequences <162 had been used. Print result. 

Оскільки це зберігає всі цифри Фібоначчі до важливого, воно не вдасться дійсно для великого введення на обмеженій стрічці.

Це можна значно скоротити за допомогою жорсткого кодування основи (2), але гольф зовсім не проблема.


Коли наступна відповідь (№346) розірвала ланцюжок, ваша відповідь - переможець!
caird coinheringaahing

1
@cairdcoinheringaahing Дякую за це дивовижне завдання. Мене сумно, що це має закінчитися зараз, але як і всі добрі справи у світі, це і закінчилося. Тепер на гольф цей бідний привід для коду, адже зараз це перша відповідь, яку хто побачить, і він повинен бути вражаюче коротким ...
Хулдраесет на'Барія

@Scrooble ви дійсно не можете змінити довжину ...
NieDzejkob

@NieDzejkob Так, але я можу пограти в гольф і додати ще трохи підкладки, щоб зберегти однакову довжину.
Khuldraeseth na'Barya

@cairdcoinheringaahing "зламав ланцюжок"? Що це означає?
Чарівний восьминога Урна

40

22. FiM ++ , 982 байти, A000024

Примітка : якщо ви читаєте це, можливо, вам захочеться сортувати за "найстарішим".

Dear PPCG: I solved A000024!

I learned how to party to get a number using the number x and the number y.
Did you know that the number beers was x?
For every number chug from 1 to y,
  beers became beers times x!
That's what I did.
Then you get beers!
That's all about how to party.

Today I learned how to do math to get a number using the number n.
Did you know that the number answer was 0?
For every number x from 1 to n,
  For every number y from 1 to n,
    Did you know that the number tmp1 was how to party using x and 2?
    Did you know that the number tmp2 was how to party using y and 2?
    Did you know that the number max was how to party using 2 and n?
    tmp2 became tmp2 times 10!
    tmp1 became tmp1 plus tmp2!
    If tmp1 is more than max then: answer got one more.
  That's what I did.
That's what I did.
Then you get answer!
That's all about how to do math.

Your faithful student, BlackCap.

PS:  This is the best answer
PPS: This really is the best answer

Наступна послідовність


10
Хахаха, так важко сміявся через всю справу. +1 за вибір мови :-)
ETHproductions

Дивовижно, прийміть мою підсумку
downrep_nation

22

1. Трикутний , 10 байт, A000217

$\:_%i/2*<

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

Наступна послідовність

Як це працює

Код формується в цей трикутник

   $
  \ :
 _ % i
/ 2 * <

з IP, що починається на $південно-східному напрямку (SE, heh), працює так:

$            Take a numerical input (n);     STACK = [n]
 :           Duplicate it;                   STACK = [n, n]
  i          Increment the ToS;              STACK = [n, n+1]
   <         Set IP to W;                    STACK = [n, n+1]
    *        Multiply ToS and 2ndTos;        STACK = [n(n+1)]
     2       Push 2;                         STACK = [n(n+1), 2]
      /      Set IP to NE;                   STACK = [n(n+1), 2]
       _     Divide ToS by 2ndToS;           STACK = [n(n+1)/2]
        \    Set IP to SE (heh);             STACK = [n(n+1)/2]
         %   Output ToS as number;           STACK = [n(n+1)/2]
          *  Multiply ToS by 2ndToS (no op); STACK = [n(n+1)/2]

13
1. Трикутний, 10 байт, A000217. * переходить за посиланням * A000217 Triangular numbers...
MD XF

22

73. Зоряний , 363 байти, A000252

, +      + *     '.     `
 + + + +  *  *  *  +     
 +`      +*       +    ` 
 + +   +  + +   + *  '   
   +   '  ####`  + +   + 
 + +    ####  +*   +    *
    '  #####  +      + ' 
  `    ######+  + +   +  
+ +   + #########   * '  
 +   +  + #####+ +      +
*  +      + * +  *  *   +
   +  *  + + + +  *  *   
+   +  +   *   + `  + +  
 +  + +   + *'    +    +.

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

Наступна послідовність

Використовується формула " a(n) = n^4 * product p^(-3)(p^2 - 1)*(p - 1)де продукт перебуває над усіма простими рівнями p, які ділять n" від OEIS.

Місяць не є оп, але ей, це не гольф з кодом.


зірки в місяці? хммм
betseg

19

97. Пітон 3 (PyPy) , 1772 байт, A000236

Перш за все, велике спасибі доктору Максу Алексєєву за те, що він був терплячим до мене. Мені дуже пощастило, що мені вдалося зв’язатися з ним електронною поштою, щоб зрозуміти цю проблему. Його відповідь Math.SE тут мені дуже допомогла. Завдяки пшеничному майстру за те, що він мені також допомагав. :)

plist = []

def primes(maximal = -1): # Semi-efficient prime number generator with caching up to a certain max.
	index = plist and plist[-1] or 2
	for prime in plist:
		if prime <= maximal or maximal == -1: yield prime
		else: break
	while index <= maximal or maximal == -1:
		composite = False
		for prime in plist:
			if index % prime == 0:
				composite = True
				break
		if not composite:
			yield index
			plist.append(index)
		index += 1

def modinv(num, mod): # Multiplicative inverse with a modulus
	index = 1
	while num * index % mod != 1: index += 1
	return index

def moddiv(num, dnm, mod):
	return num * modinv(dnm, mod) % mod

def isPowerResidue(num, exp, mod):
	for base in range(mod):
		if pow(base, exp, mod) == num:
			return base
	return False

def compute(power, prime):
	for num in range(2, prime):
		if isPowerResidue(moddiv(num - 1, num, prime), power, prime):
			return num - 1
	return -1

# file = open('output.txt', 'w')

def output(string):
	print(string)
	# file.write(str(string) + '\n')

def compPrimes(power, count):
	maximum = 0
	index = 0
	for prime in getValidPrimes(power, count):
		result = compute(power, prime)
		if result > maximum: maximum = result
		index += 1
		# output('Computed %d / %d = %d%% [result = %d, prime = %d]' % (index, count, (100 * index) // count, result, prime))
	return maximum

def isValidPrime(power, prime):
	return (prime - 1) % power == 0

def getValidPrimes(power, count):
	collected = []
	for prime in primes():
		if isValidPrime(power, prime):
			collected.append(prime)
		if len(collected) >= count:
			return collected
		# output('Collected %d / %d = %d%% [%d]' % (len(collected), count, (100 * len(collected)) // count, prime))

power = int(input()) + 2

output(compPrimes(power, 100))

# file.close()

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

Якщо це дає неправильний результат, просто збільште 100 на щось більше. Я думаю, що 10000 буде працювати на 4, але я залишу комп’ютер працювати протягом ночі, щоб підтвердити це; це може зайняти пару годин.

Зауважте, що частина (PyPy) - це якраз для того, щоб я міг знову використовувати Python. Я дійсно не знаю багатьох інших мов, і я не збираюся намагатися перенести це на Java і ризикую не закінчити вчасно.

Наступна послідовність (Також, будь ласка, не займайтеся більше шаленими математичними матеріалами; у мене не залишилося жодної версії Python, тому хтось інший повинен буде врятувати цю проблему D :)


ну завжди є pypy3
лише для ASCII

15

107. TrumpScript , 1589 байт, A000047

My cat hears everything really well
because with me every cat is a safe cat
Everybody knows that one is 1000001 minus 1000000
but only most of you that two is, one plus one;
As always nothing is, one minus one;
My dog is one year old.
I promise you that as long as you vote on me, nothing will be less cool than a cat;:
Much dog is, dog times two;
Dead cat is, cat minus one;!
I will make dog feel good, food for dog plus one;
Roads can be made using different things. Asphalt is one of them.
As long as Hillary jailed, I love asphalt less than my dog;:
Roads are, always made using asphalt plus one of other things;
I promise my roadways are, two times asphalt than you want;
My roadways are great, always roadways plus one;
Vladimir is nothing more than my friend.
Name of Putin is Vladimir.
As long as, Putin eat less roadways;:
China is nothing interesting.
We all know people speaking Chinese are from China.
As long as, Chinese makes less roads;:
I will make economy, for Putin - Chinese will love me;
If it will mean, economy is asphalt in Russia?;:
I will make cat feel good, cat plus one dollar on food;
Make Vladimir roadways to help Russia economy.
Never make china roads!
I show you how great China is, China plus one; You can add numbers to China.
Like Chinese is, China times China makes sense;
Like Chinese is, two times Chinese letter;!
Make Vladimir happy, Vladimir plus one million dollars;
I also show you how great Putin is, Vladimir times Vladimir; You can do number stuff to Putin too!
I will make asphalt roads a lot!
Everybody say cat. You did it? America is great.

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

Вперше програмування в TrumpScript, можливо, я кілька разів винаходив колесо - для обчислення 2 ^ n присвячено 4 рядки. Я намагався зробити так, щоб це було схоже на те, що міг сказати (п’яний) Трамп. Як бонус, ось сценарій Python, який я написав, щоб переконатися, що я все роблю правильно. У зазначеній програмі є деякі відмінності, але значна частина їх прямо еквівалентна.

cat = int(input())
dog = 2 ** cat + 1
asphalt = 1
cat = 0
while asphalt < dog:
    roads = asphalt + 1
    roadways = 2 * asphalt + 1
    vladimir = 0
    putin = vladimir
    while putin < roadways:
        china = 0
        chinese = china
        while chinese < roads:
            chair = putin - chinese
            if chair == asphalt:
                cat += 1
                vladimir = roadways
                china = roads
            china += 1
            chinese = 2 * china * china
        vladimir += 1
        putin = vladimir * vladimir
    asphalt = roads
print(cat)

Наступна послідовність!


3
I will make cat feel goodO_O
Ділова кішка

На жаль I will make Business Cat feel good, не вийде ...
NieDzejkob

14

30. Пітон 1 , 1112 байт, A000046

def rotations(array):
	rotations = []
	for divider_index in range(len(array)):
		rotations.append(array[divider_index:] + array[:divider_index])
	return rotations

def next(array):
	for index in range(len(array) - 1, -1, -1):
		array[index] = 1 - array[index]
		if array[index]: break
	return array

def reverse(array):
	reversed = []
	for index in range(len(array) - 1, -1, -1):
		reversed.append(array[index])
	return reversed

def primitive(array):
	for index in range(1, len(array)):
		if array == array[:index] * (len(array) / index): return 1
	return 0

def necklaces(size):
	previous_necklaces = []
	array = [0] * size
	necklaces = 0
	for iteration in range(2 ** size):
		if not primitive(array) and array not in previous_necklaces:
			necklaces = necklaces + 1
			for rotation in rotations(array):
				complement = []
				for element in rotation:
					complement.append(1 - element)
				previous_necklaces.append(rotation)
				previous_necklaces.append(complement)
				previous_necklaces.append(reverse(rotation))
				previous_necklaces.append(reverse(complement))
		array = next(array)
	return necklaces

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

Навіть не збираюся заважати на цьому гольф. Гей, це не моя найдовша відповідь Python на цьому сайті!

Наступна послідовність


1
Вітаємо з розшифровкою математики: D
Leaky Nun


@LeakyNun Як я вже говорив, я не намагався займатися гольфом цього лол. Крім того, це не моя найдовша відповідь Python на цьому сайті, так idc: P, але приємно
HyperNeutrino

@LeakyNun І дякую: D Мені знадобилося деякий час, щоб зрозуміти все це
хаха

@LeakyNun 309 байт, оскільки фактичне значення не _має значення; нам просто потрібно повторити це багато разів
HyperNeutrino

13

2. Haskell, 44 байти, A000010

f k|n<-k+1=length.filter(==1)$gcd n<$>[1..n]

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

Наступна послідовність


12
Назва наступної послідовності, хоча ...
абсолютнолюдсько

@totallyhuman бідні кролики ...
Ерік Покірний

Чи повинні ми посилатися на попередній пост?
Leaky Nun

Мене болить, що я зараз не можу гольфу. Я повинен був бути першим,
кого

Що це за наступна послідовність? Я не розумію трьох: P
бета-розпад

13

9. Pyth , 19 байт, A000025

?>Q0sm@_B1-edld./Q1

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

Наступна послідовність

a (n) = кількість розділів n з парним рангом мінус числом з непарним рангом. Ранг перегородки - це її найбільша частина за вирахуванням кількості деталей.


Для тих, хто знає Pyth, я навмисно використовував >Q0замість Qтого, щоб, знаєте, наступною послідовністю був A000019.
Leaky Nun

1
Зі сторінки OEISKeywords: easy,nice
BlackCap

@LeakyNun Так, оскільки в іншому випадку мені доведеться вирішити A000017 ... валово.
Erik the Outgolfer


12

206. Протон , 3275 байт, A000109

# This took me quite a while to write; if it's wrong, please tell me and I'll try to fix it without changing the byte count..

permutations = x => {
	if len(x) == 0 return [ ]
	if len(x) == 1 return [x]
	result = []
	for index : range(len(x)) {
		for permutation : permutations(x[to index] + x[index + 1 to]) {
			result.append([x[index]] + permutation)
		}
	}
	return result
}

adjacency = cycles => {
	cycles = cycles[to]
	size = cycles.pop()
	matrix = [[0] * size for i : range(size)]
	for cycle : cycles {
		i, j, k = cycle[0], cycle[1], cycle[2]
		matrix[i][j] = matrix[i][k] = matrix[j][i] = matrix[j][k] = matrix[k][i] = matrix[k][j] = 1
	}
	return matrix
}

transform = a => [[a[j][i] for j : range(len(a[i]))] for i : range(len(a))]

isomorphic = (a, b) => {
	return any(sorted(b) == sorted(transform(A)) for A : permutations(transform(a)))
}

intersection = (a, b) => [x for x : a if x in b]

union = (a, b) => [x for x : a if x not in b] + list(b)

validate = graph => {
	matrix = adjacency(graph)
	rowsums = map(sum, matrix)
	r = 0
	for s : rowsums if s + 1 < graph[-1] r++
	return 2 || r
}

graphs = nodes => {
	if nodes <= 2 return []
	if nodes == 3 return [[(0, 1, 2), 3]]
	result = []
	existing = []
	for graph : graphs(nodes - 1) {
		graph = graph[to]
		next = graph.pop()
		for index : range(len(graph)) {
			g = graph[to]
			cycle = g.pop(index)
			n = g + [(cycle[0], cycle[1], next), (cycle[1], cycle[2], next), (cycle[2], cycle[0], next), next + 1]
			N = sorted(adjacency(n))
			if N not in existing {
				existing += [sorted(transform(a)) for a : permutations(transform(adjacency(n)))]
				result.append(n)
			}
			for secondary : index .. len(graph) - 1 {
				g = graph[to]
				c1 = g.pop(index)
				c2 = g.pop(secondary)
				q = union(c1, c2)
				g = [k for k : g if len(intersection(k, intersection(c1, c2))) <= 1]
				if len(intersection(c1, c2)) == 2 {
					for i : range(3) {
						for j : i + 1 .. 4 {
							if len(intersection(q[i, j], intersection(c1, c2))) <= 1 {
								g.append((q[i], q[j], next))
							}
						}
					}
				}
				g.append(next + 1)
				N = sorted(adjacency(g))
				if N not in existing {
					existing += [sorted(transform(a)) for a : permutations(transform(adjacency(g)))]
					result.append(g)
				}
				for tertiary : secondary .. len(graph) - 2 {
					g = graph[to]
					c1 = g.pop(index)
					c2 = g.pop(secondary)
					c3 = g.pop(tertiary)
					q = union(union(c1, c2), c3)
					g = [k for k : g if len(intersection(k, intersection(c1, c2))) <= 1 and len(intersection(k, intersection(c2, c3))) <= 1]
					if len(q) == 5 and len(intersection((q1 = intersection(c1, c2)), (q2 = intersection(c2, c3)))) <= 1 and len(q1) == 2 and len(q2) == 2 {
						for i : range(4) {
							for j : i + 1 .. 5 {
								if len(intersection(q[i, j], q1)) <= 1 and len(intersection(q[i, j], q2)) <= 1 {
									g.append((q[i], q[j], next))
								}
							}
						}
						g.append(next + 1)
						N = sorted(adjacency(g))
						if N not in existing {
							existing += [sorted(transform(a)) for a : permutations(transform(adjacency(g)))]
							result.append(g)
						}
					}
				}
			}
		}
	}
	return [k for k : result if max(sum(k[to -1], tuple([]))) + 1 == k[-1] and validate(k)]
}

x = graphs(int(input()) + 3)
print(len(x))

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

Наступна послідовність


Почекайте, ви насправді це зробили? Якщо ви не пишете газету з цими вигадливими програмами і не поговорите з яким-небудь професором, ви передаєте щось класне: P
Стівен

@Stephen Наразі виправлення лол
HyperNeutrino

Це підхід розбиття трикутників, квадратів і п’ятикутників відповідно до рослинних? Схоже, це може бути, але деякі з синтаксису незнайомі.
Пітер Тейлор

1
@PeterTaylor Припускаючи, що я розумію підхід, який ви описуєте, так, він шукає трикутники і розміщує вершину, прилеглу до всіх 3 вершин, або двох сусідніх циклів і видаляє спільне ребро і розміщує вершину, суміжну з усіма 4, однаково для 3 трикутників на п’ятикутнику. Я думаю, що це ви описуєте.
HyperNeutrino


12

308. ENIAC (тренажер) , 3025 байт, A006060

Псевдокод:

repeat{
    M←input
    N←-M
    A←1
    B←253
    while(N<0){
        C←60
        C←C-A
        repeat(194){
            C←C+B
        }
        A←B
        B←C
        N←N+1
    }
    output←A
}

Немає онлайн-симулятора, результат виконання: Введення зчитувача карт Вихід картки

Регістри та константи:

A: 1-2
B: 3-4
C: 5-6
M: 7
N: 8

input: const. A
253: const. J
60: const. K
194: Master programmer decade limit 1B

Програмний потік сигналу та потік даних: Програмний потік сигналу та схема руху даних

Повний "код" на пастібіні або в коментарях HTML у розмітці цієї відповіді, щоб запобігти одночасно прокрутці і досить довгій відповіді. Це весело!

Наступна послідовність


Чи можете ви додати посилання на наступну послідовність, будь ласка
Zacharý

@ Zacharý Посилання знаходиться у пості. Я переміщу його до кінця публікації, щоб було легше знайти.
leo3065

12

15. CJam, 85 байт, A000060

{ee\f{\~\0a*@+f*}:.+}:C;2,qi:Q,2f+{_ee1>{~2*\,:!X*X<a*~}%{CX<}*W=+}fX_0a*1$_C.- .+Q)=

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

Наступна послідовність

Розсічення

OEIS дає

Gf: S (x) + S (x ^ 2) -S (x) ^ 2, де S (x) - генеруюча функція для A000151. - Паб Тер, 12 жовтня 2005 року

де

S(x)=xi11(1xi)2s(i)=xi1(1+xi+x2i+)2s(i)
{           e# Define a block to convolve two sequences (multiply two polynomials)
  ee\f{     e#   Index one and use the other as an extra parameter for a map
    \~\0a*  e#     Stack manipulations; create a sequence of `index` 0s
    @+f*    e#     Shift the extra parameter poly and multiply by the coefficient
  }
  :.+       e#   Fold pointwise add to sum the polys
}:C;        e# Assign the block to C (for "convolve")
2,          e# Initial values of S: S(0) = 0, S(1) = 1
qi:Q        e# Read integer and assign it to Q
,2f+{       e# For X = 2 to Q+1
  _ee1>     e#   Duplicate accumulator of S, index, and ditch 0th term
  {         e#   Map (over notional variable i)
    ~2*\    e#     Double S(i) and flip i to top of stack
    ,:!     e#     Create an array with a 1 and i-1 0s
    X*X<    e#     Replicate X times and truncate to X values
            e#     This gives g.f. 1/(1-x^i) to the first X terms
    a*~     e#     Create 2S(i) copies of this polynomial
  }%
  {CX<}*    e#   Fold convolution and truncation to X terms
  W=+       e#   Append the final coefficient, which is S(X), to the accumulator
}fX
_0a*        e# Pad a copy to get S(X^2)
1$_C        e# Convolve two copies to get S(X)^2
.-          e# Pointwise subtraction
 .+         e# Pointwise addition. Note the leading space because the parser thinks
            e# -. is an invalid number
Q)=         e# Take the term at index Q+1 (where the +1 adjusts for OEIS offset)

На 1 хвилину і 33 секунди попереду мене ... поки я надрукував пояснення
Leaky Nun

11

67. LOLCODE , 837 байт, A000043

HAI 1.2
  CAN HAS STDIO?

  I HAS A CONT ITZ 0
  I HAS A ITRZ ITZ 1
  I HAS A NUMBAH
  GIMMEH NUMBAH
  NUMBAH R SUM OF NUMBAH AN 1

  IM IN YR GF
    ITRZ R SUM OF ITRZ AN 1

    I HAS A PROD ITZ 1
    IM IN YR MOM UPPIN YR ASS WILE DIFFRINT ITRZ AN SMALLR OF ITRZ AN ASS
      PROD R PRODUKT OF PROD AN 2
    IM OUTTA YR MOM
    PROD R DIFF OF PROD AN 1

    I HAS A PRAIME ITZ WIN
    I HAS A VAR ITZ 1
    IM IN YR MOM
      VAR R SUM OF VAR AN 1
      BOTH SAEM VAR AN PROD, O RLY?
        YA RLY, GTFO
      OIC
      BOTH SAEM 0 AN MOD OF PROD AN VAR, O RLY?
        YA RLY
          PRAIME R FAIL
          GTFO
      OIC
    IM OUTTA YR MOM

    BOTH SAEM PRAIME AN WIN, O RLY?
      YA RLY, CONT R SUM OF CONT AN 1
    OIC

    BOTH SAEM NUMBAH AN CONT, O RLY?
      YA RLY, GTFO
    OIC
  IM OUTTA YR GF

  VISIBLE ITRZ
KTHXBYE

Мій ключ блокування має втекти, тому я написав всю цю річ, утримуючи зсув ..

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

Наступна послідовність


+1 за використанняPRAIME
Leaky Nun

3
Ви програміст, ви могли це записати, а потім запустити його через сценарій Python, який upperби сказав:
Stephen

5
@StepHen Або просто gggUGу vim, де я це написав, але я не такий розумний
BlackCap

10

10. Магма, 65 байт, A000019

f:=function(n);return NumberOfPrimitiveGroups(n+1);end function;

Спробуйте тут

LOL вбудований

Наступна послідовність


@ETHproductions :) немає проблем, дякую сторінку OEIS, хоча у неї є точний вбудований там
хаха

4
; _; Я вирішив A000064 і ти змінив його. Захищений.
Leaky Nun

Мій боже, стільки послідовностей розділів
ETHproductions

Я випадково вирішив A007317 , намагаючись зробити це в Python ( TIO ): P
ETHproductions

Повторно запрошено! \ o /
Лина монашка


9

121. Піп , 525 байт, A000022

n:(a+1)//2
t:[[0]RL(3*a+3)PE1]
Fh,n{
  m:([0]RL(3*a+3))
  Fi,(a+1){
    Fj,(a+1){
      Fk,(a+1)m@(i+j+k)+:(t@h@i)*(t@h@j)*(t@h@k)
      m@(i+2*j)+:3*(t@h@i)*(t@h@j)
    }
    m@(3*i)+:2*(t@h@i)
  }
  t:(tAE(m//6PE1))
}
k:t@n
o:0
Fh,aFi,aFj,aI(h+i+j<a)o+:(k@h)*(k@i)*(k@j)*k@(a-1-h-i-j)
Fh,((a+1)//2){
  Fi,aI(2*h+i<a){o+:6*(k@h)*(k@i)*(k@(a-1-2*h-i))}
  I(a%2=1)o+:3*(k@h)*(k@((a-1-2*h)//2))
}
Fh,((a+2)//3)o+:8*(k@h)*(k@(a-1-3*h))
I(a%4=1)o+:6*k@(a//4)
o//:24
Ia(o+:t@n@a)
Fh,nFj,(a+1)o-:(t@(h+1)@j-t@h@j)*(t@(h+1)@(a-j))
o

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

Наступна послідовність

Забавний факт: коли виклик був вперше опублікований, я склав список невеликих неприємних порядкових номерів, на які хотів прагнути CJam, і A000022 опинився у верхній частині списку.

Це реалізує функцію генерації, описану в EM Rains та NJA Sloane, Про перерахування Кейлі Алканів (або 4-Валентових дерев) , Journal of Integer Sequences, Vol. 2 (1999), беручи суму до стільки доданків, скільки необхідно для фіксації коефіцієнта, а потім телескопізували три чверті суми. Зокрема, телескопізація першої половини означає, що індекс циклу повинен застосовуватися лише до одного, а не до всіх.CknS4Th

Код розбивається як

; Calculate the relevant T_h
t:[[0]RL(3*a+3)PE1]
Fh,n{
  m:([0]RL(3*a+3))
  Fi,(a+1){
    Fj,(a+1){
      Fk,(a+1)m@(i+j+k)+:(t@h@i)*(t@h@j)*(t@h@k)
      m@(i+2*j)+:3*(t@h@i)*(t@h@j)
    }
    m@(3*i)+:2*(t@h@i)
  }
  t:(tAE(m//6PE1))
}

; Calculate the cycle index of S_4 applied to the last one
k:t@n
o:0
Fh,aFi,aFj,aI(h+i+j<a)o+:(k@h)*(k@i)*(k@j)*k@(a-1-h-i-j)
Fh,((a+1)//2){
  Fi,aI(2*h+i<a){o+:6*(k@h)*(k@i)*(k@(a-1-2*h-i))}
  I(a%2=1)o+:3*(k@h)*(k@((a-1-2*h)//2))
}
Fh,((a+2)//3)o+:8*(k@h)*(k@(a-1-3*h))
I(a%4=1)o+:6*k@(a//4)
o//:24

; Handle the remaining convolution,
; pulling out the special case which involves T_{-2}
Ia(o+:t@n@a)
Fh,nFj,(a+1)o-:(t@(h+1)@j-t@h@j)*(t@(h+1)@(a-j))

Зауважте, що це моя перша в історії програма Pip, тому, мабуть, не дуже ідіоматично.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

9

156. C # (моно), 2466 байт, A000083

Примітка: оцінка становить 2439 байт для коду та 27 для прапора компілятора -reference:System.Numerics.

using Num = System.Numerics.BigInteger;
namespace PPCG
{
    class A000083
    {
        static void Main(string[] a)
        {
            int N = int.Parse(a[0]) + 1;

            var phi = new int[N + 1];
            for (int i = 1; i <= N; i++)
                phi[i] = 1;
            for (int p = 2; p <= N; p++)
            {
                if (phi[p] > 1) continue;
                for (int i = p; i <= N; i += p)
                    phi[i] *= p - 1;
                int pa = p * p;
                while (pa <= N)
                {
                    for (int i = pa; i <= N; i += pa)
                        phi[i] *= p;
                    pa *= p;
                }
            }

            var aik = new Num[N + 1, N + 1];
            var a035350 = new Num[N + 1];
            var a035349 = new Num[N + 1];
            aik[0, 0] = aik[1, 1] = a035350[0] = a035350[1] = a035349[0] = a035349[1] = 1;
            for (int n = 2; n <= N; n++)
            {
                // A000237 = EULER(A035350)
                Num nbn = 0;
                for (int k = 1; k < n; k++)
                    for (int d = 1; d <= k; d++)
                        if (k % d == 0) nbn += d * a035350[d] * aik[1, n - k];
                aik[1, n] = nbn / (n - 1);

                // Powers of A000237 are used a lot
                for (int k = 2; k <= N; k++)
                    for (int i = 0; i <= n; i++)
                        aik[k, n] += aik[k - 1, i] * aik[1, n - i];

                // A035350 = BIK(A000237)
                Num bn = 0;
                for (int k = 1; k <= n; k++)
                {
                    bn += aik[k, n];
                    if (k % 2 == 1)
                        for (int i = n & 1; i <= n; i += 2)
                            bn += aik[1, i] * aik[k / 2, (n - i) / 2];
                    else if (n % 2 == 0)
                        bn += aik[k / 2, n / 2];
                }
                a035350[n] = bn / 2;

                // A035349 = DIK(A000237)
                Num dn = 0;
                for (int k = 1; k <= n; k++)
                {
                    // DIK_k is Polyà enumeration with the cyclic group D_k
                    // The cycle index for D_k has two parts: C_k and what Bower calls CPAL_k
                    // C_k
                    Num cikk = 0;
                    for (int d = 1; d <= k; d++)
                        if (k % d == 0 && n % d == 0)
                            cikk += phi[d] * aik[k / d, n / d];
                    dn += cikk / k;

                    // CPAL_k
                    if (k % 2 == 1)
                        for (int i = 0; i <= n; i += 2)
                            dn += aik[1, n - i] * aik[k / 2, i / 2];
                    else
                    {
                        Num cpalk = 0;
                        for (int i = 0; i <= n; i += 2)
                            cpalk += aik[2, n - i] * aik[k / 2 - 1, i / 2];
                        if (n % 2 == 0)
                            cpalk += aik[k / 2, n / 2];
                        dn += cpalk / 2;
                    }
                }
                a035349[n] = dn / 2;
            }

            // A000083 = A000237 + A035350 - A000237 * A035349
            var a000083 = new Num[N + 1];
            for (int i = 0; i <= N; i++)
            {
                a000083[i] = aik[1, i] + a035349[i];
                for (int j = 0; j <= i; j++) a000083[i] -= aik[1, j] * a035350[i - j];
            }

            System.Console.WriteLine(a000083[N - 1]);
        }
    }
}

Інтернет демо . Це повна програма, яка приймає дані з командного рядка.

Наступна послідовність

Розсічення

Я слідую за коментарем Боуена в OEIS, що функція генерування, A000083(x) = A000237(x) + A035349(x) - A000237(x) * A035350(x)де функції, що генерують компоненти, пов'язані перетвореннями як

  • A000237(x) = x EULER(A035350(x))
  • A035350(x) = BIK(A000237(x))
  • A035349(x) = DIK(A000237(x))

Я використовую визначення BIKта DIKз https://oeis.org/transforms2.html, але формули, здається, мають ряд помилок. Я виправив LPALбез особливих труднощів і самостійно вивів формулу, DIKзасновану на застосуванні переліку Pólya до індексу циклу двогранної групи . Між 121 і # 156 я багато дізнаюся про перерахування Pólya. Я подав кілька помилок , які можуть виявитися корисними для інших людей, якщо ці перетворення знову з’являться в ланцюжку.



8

13. VB.NET (.NET 4.5), 1246 байт, A000131

Public Class A000131
    Public Shared Function Catalan(n As Long) As Long
        Dim ans As Decimal = 1
        For k As Integer = 2 To n
            ans *= (n + k) / k
        Next
        Return ans
    End Function
    Shared Function Answer(n As Long) As Long

        n += 7

        Dim a As Long = Catalan(n - 2)

        Dim b As Long = Catalan(n / 2 - 1)
        If n Mod 2 = 0 Then
            b = Catalan(n / 2 - 1)
        Else
            b = 0
        End If

        Dim c As Long = Catalan(n \ 2 - 1) ' integer division (floor)

        Dim d As Long
        If n Mod 3 = 0 Then
            d = Catalan(n / 3 - 1)
        Else
            d = 0
        End If

        Dim e As Long = Catalan(n / 4 - 1)
        If n Mod 4 = 0 Then
            e = Catalan(n / 4 - 1)
        Else
            e = 0
        End If

        Dim f As Long = Catalan(n / 6 - 1)
        If n Mod 6 = 0 Then
            f = Catalan(n / 6 - 1)
        Else
            f = 0
        End If

        Return (
                    a -
                    (n / 2) * b -
                    n * c -
                    (n / 3) * d +
                    n * e +
                    n * f
                ) /
                (2 * n)
    End Function
End Class

A001246

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


8

91. Python 2 (PyPy) , 1733 байт, A000066

import itertools

girth = int(input()) + 3

v = 4

r = range

def p(v):
	a = [0 for i in r(v)]
	k = int((v * 2) ** .5)
	a[k - 1] = a[k - 2] = a[k - 3] = 1
	j = len(a) - 1
	for i in r(1, 3):
		a[j] = 1
		j -= i
	yield [x for x in a]
	while not all(a):
		for index in r(len(a) - 1, -1, -1):
			a[index] ^= 1
			if a[index]: break
		yield [x for x in a]

def wrap_(p, v):
	m = [[0 for j in r(v)] for i in r(v)]
	k = 0
	for i in r(0, v - 1):
		for j in r(i + 1, v):
			m[i][j] = m[j][i] = p[k]
			k += 1
	return m

def completes_cycle(edgelist):
	if not edgelist or not edgelist[1:]: return False
	start = edgelist[0]
	edge = edgelist[0]
	e = [x for x in edgelist]
	edgelist = edgelist[1:]
	while edgelist:
		_edges = [_edge for _edge in edgelist if _edge[0] in edge or _edge[1] in edge]
		if _edges:
			edgelist.remove(_edges[0])
			if _edges[0][1] in edge: _edges[0] = (_edges[0][1], _edges[0][0])
			edge = _edges[0]
		else:
			return False
	flat = sum(e, ())
	for i in flat:
		if flat.count(i) != 2: return False
	return edge[1] in start

def powerset(a):
	return sum([list(itertools.combinations(a, t)) for t in r(len(a))], [])

while True:
	ps = (v * (v - 1)) // 2
	skip = False
	for Q in p(ps):
		m = wrap_(Q, v)
		output = [row + [0] for row in m]
		output.append([0 for i in r(len(m[0]))])
		for i in r(len(m)):
			output[i][-1] = sum(m[i])
			output[-1][i] = sum(row[i] for row in m)
		if all(map(lambda x: x == 3, map(sum, m))):
			edges = []
			for i in r(v):
				for j in r(i, v):
					if m[i][j]: edges.append((i, j))
			for edgegroup in powerset(edges):
				if completes_cycle(list(edgegroup)):
					if len(edgegroup) == girth:
						print(v)
						exit(0)
					else:
						skip = True
						break
		if skip: break
	v += 1

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

Я сподіваюся, що використання Python 2 PyPy вважається ще однією основною версією. Якщо хтось міг би отримати мені інтерпретатора Python 0, я також міг би скористатися цим, але сподіваюся, що це справедливо.

Це починається з 1 вершини і працює вгору, створюючи матричне представлення суміжності кожного можливого непрямого графа з такою кількістю вершин. Якщо він є тривалентним, то він буде дивитись через набір ребер, які будуть відсортовані за довжиною. Якщо перший цикл, який він знайде, занадто короткий, то він рухатиметься далі. Якщо перший цикл, який він знайде, відповідає вхідному (зсув на 3), то він виведе правильний підрахунок вершин і припинить.

Наступна послідовність <- мати простий як відрив від усієї цієї математичної дурниці: D

EDIT : Я додав кілька оптимізацій, щоб зробити його трохи швидшим (все ще не можу обчислити третій термін у межах 60-секундного ліміту TIO), не змінюючи рахунок рахунку.


... і я серйозно думав, що ланцюг закінчиться відповіддю 90
pppery

1
@ppperry :) Мені подобається робити важкі виклики, тому що більшість людей навіть не можуть прийняти рішення, тому мені не потрібно турбуватися про те, щоб перемогтись :) (наприклад, проблема з намер вуглецевого ланцюга)
HyperNeutrino

Якщо хтось не прийме ваше рішення і не перетворить його на більш стильну мову
pppery

@ppperry that too o_O: P
HyperNeutrino

1
@HyperNeutrino Вітаю! Я хвилювався, що розірвав ланцюг, і розглядав можливість підрахунку байтів, щоб вказати на іншу послідовність. Хороша робота!
Скотт Мілнер

8

232. Funky , 326 330 332 байт, A000938

function gcd (a, b) {
    while (b != 0) {
        c = a % b;
        a = b;
        b = c;
    };
    return a;
}

function A000938 (n) {
    n = n + 2;
    ans = 0;
    for (m = 2; m <= n; ++m) {
        for (k = 2; k <= n; ++k) {
            ans = ans + (((n - k) + 1) * ((n - m) + 1) * gcd(k - 1, m - 1));
        }
    }
    ans = (2 * ans) - (
        (n*n) *
        ((n*n)-1) / 6
    );
    return ans;
}

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

Поліглот з Javascript. Спробуйте в Інтернеті!

Наступна послідовність .


Використовуйте формулу на сторінці OEIS для O(n^2 log n)складності, а не наївної O(n^6).

Швидке пояснення:

  • Цей код використовує формулу, a[n_] := 2*Sum[(n - k + 1)*(n - m + 1)*GCD[k - 1, m - 1], {m, 2, n}, {k, 2, n}] - n^2*((n^2 - 1)/6)описану в розділі коду Mathematica.
  • Доказ формули:

    • Формула рівнозначна цій .

    • Нехай розмір обмежувальної коробки має три точки m * k. Розглянемо 2 випадки:

      • k != 0та m != 0: Існує 2 способи вибору орієнтації трьох точок ( \або /), gcd(k-1, m-1)-1способів вибору точки між іншими 2 пунктами та (n - k) × (n - m)способів вибору положення обмежувального поля.
      • k == 0або m == 0: Є два способи вибору орієнтації ( |або -), nспособів вибору рядка / стовпця, на якому лежать точки, та Binomial[n, 3] == (n*(n-1)*(n-2)) / 6способів вибору точок у цьому рядку / стовпці.

Деякі примітки поліглоту:

  • У Фенкі насправді немає ключового слова return. Однак, як пояснив ATaco , [Funky] вважає returnзмінною. Тож він аналізує той вираз, який зручно нічого не робити, а потім аналізує наступний вираз. І це використовується як вихід.
  • Javascript використовується ^як побітовий xor, на відміну від Funky, який використовується ^в якості експоненції. Тому n*nїх потрібно використовувати замість того, n^2щоб забезпечити сумісність Javascript.
  • У фанк, весь оператор ( +, -, *і т.д.) має однаковий пріоритет і правоассоціатівние, тому висловлювання повинні бути в круглих дужках правильно.

1
+1 не сподівався на поліглот.
Атако

Пентагонії немає, але шестикутник добре підходить.
NieDzejkob

Цей рахунок був використаний вже ... посилання
NieDzejkob

Отже, щоб виправити проблему з рахунковим рахунком, чи можете ви відповісти на 330 байт? Я впораюся з рештою.
NieDzejkob

[Відповідь додано до 332 байтів через проблеми, що конфліктують між двома видами, дивіться це повідомлення в чаті ]
користувач202729

8

11. Парі / GP, 64 байти, A000065

{a(n) = if( n<0, 0, polcoeff ( 1 / eta(x + x*O(x^n) ), n) - 1)};

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

Наступна послідовність


Це дійсний вхід?
Лина монашка

Чи довелося дістати 64 байтам? : P
повністюлюдський

@totallyhuman так:;_; I solved A000064 and you changed it. Downvoted.
Стівен

@totallyhuman компрометує лол. дивіться чат
HyperNeutrino


8

281. Java 5, 11628 байт, A000947

// package oeis_challenge;

import java.util.*;
import java.lang.*;

class Main {

//  static void assert(boolean cond) {
//      if (!cond)
//          throw new Error("Assertion failed!");
//  }

    /* Use the formula a(n) = A000063(n + 2) - A000936(n).
    It's unfair that I use the formula of "number of free polyenoid with n
    nodes and symmetry point group C_{2v}" (formula listed in A000063)
    without understanding why it's true...
    */

    static int catalan(int x) {
        int ans = 1;
        for (int i = 1; i <= x; ++i)
            ans = ans * (2*x+1-i) / i;
        return ans / -~x;
    }

    static int A63(int n) {
        int ans = catalan(n/2 - 1);
        if (n%4 == 0) ans -= catalan(n/4 - 1);
        if (n%6 == 0) ans -= catalan(n/6 - 1);
        return ans;
    }

    static class Point implements Comparable<Point> {
        final int x, y;
        Point(int _x, int _y) {
            x = _x; y = _y;
        }

        /// @return true if this is a point, false otherwise (this is a vector)
        public boolean isPoint() {
            return (x + y) % 3 != 0;
        }

        /// Translate this point by a vector.
        public Point add(Point p) {
            assert(this.isPoint() && ! p.isPoint());
            return new Point(x + p.x, y + p.y);
        }

        /// Reflect this point along x-axis.
        public Point reflectX() {
            return new Point(x - y, -y);
        }

        /// Rotate this point 60 degrees counter-clockwise.
        public Point rot60() {
            return new Point(x - y, x);
        }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Point)) return false;
            Point p = (Point) o;
            return x == p.x && y == p.y;
        }

        @Override
        public int hashCode() {
            return 21521 * (3491 + x) + y;
        }

        public String toString() {
            // return String.format("(%d, %d)", x, y);
            return String.format("setxy %d %d", x * 50 - y * 25, y * 40);
        }

        public int compareTo(Point p) {
            int a = Integer.valueOf(x).compareTo(p.x);
            if (a != 0) return a;
            return Integer.valueOf(y).compareTo(p.y);
        }

        /// Helper class.
        static interface Predicate {
            abstract boolean test(Point p);
        }

        static abstract class UnaryFunction {
            abstract Point apply(Point p);
        }

    }

    static class Edge implements Comparable<Edge> {
        final Point a, b; // guarantee a < b
        Edge(Point x, Point y) {
            assert x != y;
            if (x.compareTo(y) > 0) { // y < x
                a = y; b = x;
            } else {
                a = x; b = y;
            }
        }

        public int compareTo(Edge e) {
            int x = a.compareTo(e.a);
            if (x != 0) return x;
            return b.compareTo(e.b);
        }
    }

    /// A graph consists of multiple {@code Point}s.
    static class Graph {
        private HashMap<Point, Point> points;

        public Graph() {
            points = new HashMap<Point, Point>();
        }

        public Graph(Graph g) {
            points = new HashMap<Point, Point>(g.points);
        }

        public void add(Point p, Point root) {
            assert(p.isPoint());
            assert(root.isPoint());
            assert(p == root || points.containsKey(root));
            points.put(p, root);
        }

        public Graph map(Point.UnaryFunction fn) {
            Graph result = new Graph();
            for (Map.Entry<Point, Point> pq : points.entrySet()) {
                Point p = pq.getKey(), q = pq.getValue();
                assert(p.isPoint()) : p;
                assert(q.isPoint()) : q;
                p = fn.apply(p); assert(p.isPoint()) : p;
                q = fn.apply(q); assert(q.isPoint()) : q;
                result.points.put(p, q);
            }
            return result;
        }

        public Graph reflectX() {
            return this.map(new Point.UnaryFunction() {
                public Point apply(Point p) {
                    return p.reflectX();
                }
            });
        }

        public Graph rot60() {
            return this.map(new Point.UnaryFunction() {
                public Point apply(Point p) {
                    return p.rot60();
                }
            });
        }

        @Override
        public boolean equals(Object o) {
            if (o == null) return false;
            if (o.getClass() != getClass()) return false;
            Graph g = (Graph) o;
            return points.equals(g.points);
        }

        @Override
        public int hashCode() {
            return points.hashCode();
        }

        Graph[] expand(Point.Predicate fn) {
            List<Graph> result = new ArrayList<Graph>();

            for (Point p : points.keySet()) {
                int[] deltaX = new int[] { -1, 0, 1, 1,  0, -1};
                int[] deltaY = new int[] {  0, 1, 1, 0, -1, -1};
                for (int i = 6; i --> 0;) {
                    Point p1 = new Point(p.x + deltaX[i], p.y + deltaY[i]);
                    if (points.containsKey(p1) || !fn.test(p1)
                        || !p1.isPoint()) continue;

                    Graph g = new Graph(this);
                    g.add(p1, p);
                    result.add(g);
                }
            }

            return result.toArray(new Graph[0]);
        }

        public static Graph[] expand(Graph[] graphs, Point.Predicate fn) {
            Set<Graph> result = new HashSet<Graph>();

            for (Graph g0 : graphs) {
                Graph[] g = g0.expand(fn);
                for (Graph g1 : g) {
                    if (result.contains(g1)) continue;
                    result.add(g1);
                }
            }

            return result.toArray(new Graph[0]);
        }

        private Edge[] edges() {
            List<Edge> result = new ArrayList<Edge>();
            for (Map.Entry<Point, Point> pq : points.entrySet()) {
                Point p = pq.getKey(), q = pq.getValue();
                if (p.equals(q)) continue;
                result.add(new Edge(p, q));
            }
            return result.toArray(new Edge[0]);
        }

        /**
         * Check if two graphs are isomorphic... under translation.
         * @return {@code true} if {@code this} is isomorphic
         * under translation, {@code false} otherwise.
         */
        public boolean isomorphic(Graph g) {
            if (points.size() != g.points.size()) return false;
            Edge[] a = this.edges();
            Edge[] b = g.edges();
            Arrays.sort(a);
            Arrays.sort(b);

            // for (Edge e : b)
                // System.err.println(e.a + " - " + e.b);
            // System.err.println("------- >><< ");

            assert (a.length > 0);
            assert (a.length == b.length);
            int a_bx = a[0].a.x - b[0].a.x, a_by = a[0].a.y - b[0].a.y;
            for (int i = 0; i < a.length; ++i) {
                if (a_bx != a[i].a.x - b[i].a.x || 
                    a_by != a[i].a.y - b[i].a.y) return false;
                if (a_bx != a[i].b.x - b[i].b.x || 
                    a_by != a[i].b.y - b[i].b.y) return false;
            }

            return true;
        }

        // C_{2v}.
        public boolean correctSymmetry() {

            Graph[] graphs = new Graph[6];
            graphs[0] = this.reflectX();
            for (int i = 1; i < 6; ++i) graphs[i] = graphs[i-1].rot60();
            assert(graphs[5].rot60().isomorphic(graphs[0]));
            int count = 0;
            for (Graph g : graphs) {
                if (this.isomorphic(g)) ++count;
                // if (count >= 2) {
                    // return false;
                // }
            }
            // if (count > 1) System.err.format("too much: %d%n", count);
            assert(count > 0);
            return count == 1; // which is, basically, true
        }

        public void reflectSelfType2() {
            Graph g = this.map(new Point.UnaryFunction() {
                public Point apply(Point p) {
                    return new Point(p.y - p.x, p.y);
                }
            });

            Point p = new Point(1, 1);
            assert (p.equals(points.get(p)));

            points.putAll(g.points);

            assert (p.equals(points.get(p)));
            Point q = new Point(0, 1);
            assert (q.equals(points.get(q)));
            points.put(p, q);
        }

        public void reflectSelfX() {
            Graph g = this.reflectX();
            points.putAll(g.points); // duplicates doesn't matter
        }

    }

    static int A936(int n) {
        // if (true) return (new int[]{0, 0, 0, 1, 1, 2, 4, 4, 12, 10, 29, 27, 88, 76, 247, 217, 722, 638, 2134, 1901, 6413})[n];

        // some unreachable codes here for testing.
        int ans = 0;

        if (n % 2 == 0) { // reflection type 2. (through line 2x == y)
            Graph[] graphs = new Graph[1];
            graphs[0] = new Graph();

            Point p = new Point(1, 1);
            graphs[0].add(p, p);

            for (int i = n / 2 - 1; i --> 0;)
                graphs = Graph.expand(graphs, new Point.Predicate() {
                    public boolean test(Point p) {
                        return 2*p.x > p.y;
                    }
                });

            int count = 0;
            for (Graph g : graphs) {
                g.reflectSelfType2();
                if (g.correctSymmetry()) {
                    ++count;

                    // for (Edge e : g.edges())
                        // System.err.println(e.a + " - " + e.b);
                    // System.err.println("------*");

                    }
                // else System.err.println("Failed");
            }

            assert (count%2 == 0);

            // System.err.println("A936(" + n + ") count = " + count + " -> " + (count/2));

            ans += count / 2;

        }

        // Reflection type 1. (reflectX)

        Graph[] graphs = new Graph[1];
        graphs[0] = new Graph();

        Point p = new Point(1, 0);
        graphs[0].add(p, p);

        if (n % 2 == 0) graphs[0].add(new Point(2, 0), p);

        for (int i = (n-1) / 2; i --> 0;)
            graphs = Graph.expand(graphs, new Point.Predicate() {
                public boolean test(Point p) {
                    return p.y > 0;
                }
            });

        int count = 0;
        for (Graph g : graphs) {
            g.reflectSelfX();
            if (g.correctSymmetry()) {
                ++count;
                // for (Edge e : g.edges())

                    // System.err.printf(

                // "pu %s pd %s\n"
                // // "%s - %s%n"

                // , e.a, e.b);
                // System.err.println("-------/");

            }
            // else System.err.println("Failed");
        }

        if(n % 2 == 0) {
            assert(count % 2 == 0);
            count /= 2;
        }
        ans += count;

        // System.err.println("A936(" + n + ") = " + ans);

        return ans;
    }

    public static void main(String[] args) {

        // Probably
        if (! "1.5.0_22".equals(System.getProperty("java.version"))) {
            System.err.println("Warning: Java version is not 1.5.0_22");
        }

        // A936(6);

        for (int i = 0; i < 20; ++i)
            System.out.println(i + " | " + (A63(i+9) - A936(i+7)));
        //A936(i+2);
    }
}

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


Бічна примітка:

  1. Тестується локально за допомогою Java 5. (так, що попередження не друкується - див. Вкладку налагодження TIO)
  2. Не варто. Колись. Використовуйте. Java. 1. Це більш багатослівно, ніж Java взагалі.
  3. Це може зламати ланцюг.
  4. Розрив (7 днів і 48 хвилин) не більше ніж проміжок, створений цією відповіддю , який на 7 днів і 1 годину 25 хвилин пізніше попереднього .
  5. Новий рекорд на великий рахунок! Оскільки я (помилково?) Використовую пробіли замість вкладок, кількість рахунків перевищує необхідну. На моїй машині це 9550 байт. (на момент написання цієї редакції)
  6. Наступна послідовність .
  7. Код у своєму нинішньому вигляді друкує лише перші 20 термінів послідовності. Однак її легко змінити, щоб вона надрукувала перші 1000 елементів (змінивши 20вказівку for (int i = 0; i < 20; ++i)на 1000)

Так! Це може обчислити більше термінів, ніж зазначено на сторінці OEIS! (вперше для завдання мені потрібно використовувати Java), якщо в OEIS десь більше термінів ...


Швидке пояснення

Пояснення опису послідовності.

Послідовність запитують кількість вільного непланарного поліеноїда з симетрією групи C 2v , де:

  • поліеноїд: (математична модель поліенових вуглеводнів) дерева (або в виродженому випадку, одна вершина) з можуть бути вбудовані в шестикутну решітку.

Наприклад, розглянемо дерева

      O                O           O      O       (3)
      |                 \         /        \
      |                  \       /          \
O --- O --- O             O --- O            O --- O
      |                                             \
      |                    (2)                       \
 (1)  O                                               O

Перший не може бути вбудований у шестикутну решітку, а другий -. Саме конкретне вбудовування вважається відмінним від третього дерева.

  • непланарний поліеноїд: вбудовування дерев таким чином, що існує дві вершини, що перекриваються.

(2)а (3)дерево вгорі планарне. Цей, однак, непланарний:

   O---O O
  /       \
 /         \
O           O
 \         /
  \       /
   O --- O

(Є 7 вершин і 6 ребер)

  • вільний поліеноїд: Варіанти одного поліеноїда, який можна отримати за допомогою обертання та відбиття, зараховують до одного.

  • Група C 2v : Полієноїд рахується лише у тому випадку, якщо вони мають 2 перпендикулярні площини відбиття і не більше.

Наприклад, єдиний полієноїд з 2 вершинами

O --- O

має 3 площини відображення: горизонтальну -, вертикальну |та ту, паралельну екрану комп’ютера . Це занадто.

З іншого боку, цей

O --- O
       \
        \
         O

має 2 площини відображення: /і .


Пояснення методу

А тепер підхід про те, як насправді підрахувати кількість.

По-перше, я вважаю формулу a(n) = A000063(n + 2) - A000936(n)(вказану на сторінці OEIS) як належне. Я не читав пояснення в газеті.

[TODO виправити цю частину]

Звичайно, рахувати площинні простіше, ніж рахувати непланарні. Ось що робить і папір.

Геометрично планарні полієноїди (без вершин, що перекриваються) перераховуються за допомогою комп’ютерного програмування. Таким чином, число геометрично неплоских полієноїдів стає доступним.

Отже ... програма підраховує кількість планарного поліеноїда і віднімає його від загального.

Оскільки дерево все одно є планарним, воно, очевидно, має площину відображення. Таким чином, умова зводиться до "підрахунку кількості дерева з віссю відображення у його 2D-зображенні".

Наївним способом було б сформувати всі дерева з nвузлами та перевірити правильність симетрії. Однак, оскільки ми хочемо лише знайти кількість дерев з віссю відбиття, ми можемо просто генерувати всі можливі півдерева на одній половині, відобразити їх через вісь, а потім перевірити правильність симетрії. Більше того, оскільки генеровані полієноїди є (планарними) деревами, він повинен торкнутися осі відбиття рівно один раз.

Функція public static Graph[] expand(Graph[] graphs, Point.Predicate fn)приймає масив графіків, кожен має nвузли, і виводить масив графа, кожен має n+1вузли, не рівні один одному (під перекладом) - таким, що доданий вузол повинен задовольняти предикату fn.

Розглянемо 2 можливі осі відображення: та, яка проходить через вершину та збігається з ребрами ( x = 0), та перша, що є перпендикулярною бісектрисою ребра ( 2x = y). Ми можемо взяти лише один із них, оскільки генеровані графіки в будь-якому випадку є ізоморфними.

Отже, для першої осі x = 0ми починаємо з базового графіка, що складається з одного вузла (1, 0)(у випадку, коли nце непарно) або двох вузлів з ребром між (1, 0) - (2, 0)(у випадку, якщо nпарне), а потім розгорнути вузли таким чином y > 0. Це робиться в розділі програми "Рефлексія типу 1", а потім для кожного створеного графіка відображайте (дзеркало) себе через вісь X x = 0( g.reflectSelfX()), а потім перевіряйте, чи має він правильну симетрію.

Однак зауважте, що, якщо nділиться на 2, таким чином ми рахували кожен графік двічі, оскільки ми також генеруємо його дзеркальне зображення по осі 2x = y + 3.

(зверніть увагу на 2 апельсинові)

Подібно до осі 2x = y, якщо (і лише якщо) nє рівним, ми починаємо з точки (1, 1), генеруємо такі графіки, які 2*x > yвідображають кожен з них над 2x = yвіссю ( g.reflectSelfType2()), з'єднуємось (1, 0)із ними (1, 1)та перевіряємо, чи правильна їх симетрія. Не забудьте поділити і на 2.


Зважаючи на те, що я спав, коли це (та інше) було розміщено, я дам вам користь від сумнівів і поки не прийму відповіді.
caird coinheringaahing

2
@cairdcoinheringaahing Ви були в мережі за 3 хвилини до граничного терміну ...
user202729

Е-о, наступна послідовність може бути жорстко закодована ... (хоча це нескінченно), якщо я прочитаю її правильно. Сам розрахунок --- досить --- дуже просто, тому не робіть цього.
користувач202729

7

6. R , 71 байт, A000072

function(n)length(unique((t<-outer(r<-(0:2^n)^2,r*4,"+"))[t<=2^n&t>0]))

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

Наступна послідовність


1
З любові до Бога я не перевірив наступної послідовності, перш ніж опублікував цю відповідь.
Leaky Nun

Чи не легка наступна послідовність є стратегічною перевагою?
BlackCap

@BlackCap Вони не можуть відповісти двічі поспіль або менше 1 години після останнього відповіді.
Ерік Аутгольфер

@EriktheOutgolferthe answer before the last posted (the one who didn't break the chain) will win
BlackCap

@BlackCap в цей момент цього не відбудеться
Стівен


7

26. TI-BASIC, 274 байт , A000183

.5(1+√(5→θ
"int(.5+θ^X/√(5→Y₁
"2+Y₁(X-1)+Y₁(X+1→Y₂
{0,0,0,1,2,20→L₁
Prompt A
Lbl A
If A≤dim(L₁
Then
Disp L₁(A
Else
1+dim(L₁
(~1)^Ans(4Ans+Y₂(Ans))+(Ans/(Ans-1))((Ans+1))-(2Ans/(Ans-2))((Ans-3)L₁(Ans-2)+(~1)^AnsY₂(Ans-2))+(Ans/(Ans-3))((Ans-5)L₁(Ans-3)+2(~1)^(Ans-1)Y₂(Ans-3))+(Ans/(Ans-4))(L₁(Ans-4)+(~1)^(Ans-1)Y₂(Ans-4→L₁(Ans
Goto A
End

Оцінює рекурсивну формулу, знайдену за посиланням OEIS.

Наступна послідовність


Ага, я знав, коли сайт зайшов, що це буде шалений поспіх, коли він з'явиться. Ледве бив мене.
Сільвіо Майоло

Я не розумів, що сайт знизився ...
Скотт Мілнер



7

49. SageMath , 74 байти, A000003

lambda n: len(BinaryQF_reduced_representatives(-4*n, primitive_only=True))

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

Наступна послідовність


І я щойно пробув годину, намагаючись опрацювати цю послідовність за допомогою JavaScript ... о ну, мені просто доведеться перейти до наступного ...
ETHproductions

7

76. пігмеїв , 4147 байт, A000036

globaln: 0                                                                                           

Pi:: 3.141592653589793                                                                               

floor:: (number) {                                                                                   
    floatPart: number % 1                                                                            
    number >= 0 =>                                                                                   
    number - floatPart                                                                               
    number - floatPart - 1                                                                           
}                                                                                                    

fsqrt:: (number) {                                                                                   
    floor| number ^ 0.5                                                                              
}                                                                                                    

summation:: (f i imax) {                                                                             
    i > imax => 0                                                                                    
    (f| i) + summation| f, i + 1, imax                                                               
}                                                                                                    

absoluteValue:: (number) {                                                                           
    number < 0 => -number                                                                            
    number                                                                                           
}                                                                                                    

A:: (number) {                                                                                       
    globaln~: number                                                                                 
    1 + 4 * (fsqrt| number)                                                                          
       + 4 * (fsqrt| number / 2) ^ 2                                                                 
       + 8 * summation| (j){ fsqrt| globaln - j * j }, (fsqrt| number / 2) + 1, (fsqrt| number)      
}                                                                                                    

V:: (number) {                                                                  
    Pi * number                                                                      
}                                                                                    

P:: (number) {                                             
    (A| number) - (V| number)                               
}                                                           

recordMax: 0                                           
findRecord:: (searchIndex record recordCount) {                                    
    x: absoluteValue| P| searchIndex                                               
    (x > record && recordCount = recordMax - 1) => searchIndex                     
    x > record => findRecord| searchIndex + 1, x, recordCount + 1                  
    findRecord| searchIndex + 1, record, recordCount                               
}                                                                                  

A000099:: (number) {                                                                 
    recordMax~: number                                                              
    findRecord| 1, 0, 0                                                              
}                                                                               

A000035:: (number) {                                                                       
    floor| (P| (A000099| number)) + 0.5                                         
}                                                                               

Наступна послідовність

Ви можете запустити код на цій сторінці . Наприклад, ви можете отримати десяте число в послідовності, скопіювавши код вище і додавши:

alert| A000035| 10

4
... наступна послідовність є незаперечною ...
HyperNeutrino

1
@HyperNeutrino Я знаю: PI зробив це спеціально
Пітер Олсон

Зло ...>. <Але все одно я просто зафіксую 4 елементи в послідовності. Досить просто xD OP схвалює це, мабуть, ¯ \ _ (ツ) _ / ¯
HyperNeutrino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.