Роздрукуйте послідовність


24

21, 21, 23, 20, 5, 25, 31, 24,?

Натхненний цією головоломкою , отримавши ціле число n>0 , роздрукуйте наступну послідовність, поки ви не досягнете цілого числа (зіпсований, якщо ви хочете спочатку вирішити головоломку)

a0=n
a4k+1=a4k(4k+1)
a4k+2=a4k+1+(4k+2)
a4k+3=a4k+2(4k+3)
a4k+4=a4k+3/(4k+4)
або більш інтуїтивно: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...

Випробування:

1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26

Введення та вихід можуть бути зроблені у будь-якому розумному форматі, стандартні лазівки заборонені, як зазвичай.

У дусі найкоротша відповідь у байті виграє!

Пісочниця: https://codegolf.meta.stackexchange.com/a/18142/59642


Чи можемо ми натомість повернути нескінченний список послідовності? Також, чи правильний вихід для 1? У мене було щось інше після 6.
Коул

3
@cole Оскільки послідовність завершується, я не думаю, що ви можете вивести нескінченний список.
Пшеничний майстер

1
Чи можемо ми вивести 1 індексований, тобто пропустити перший елемент?
Джо Кінг

1
Ні, вся послідовність повинна бути надрукована.
infinitezero

1
Так, ви можете @KevinCruijssen
infinitezero

Відповіді:


6

05AB1E (спадщина) , 18 17 байт

[N"/*+-"Nè.VÐïÊ#=

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

[                # Start an infinite loop:
 N               #  Push the 0-based loop-index
  "/*+-"         #  Push string "/*+-"
        Nè       #  Index into this string with the loop-index
          .V     #  And use a 05AB1E-eval to calculate the next number
 Ð               #  Triplicate this number
  ï              #  Cast it to an integer
   Ê             #  And if it's NOT equal to the number we triplicated:
    #            #   Stop the infinite loop
  =              #  Print the number without popping

Я використовую тут застарілу версію 05AB1E, а також спочатку обчислюю наступне число перед тим, як надрукувати його, тому що цикл заснований на 0, і це зробить /0у першій ітерації. Це зберегло байт порівняно з попереднім N>та "*+-/". Це працює лише тому, що в застарілій версії число, яке ділиться на 0, залишається таким же; враховуючи, що в новій версії це стане 0; а в фактичній математиці це дало б поділ на нульову помилку.


11

Scratch 3.0 39 блоків / 323 байти

Oh eval, I miss you

Спробуйте це на нульовій лінії !

Як синтаксис SB:

when gf clicked
delete[all v]of[o v
ask()and wait
set[. v]to(answer
set[n v]to(1
repeat until<(n)contains[.
if<((n)mod(4))=(0
set[. v]to((. )*(n
else
if<((n)mod(4))=(1
change[. v]by(n
else
if<((n)mod(4))=(2
change[. v]by((0)-(n
else
set[. v]to((. )/(n
end
end
end
add(n)to[o v
change[n v]by(1
end
delete(length of(o))of[o v

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

Принаймні, це не goto...


2
Подивіться на вас, веселяться, якщо заяви і пливуть поділ! Ну не я! Ні ... У "Пробілів" немає овалів, if-оператора чи плаваючого поділу, тому мені довелося робити важкий шлях ... gotos та цикл віднімання, щоб перевірити, чи можемо ми поділитися, мовою на основі стека . ; p (З усією серйозністю, приємна відповідь, +1 від мене! Я просто не міг протистояти цитувати вас у моїй щойно закінченій відповіді
Whitespace

8

Пробіл , 251 227 202 байт

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][N
S S N
_Create_Label_LOOP][S N
S _Duplicate_top][T N
S T _Print_as_integer][S S S T  S T S N
_Push_10_newline][T N
S S _Print_as_character][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S T S S T   N
_Copy_2nd_item][S T S S T   N
_Copy_2nd_item][S N
S _Duplicate_top][S S S T   S S N
_Push_4][T  S T T   _Modulo][S N
S _Duplicate_top][N
T   S S N
_If_0_Jump_to_Label_DIVIDE][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate_top][N
T   S T N
_If_0_Jump_to_Label_MULTIPLY][S S S T   N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_ADD][S N
T   _Swap_top_two][S T  S S T   N
_Copy_2nd_item][T   S S T   _Subtract][N
S N
N
_Jump_to_LOOP][N
S S S N
_Create_Label_DIVIDE][S N
N
_Discard_top][T S T S _Divide][S T  S S T   S N
_Copy_3nd_item][S T S S T   S N
_Copy_3nd_item][T   S T T   _Modulo][N
T   S N
_If_0_Jump_to_Label_LOOP][N
N
N
_Exit_Program][N
S S T   N
_Create_Label_MULTIPLY][S N
N
_Discard_top][T S S N
_Multiply][N
S N
N
_Jump_to_Label_LOOP][N
S S S S N
_Create_Label_ADD][T    S S S _Add][N
S N
N
_Jump_to_Label_LOOP]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте в Інтернеті (лише із просторами, вкладками та новими рядками).

-24 байти після коментаря від пропозиції @JoKingn%i > 0 . Хоча тільки if(x < 0)і if(x == 0)доступні в Whitespace, просто перевірка if(x*-1 < 0)в основному такий же , як if(x > 0).
Додаткових -25 байт завдяки @JoKing .

Пояснення:

Цитата з відповіді на Scratch :

Принаймні, це не goto...

Хтось сказав goto? Пробіл не має нічого іншого, як gotoстворити і петлі, і if-заяви. xD Крім того, це мова на основі стека, тому мені доводиться досить часто міняти місцями / відкидати / копіювати. І на закінчення: у Whitespace навіть немає плаваючих точок і лише ціле ділення, тому я використовувавn % i * -1 < 0 для виходу з програми, якщо ціле число не може розділити поточне число.

Псевдо-код:

Integer n = STDIN as input
Integer i = 0
Label LOOP:
  Print n as number
  i = i + 1
  Integer t = i % 4
  If(t == 0):
    Jump to Label DIVIDE
  t = t - 1
  If(t == 0):
    Jump to Label MULTIPLY
  t = t - 1
  If(t == 0):
    Jump to Label ADD
  n = n - i
  Jump to Label LOOP
Label DIVIDE:
  n = n / i
  Integer m = n % i
  If(m == 0):
    Jump to Label LOOP
  Exit program
Label MULTIPLY:
  n = n * i
  Jump to Label LOOP
Label ADD:
  n = n + i
  Jump to Label LOOP

Ви абсолютний геній. Попросіть мою пропозицію!
Jono 2906,

@JoKing Whitespace є if(n == 0)або if(n < 0)доступний. На жаль , немає if(n > 0)або if(n != 0). Але я впевнений, що деякі аспекти можна спростити. Це поточне рішення було пробною та помилковою налагодженням, але, можливо, я повинен просто зробити крок назад і переглянути коротший підхід. Коли я знову встигну. І виправив псевдо-код, ти справді мав рацію, що я перейшов i/ nу більшості місць ..
Кевін Круїйсен

1
Я не впевнений, наскільки це життєздатно, але, можливо, ви могли б це зробити m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program?
Джо Кінг

1
Чи можете ви також перенести на swap top two, copy second itemзагальний цикл, а не копіювати його до кожного розділу?
Джо Кінг

1
@JoKing Дякую, обидва ці пропозиції збережено в байтах. Перша пропозиція -7, а друга -18. :)
Кевін Круїссен


7

JavaScript (V8) , 52 байти

Друкує групи з 4-х термінів. Натхненний відповіддю Рубі Рубі .

n=>{for(k=0;n%1==0;n/=k+=3)print(n,n*=++k,n-~k,--n)}

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


JavaScript (V8) , 54 байти

Друкує умови послідовності.

n=>{for(k=0;n%1==0;n=eval(n+'*+-/'[k++&3]+k))print(n)}

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


JavaScript (ES6),  59  58 байт

Повертає масив.

f=(n,k)=>k&&(n=eval(n+'/*+-'[k&3]+k))%1?[]:[n,...f(n,-~k)]

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


5

Perl 6 , 44 байти

{$_,{($_,<* + - />[$++%4]~++$).EVAL}...^*%1}

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

Блок анонімного коду, який приймає число і повертає послідовність. Якщо ми могли пропустити перший елемент (який все одно такий же, як і другий елемент), ми могли б зберегти 3 байти, видаливши$_,



5

Піт , 297 190 144 коделів (432 байти)

New Piet Code

Спробував новий підхід, використовуючи pointerкоманду як перемикач (k mod 4) для уніфікації вихідного коду, в результаті чого вийшло більш щільне зображення коду 10x19. Тоді я переграв це поле на 1 рядок та 2 стовпчики до 8х18.

Ось слід, щоб побачити, як це працює:

enter image description here

Перший рядок висуває 0 на стеку як стартовий індекс (оскільки ми можемо лише pushнатуральні числа, ми натискаємо 2, а потім субстратуємо), а потім зчитуємо вхід як число.

У крайній лівій стовпці є спільний код дублювання числа та виведення одного на вихід, потім переміщення індексу вгорі стека, збільшення його та повторне копіювання тричі. Потім вводимо пастельний червоний r-подібний блок через темний блакитний кодекс для apointer команди, яка дає нам різні шляхи для залишку нашого індексу 4.

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

Mod 2, ми виходимо назад, щоб підбити суму. Форма блоку коду пастелі означає, що ми виходимо на рядок вище з того місця, де ми ввели, і використовуємо 3, які натискаємо на стек, виходячи через червоний кодекс, щобpointer (3) себе вгору. У цих стовпцях є пробіл перед арифметикою та дещо інший порядок натискання та перемикання куб.см, оскільки в іншому випадку ми мали б колірне перекриття з цілочисловими коделями в сусідній стовпчику.

Mod 3 відсилає нас вниз для віднімання. Те саме стосується множення, за винятком того, що ми переходимо шлях ділення на дорозі вгору (Оскільки, при вході в пастельну зелену смугу, копія відрізняється паритетом, дві страти виходять з цієї смуги на різних кінцях). Роблячи це, ми підбираємо небажану duplicateкоманду, так що миpop повертаємося з темно-зеленим коделом перед тим, як увійти в панель виправлення та збирання колон.

Мод 4, ми йдемо прямо вперед, щоб розділити. Тут ми спочатку мусимо повторно перемістити стек, щоб отримати дві пари n і a для виконання операцій, тому що нам потрібно перевірити, чи це ціле число. Ми робимо так, що я роблю modна першій парі, потім notна результаті, потім використовуємо це для pointer- якщо це не ділиться, ми продовжуємо йти прямо, що відправляє нас двома pointerкомандами в протилежний кут до неминучого блоку і таким чином завершує програму. В іншому випадку ми повертаємо праворуч і отримуємо divideкоманду від входу в пурпурову смугу.

Стара версія

Piet Code

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

Для поділу, який є єдиним, де послідовність може закінчитися, він створює складніший стек, щоб спочатку перевірити, чи n mod index == 0, інакше він вводить неминучий кодекс і закінчується. В іншому випадку вона використовує свою другу копію i і n для виконання поділу.


Чи можна було б разом змастити другий і третій ряд? Тобто, поверніть рожеву клітинку на (0,1) -> (1,2), змістіть 3 комірки посередині вниз і зменшіть правий стовпчик на 1х2?
Веська

Не легко. Мені потрібні 2 комірки, щоб виконати правильний поворот, або для push (1) pointerчорної комірки зверху кольорової.
AlienAtSystem

4

C # (Visual C # Interactive Compiler) , 72 , 70 , 69 байт

n=>{for(int i=1;n%1==0;n=new[]{n/i,n*i,n+i,n-i}[i++%4])Write(n+" ");}

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


1
59 байт , перенісши першу функцію JavaScript Арнольда , яка є портом відповіді Ruby . І так, цей вихід дозволений, щойно отримали підтвердження від ОП у коментарях виклику.
Кевін Круїссен

@KevinCruijssen приємно, я б цього не придумав!
Innat3

4

Рубі , 56 54 52 байти

f=->n,z=1{n%1>0?[]:[n,n*=z,n-~z,n-=1]+f[n/=z+3,z+4]}

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

Після деякої (невдалої) спроби evalя виявив, що найщасливішим рішенням є створення масиву з 4-х елементів одночасно, принаймні в рубіні.

Завдяки Арноульду за -2 байти.


53 байти , переносячи мою останню відповідь, яка була натхненна вашою.
Арнольд

3
52 байти за допомогою поліпшення, запропонованого Shaggy, яке виявилося таким же довгим у JS, але економить байт у Ruby.
Арнольд

4

R , 90 байт , 87 байт 85 байт 80 байт 74 73 байт

Просте виконання правил:

a=scan();while(T<13)a=c(a,d<-a[T]*T,d+T+1,e<-d-1,e/((T<-T+4)-1));a[!a%%1]

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

з T<13наступного з більш глибокого аналізу головоломки. Дійсно, є лише три види послідовностей: послідовності довжиною 4, коли a⁰ не відповідає 1 модулю 8; довжини 12, коли a⁰ відповідає 21 модулю 32; та довжини 8 для решти справ.

Альтернативний код, який уникає циклів, досягає більше 87 байт:

`~`=rep;b=(scan()-1)*c(32~4,8,40~3,1,9~3)/32+c(1,1,3,0~3,6,-c(8,1,9,-71,17)/8);b[!b%%1]

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


1
Ви можете видалити {}-2 байти.
Робін Райдер

1
74 байти , уникаючи length.
Робін Райдер

3

Haskell , 104 86 85 байт

n#i=n:(cycle[(/),(*),(+),(-)]!!floor i)n i#(i+1)
takeWhile((==).ceiling<*>floor).(#1)

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

The h=Можуть бути опущені , так як він використовується тільки для тестування.

Ах, код гольфу, де квадратичне збільшення складності в часі варто для скорочення одного символу.

104 байти

f=flip
g x=scanl(f($))x.zipWith(f($))[1..].cycle$f<$>[(*),(+),(-),(/)]
takeWhile((==).ceiling<*>floor).g

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

Мені подобається ця відповідь краще, але, на жаль, вона довша.


3

Japt , 25 24 байт

Ще одна адаптація рішення GB Ruby .

%1ª[UU*=°VU´ÒVU]cßU/=V±3

Спробуй це

Основна хитрість тут полягає в перевантаженні cметоду для масивів. Передайте йому інший масив як аргумент, і він з'єднує його з вихідним масивом. Передайте це число як аргумент, як це відбувається при останньому рекурсивному виклику, і він вирівнює початковий масив на стільки рівнів - 1у цьому випадку після округлення. Але, оскільки масив є лише будь-яким рівнем глибокого, сплющення не має ефекту.

%1ª[UU*=°VU´ÒVU]cßU/=V±3     :Implicit input of integer U
%1                           :U modulo 1
  ª                          :Logical OR with
   [                         :Construct and array containing
    U                        :  U
     U*=                     :  U multiplied by
        °V                   :    V (initially 0) prefix incremented
          U´                 :  The new value of U, postfix decremented
            ÒV               :    Subtract the bitwise negation of V
              U              :  The now-decrmented U
               ]             :End array
                c            :Concatenate, or flatten by
                 ß           :  Recursive call to the programme with argument
                  U/=        :    U divided by
                     V±3     :      V incremented by 3

2

Java 8, 84 байти

n->{for(int i=1;n%1==0;n=new float[]{n/i,n*i,n+i,n-i}[i++%4])System.out.println(n);}

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

Створення масиву з усіма чотирма значеннями надихає відповідь Ruby @GB , хоча я зараз помічаю, що використання потрійного if-оператора - це однакова кількість байтів:

n->{for(int i=0;n%1==0;n=++i%4<1?n/i:i%4<2?n*i:i%4<3?n+i:n-i)System.out.println(n);}

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





2

Рутгер , 310 байт

n=e=$Input;
a=0;
w=While[{m=Modulo[$e];Not[m[1]];}];
w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];
Do[$w];

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

Прийшов час я знову використати Рутгера. На жаль, це може бути не найкращою мовою для виконання завдання, оскільки воно не має формиeval , змушує мене використовувати чотири, якщо заяви

Як це працює

Як працює Рутгер

Коротка передмова про те, як працює мова: Все є або призначенням, або функцією, і кожна функція бере рівно один аргумент. Для операцій, для яких потрібно більше одного аргументу (наприклад, множення), перший виклик повертає часткову функцію , яка при повторному виклику з другим аргументом повертає очікуваний результат. Наприклад:

left = Times[5];
Print[left[6]];

буде надруковано 30: Спробуйте в Інтернеті!. Хоча зазвичай це довше, ніж звичайна альтернатива, вона може часом економити байти, якщо функція викликається повторно одним постійним аргументом та одним мінливим аргументом, наприклад, під час друку таблиць часу.

Це одне правило аргументу поширюється на все, що не є константою чи змінною, включаючи цикли та умовні умови. Однак, цикли і умовні ( For, Each, While, DoWhile, Ifі IfElse) є здійсненними , а це означає , що для того , щоб фактично запустити їх, Doфункція повинна бути викликана (див останнього рядка у відповіді). Знову ж таки, це може зберегти байти при повторному запуску одного циклу, або дозволить запустити довільний код між визначенням і запуском циклів.

Нарешті, є три способи посилання на змінні, всі з яких використовуються в цій програмі. Перший - це пряме посилання , де ім'я змінної є префіксом $символом. Це отримує доступ до значення змінної безпосередньо та повертає її. Друге - це функціональне посилання , яке не має символів префіксації. Це дозволяє коду розрізняти (потенційно часткові) функції, призначені змінним, і фактичні змінні, що містять конкретне значення. Нарешті, непряме посилання з префіксом @символу створює змінну (якщо її вже немає) і повертає змінний об'єкт у задану область. Це дозволяє створити змінну циклу (наприклад, iв for i in range(...)).

Як працює власне рішення

Ось код, який не використовується для гольфу:

n = elem = $Input;
var = 0;
while = While[{
	mod = Modulo[$elem];
	Not[mod[1]];
}];
while = while[{
for = For[4];
for = for[@index];
for = for[{
	Print[$elem];
	equal = Equal[$index];

	if = If[{ equal[1]; }];
	if = if[{ func = Times[$elem]; }];
	Do[$if];

	if = If[{ equal[2];}];
	if = if[{ func = Add[$elem];}];
	Do[$if];

	if = If[{ equal[3];}];
	if = if[{ func = Subtract[$elem];}];
	Do[$if];

	if=If[{ equal[4];}];
	if=if[{ func = Divide[$elem];}];
	Do[$if];

	elem = func[var = Increment[$var]];
	}];
	Do[$for];
}];
Do[$while];

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

Як видно, вона починає шляхом присвоєння трьох змінних n, eі a, які представляють собою вхідні дані , що змінюється елемент в послідовності, і число модифікації для кожного нового елемента відповідно. Потім створюємо цикл "час":

w=While[{m=Modulo[$e];Not[m[1]];}];

Дужки ( {і }) визначають блок коду, де остаточне твердження в блоці є умовою циклу while. У цьому випадку ми почнемо з визначення часткової функції модуля, яка прийме другий аргумент m, і повернемось e % m. Потім ми називаємо цю часткову функцію за допомогою1 як другий аргумент, що повертається 0для цілих чисел та ненульового цілого числа для плавців. Потім обчислюємо логічне не це, відображення01 і н0,н0.

Далі ми приходимо до абсолютної чудовисько, що складається з тіла циклу:

w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];

Основна частина цього циклу - це цикл for, який ітераціює 4разів кожна ітерація циклу while має ітераційну змінну xі складається з:

Print[$e];
q=Equal[$x];
i=If[{q[1];}];i=i[{k=Times[$e]    ;}];Do[$i];
i=If[{q[2];}];i=i[{k=Add[$e]      ;}];Do[$i];
i=If[{q[3];}];i=i[{k=Subtract[$e] ;}];Do[$i];
i=If[{q[4];}];i=i[{k=Divide[$e]   ;}];Do[$i];
e=k[a=Increment[$a]];

Перше твердження виводить кожну ітерацію послідовності перед її зміною. Потім ми створюємо часткову функцію, щоб перевірити рівність зі змінною циклу x, і зіткнемося з чотирма операторами if. Кожен оператор перевіряє , якщо xдорівнює 1, 2, 3 або 4 відповідно, а потім призначають kдля кожної функції в *, +, -та /, потім робить його в часткову функцію з в eякості аргументу. Нарешті, ми відносимо eдо kпрацювати з в aякості другого аргументу і приросту a.


2

Рубін , 52 байти

->n{i=0.0;n=[p(n)/i+=1,n*i,n+i,n-i][i%4]until 0<n%1}

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


Збережіть 2 байти: i=0і використовуйте float як аргумент функції.
ГБ

@GB Приємно, дякую. Чи дозволяється нам вимагати, щоб вхід був поплавком?
Відновіть Моніку ямнотмайнар



2

TI83 / 84 BASIC, 69 байт

1→A
DelVar L1Prompt N
Repeat fPart(N
N→L1(A
NA-1→O
augment(L1,{NA,Ans+A+2,Ans→L1
O/(A+3→N
A+4→A
End
Disp L1

Ми встановлюємо лічильник в A і очищаємо L1, щоб ми могли використовувати його для відстеження послідовності. Потім повторюємо, поки крок поділу не спричинить дріб. Всередині циклу ми спочатку зберігаємо N до списку. Збереження одного елемента в кінці списку або порожнього списку створює цей елемент, тому цей магазин зберігає обидва додавання результату поділу, коли він не викликає дробу, і ініціалізує список під час першого проходу. Потім ми використовуємо розширення, щоб додати наступні 3 умови послідовності. Математика працює на кілька байт менше, обчислюючи термін A4k + 3 у змінній O, а потім базуючи A4k + 2 і A4k + 4 off O. Потім робимо поділ окремо, щоб скинути N для повторної перевірки і додамо 4 до A.

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


1

Вугілля деревне , 29 байт

NθW¬﹪θ¹«Iθ⸿≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Введіть початкове значення.

W¬﹪θ¹«

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

Iθ⸿

Роздрукуйте значення на власному рядку.

≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Обчисліть чотири доступні арифметичні операції та виберіть правильну залежно від поточного номера вихідного рядка.


1

Python 3 , 78 76 байт

f=lambda n:n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

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

Приймає введення як список 1 елемента і рекурсивно додає наступний елемент послідовності, поки не стане цілим числом.

У випадку, якщо приймати дані як список не дозволено, ось дуже швидко виправлена ​​версія, яка приймає дані як int.

Введення як ціле число, 102 байти

f=lambda n:type(n)==int and f([n])or n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

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

+2 байти завдяки мені забувши назвати рекурсивну функцію ...
-4 байти завдяки Jitse


1
Гарний підхід! Оскільки ваша функція є рекурсивною, вона не може залишатися анонімною. Ви повинні включити f=у свій основний код. Однак ви також можете зберегти 4 байти з тих пір n[-1]і len(n)не повинні бути в дужках. Спробуйте в Інтернеті!
Jitse

Не впевнений у тому, щоб скористатися списком, а не цілим числом (рекомендую запитати ОП), але n[:-(n[-1]%1>0)]or f...врятував би байт
Джонатан Аллан

1

Гілочка , 164 байти

Гаразд, це було насправді дуже жахливо писати.

Обмеження:

  • Ні returns ! Ви виводите або не виводите
  • Без whileпетель. Ви повинні використовувати рекурсію або нічого
  • Непростий спосіб виводу! Ви повинні повторювати вихід кожного разу
  • Ви не можете надати змінним значення, не використовуючи set тег
  • Непростий спосіб вийти з петлі. Немаєbreak , continue, gotoабо аналогічний. Це робить цикл неможливим у використанні.
  • Є лише 1 цикл:, for ... in ....і він перетинає всі елементи масиву, не зупиняючись.

Всі вони зробили код масовим!
Гей, я навіть зробив це довше, ніж відповідь на Java!
Це так довго, як @ Arnauld's відповідь JavaScript ! ... Зі всіма 3 альтернативами разом.

Ось код:

{%macro a(b,n=1)%}{{n<2?b}}{%set b=b*n%},{{b}}{%set b=b+n+1%},{{b}}{%set b=b-(n+2)%},{{b}}{%set b=b/(n+3)%}{%if(b//1)==b%},{{b~_self.a(b,n+4)}}{%endif%}{%endmacro%}

Ви можете спробувати https://twigfiddle.com/zw5zls


Як користуватись:

Просто імпортуйте файл та зателефонуйте до першого макросу.

{% import 'file.twig' as a %}

{{ a.a(21) }} {# 21,21,23,20,5,25,31,24,3,27,37,26 #}

Щоб мати корисний масив, ви можете це зробити a.a(21)|split(',').


Безголівки:

{% macro calc(number, index = 1) %}
    {% if index < 2 %}
        {{ number }}
    {% endif %}

    {% set number = number * index %},{{ number }}
    {% set number = number + index + 1 %},{{ number }}
    {% set number = number - (index + 2) %},{{ number }}
    {% set number = number / (index + 3) %}

    {#
        verifies if it is an integer.
        this is done with an integer division with 1 and compare with itself
        if both values are the same, the number is an integer
        otherwise, it is a floating-point number
    #}
    {% if (number // 1) == number %}
        ,{{ number ~ _self.calc(number, index + 4) }}
    {% endif %}
{% endmacro %}

Має бути легким для читання.
Ця відповідь без волі НЕ дасть правильного результату, оскільки він кидає випадкові пробіли.
Він існує лише для того, щоб бути зрозумілим для людини.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.