Diziyi yazdır


24

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

Bu bilmeceden esinlenerek , n>0 tamsayısı verildiğinde, tamsayı olmayana ulaşana kadar aşağıdaki diziyi yazdırın (önce bulmacayı kendiniz çözmek istemeniz durumunda spoyler)

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)
veya sezgisel olarak: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...

testcases:

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

Giriş ve Çıkış herhangi bir makul formatta alınabilir, standart boşluklar her zamanki gibi yasaktır.

ruhuyla, bayttaki en kısa cevap kazanır!

Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642


Bunun yerine dizinin sonsuz bir listesini verebilir miyiz? Ayrıca, 1 için çıkış doğru mu? 6'dan sonra farklı bir şey yaşadım
cole

3
@cole Dizi bittiğinden beri sonsuz bir liste çıkartabileceğini sanmıyorum.
Buğday Sihirbazı

1
İndekslenmiş 1 çıktı alabilir miyiz, yani ilk elemanı atlayabilir miyiz?
Jo King

1
Hayır, dizinin tamamı yazdırılmalıdır.
infinitezero

1
Evet olabilir @KevinCruijssen
infinitezero

Yanıtlar:


6

05AB1E (eski) , 18 17 bayt

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

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

[                # 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

Burada 05AB1E'nin eski versiyonunu kullanıyorum ve ayrıca ilk önce onu yazdırmak için bir sonraki sayıyı hesaplayın, çünkü döngü 0-temellidir ve /0ilk yinelemede bunu yapar. Bu önceki N>ve ile karşılaştırıldığında bir bayt kaydetti "*+-/". Bu yalnızca işe yarar, çünkü eski sürümde 0'a bölünen bir sayı aynı kalır; oysa yeni versiyonda 0 olur; ve gerçek matematikte sıfır hatayla bölünme verecektir.


11

Çizik 3.0 39 blok / 323 bayt

Oh eval, seni özledim

Deneyin hat sıfırdan!

Alternatif olarak, SB sözdizimi olarak:

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

Size bakın, süslü evalifadelerinizle eğlenin ! Eh, ben değil! Hayır ... Kazı kazanın evreni yok, bu yüzden işleri zor yoldan yapmak zorunda kaldım ... eğer ifadeler.

En azından gotos ...


2
Şunlara bak, if ifadeleri ve şamandıra bölünmesi ile eğlen! Eh, ben değil! Hayır ... Boşluklar, if-ifadesi veya kayan bölünme özelliğine sahip değil, bu yüzden işleri zor yoldan yapmak zorunda kaldım ... gotos ve yığın tabanlı bir dilde bölebildiğimizi doğrulamak için bir çıkarma döngüsü . ; p (Bütün ciddiyet, güzel cevap, benden +1! Sadece bitmiş Whitespace
cevabımdan

8

Boşluk , 251 227 202 bayt

[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]

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklenmiştir.
[..._some_action]sadece açıklama olarak eklendi.

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

-JoKing'in önerdiği yorumdan sonra -24 bayt n%i > 0. Sadece if(x < 0)ve if(x == 0)boşluklarda mevcut olmasına rağmen , basitçe kontrol etmek if(x*-1 < 0)temelde aynıdır if(x > 0). @JoKing
sayesinde ek bir -25 bayt .

Açıklama:

Scratch cevabından alıntı :

En azından gotos ...

Birisi gotomi dedi ? Boşlukta gotohem döngüler hem de if ifadeleri oluşturmaktan başka bir şey yoktur . xD Ayrıca yığın tabanlı bir dildir, bu yüzden sık sık değiştirmem / atmam / kopyalamam gerekiyor. Üstelik işleri halletmek için: Boşluklarda kayan noktalar ve sadece tamsayı bölme bile yok, bu yüzden n % i * -1 < 0tamsayı geçerli sayıyı bölemezse programdan çıkmak için kullandım .

Sözde kod:

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

Seni mutlak dahi. Olumlu oyum var!
Jono 2906

@JoKing Whitespace yalnızca var if(n == 0)veya if(n < 0)kullanılabilir. Maalesef hayır if(n > 0)veya if(n != 0). Ancak bazı yönlerin basitleştirilebileceğinden eminim. Bu mevcut çözüm, hata ayıklamanın deneme yanılma yoluydu, ancak belki geri adım atmalı ve daha kısa bir yaklaşımı yeniden düşünmeliyim. Yine vaktim olduğunda. Ve sözde kodu düzelttim, gerçekten haklıydın ben i/ nçoğu yerde değiştirdim ..
Kevin Cruijssen

1
Bunun ne kadar uygulanabilir olduğundan emin değilim, ama belki yapabilirsin m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program?
Jo King

1
swap top two, copy second itemHer bölüme kopyalamak yerine genel döngüye de taşıyabilir misiniz ?
Jo King

1
@JoKing Teşekkürler, her iki öneri de bayt kaydetti. İlk öneri -7, ikincisi -18. :)
Kevin Cruijssen



5

Perl 6 , 44 bayt

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

Çevrimiçi deneyin!

Sayı alan ve bir dizi döndüren adsız kod bloğu. İlk öğeyi atlayabilseydik (bu her zaman ikinci öğeyle aynı olur), kaldırırken 3 bayt kaydedebilirdik.$_,



5

Piet , 297 190 144 kodlayıcı (432 bytes)

Yeni Piet Kodu

pointerÇıkış kodunu birleştirmek için anahtar olarak bir komut (k mod 4) kullanarak yeni bir yaklaşım denedim , sonuçta daha yoğun bir 10x19 kod resmi elde edildi. Sonra 1 sıra aşağıya çarptım ve 2 kol 8x18'e düşürdüm.

İşte nasıl çalıştığını görmek için bir iz:

görüntü tanımını buraya girin

İlk satır yığındaki 0 ​​değerini başlangıç ​​indeksi olarak iter (sadece pushdoğal sayıları alabildiğimiz için , 2 olanı basar ve sonra çıkartırız), sonra girişi sayı olarak okur.

En soldaki sütun, sayıyı çoğaltmanın ve bir tanesini çıktının içine almanın, ardından dizini yığının üstüne hareket ettirmenin, arttırmanın ve sonra üç kez çoğaltmanın paylaşılan koduna sahiptir. Daha sonra pastel kırmızı r şeklindeki bloğa, koyu camgöbeği koyundan pointergirip, mod 4'ün indeksinin geri kalanı için farklı yollar sağlayan bir komut için giriyoruz .

Mod 1, çoğalmak için yukarıdan çıktık. İlk önce dizinimizin bir kopyasını daha sonra karıştırıp çarpımı gerçekleştiriyoruz. Bir noop için beyazı geçtikten sonra, cc paritesini sabitlemek için yukarıdaki kolona gireriz (döngüyü sabit tutmak için eşit sayıda çevrilmesi gerekir), ardından bir pointer (1)macenta çubuğuna girmesi gerekir: Dört yolumuzu yakala ve bizi tekrar döngüye gönder.

Mod 2, geriye doğru çıkmak için çıkıyoruz. Pastel kod bloğunun şekli, girdiğimiz yerden bir satır üstünden çıkmamız anlamına gelir ve kırmızı tutamdan pointer (3)kendimize doğru çıkarak yığına bastığımız 3'ü kullanırız . Bu sütunlar aritmetikten önce boşluk bırakıyor ve cc'yi itme ve değiştirme işleminden biraz farklı bir sıraya sahipler, çünkü aksi halde komşu sütuntaki tamsayı değerli kodlayıcılarla renk çakışması olur.

Mod 3, bizi çıkarma için aşağıya gönderir. Çarpma ile aynı şey, yukarı çıkan bölme yolunu geçmemiz dışında (cc pastel yeşil çubuğa girerken cc farklı parite sahip olduğundan, iki yürütme o çubuktan farklı uçlarda çıkar). Bunu yaparken, istenmeyen bir duplicatekomut alırız, bu yüzden popcc düzeltme ve toplama çubuğuna girmeden önce koyu yeşil kodon ile geri döneriz.

Mod 4, bölmek için dümdüz ilerliyoruz. Burada, ilk önce iki çift n ve a işlemi yapmak için yığını yeniden daha fazla karıştırmamız gerekiyor, çünkü tamsayı olup olmadığını test etmemiz gerekiyor. Bunu modilk çiftte yaptığım , sonra notsonuçta, sonra bunu kullanın pointer: eğer bölülemezse, düz bir şekilde devam ediyoruz, bu da bizi iki pointerkomutla karşı köşeye kaçamaz bir bloğa gönderir ve böylece programı sonlandırır. Aksi takdirde, sağa dividedöneriz ve kırmızı çubuğa girme emrini alırız .

Eski versiyon

Piet Kodu

Çok basit kod: Yığını 1'e ve girişi iter, daha sonra dört işlemden geçirir: Dizinin yığının üstüne kaydırılması, 1'e kadar artırılması, çoğaltılması, bir kopyanın tekrar aşağı kaydırılması, aritmetik işlem yapılması, sayının çoğaltılması ve çıktının içine alınması.

Dizinin sonlanabileceği tek bölüm olan bölme için, ilk önce n mod index == 0 olup olmadığını kontrol etmek için daha karmaşık bir yığın oluşturur, aksi takdirde kaçınılmaz olan koda girer ve sonlanır. Aksi takdirde, bölüşümü gerçekleştirmek için ikinci i ve n kopyasını kullanır.


İkinci ve üçüncü sırayı bir araya getirmek mümkün mü? Yani, pembe hücreyi (0,1) -> (1,2) yönünde döndürün, ortadaki 3 hücreyi aşağı kaydırın ve sağ sütunu 1x2'ye küçültün.
Veskah

Kolayca değil. Doğru dönüşü gerçekleştirmek için 2 hücreye ihtiyacım var, ya push (1) pointerrenkli bir birinin üstüne siyah bir hücre için.
AlienAtSystem


4

Yakut , 56 54 52 bayt

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

Çevrimiçi deneyin!

Bazı (başarısız) denemelerden sonra eval, en mutlu çözümün diziyi bir kerede 4 elemanla, en azından yakutta oluşturduğunu öğrendim.

Arnauld'a -2 bayt için teşekkürler.


Sizden ilham alan son cevabımı geri alarak 53 byte .
Arnauld

3
52 byte JS tıpkı uzun olduğu ortaya çıktı ama Ruby bir bayt kaydeder Shaggy önerdiği bir iyileşme kullanarak.
Arnauld

4

R , 90 bayt , 87 bayt 85 bayt 80 bayt 74 73 bayt

Kuralların basit bir uygulaması:

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]

Çevrimiçi deneyin!

ile T<13 bulmacanın daha derin bir analiz aşağıdaki. Gerçekten sadece üç çeşit sekans vardır: a⁰ 1 modulo 8 ile uyumlu olmadığında 4 uzunluğundakiler; a 21 21 modulo 32 ile uyumlu olduğunda uzunluk 12 olanları; ve kalan davalar için 8 uzunluğundakiler.

Döngüleri önleyen alternatif bir kod 87 byte ile daha uzun olur:

`~`=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]

Çevrimiçi deneyin!


1
{}-2 bayt kaldırabilirsiniz .
Robin Ryder

1
Kaçınarak 74 baytlength .
Robin Ryder

3

Haskell , 104 86 85 bayt

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

Çevrimiçi deneyin!

h=Sadece test için kullanılan beri göz ardı edilebilir.

Ah, kod golf, zaman karmaşıklığında ikinci dereceden bir artışın bir karakterin azaltılması için buna değer olduğu durumlarda.

104 bayt

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

Çevrimiçi deneyin!

Bu cevabı daha çok seviyorum, ama ne yazık ki daha uzun.


3

Japt , 25 24 bayt

GB'nin Ruby çözümünün bir başka uyarlaması .

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

Dene

Buradaki ana numara, cdiziler için kullanılan yöntemin aşırı yüklenmesidir . Argüman olarak başka bir dizi iletin ve orijinal diziyle birleştirir. Son özyinelemeli çağrıda olduğu gibi, bir argüman olarak bir sayı iletin ve orijinal diziyi o kadar düzleştirir -1 bu durumda yuvarlamadan sonra . Ancak, dizi yalnızca bir seviye derin olduğundan, düzleştirme etkisi yoktur.

%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

Rutger , 310 bayt

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];

Çevrimiçi deneyin!

Rutger'i tekrar kullanmamın zamanı geldi. Maalesef, görev için en iyi dil olmayabilir, çünküeval beni dört if ifadesi kullanmaya zorluyor

Nasıl çalışır

Rutger nasıl çalışır?

Dilin nasıl işlediğine dair kısa bir önsöz: Her şey bir ödev veya bir işlevdir ve her işlev tam olarak bir argüman alır. Birden fazla argüman gerektiren işlemler için (örneğin çarpma), ilk çağrı , ikinci argümanla tekrar çağrıldığında beklenen sonucu veren kısmi bir işlev döndürür. Örneğin:

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

30 yazdıracak: Çevrimiçi deneyin!. Bu genellikle normal alternatiften daha uzun olsa da, örneğin bir zaman çizelgesi yazdırırken bir işlev sürekli olarak bir sabit argümanla ve bir değişken argümanla çağrıldığında, baytları kaydedebilir.

Bu bir argüman kuralı, döngüler ve koşullamalar dahil, sabit veya değişken olmayan her şeye uygulanır. Ancak, döngüler ve koşul ( For, Each, While, DoWhile, Ifve IfElse) olan yapılabilir aslında onları çalıştırmak için, yani Doişlevi çağrılmalıdır (yanıtında son satırına bakınız). Yine, bu, aynı döngüyü tekrar tekrar çalıştırırken baytları kaydedebilir veya döngülerin tanımı ve çalışması arasında rasgele kod çalıştırmanıza izin verebilir.

Son olarak, tümü bu programda kullanılan değişkenlere atıfta bulunmanın üç yolu vardır. Bunlardan ilki, değişken isminin bir sembolle birlikte bulunduğu doğrudan referanstır$ . Bu doğrudan değişkenin değerine erişir ve onu döndürür. İkincisi, ön ek karakterine sahip olmayan işlevsel referanslamadır . Bu, kodun değişkenlere atanmış (potansiyel olarak kısmi) fonksiyonlarla belirli bir değer içeren gerçek değişkenler arasında ayrım yapmasını sağlar. Son olarak, bir sembolle önceden eklenmiş dolaylı referanslama , @bir değişken yaratır (eğer mevcut değilse) ve değişken nesnesini belirli bir kapsam dahilinde döndürür. Bu, bir döngü değişkeni oluşturmanıza olanak sağlar (örn i.for i in range(...) ).

Gerçek çözüm nasıl çalışır?

İşte kodlanmamış kod:

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];

Çevrimiçi deneyin!

Görüldüğü gibi, bu üç değişken atayarak başlar n, eve asırasıyla her bir yeni elemanı için giriş, sırayla değişen elemanı ve modifikasyon sayısını temsil eder, hangi. Daha sonra bir süre döngüsü yaratırız:

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

Parantezler ( {ve }) bir kod bloğu tanımlar ; burada bloktaki son ifade, while döngüsü için koşuldur. Bu durumda, ikinci bir argüman alacak, kısmi bir modulo işlevi tanımlayarak başlıyoruz mve geri dönüyoruz e % m. Daha sonra bu kısmi işlevi şöyle adlandırırız:1 ikinci argüman olarak, dönen 0tamsayılar ve değişkenler için sıfır olmayan bir tamsayı. Daha sonra bunun mantıksal değil, eşlemesini hesaplıyoruz01 ve n0,n0.

Sonra while döngüsünün vücudundan oluşan mutlak canavarlığa geliyoruz:

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];}];

Bu döngünün birincil kısmı yinelenen bir for döngüsüdür 4while döngüsünün her yinelemesinde, yinelemeli değişkene sahiptir xve şunlardan oluşur:

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]];

İlk ifade, değiştirilmeden önce dizinin her yinelemesini yazdırır. Daha sonra loop değişkeniyle eşitliği kontrol etmek için kısmi bir fonksiyon yaratır xve if if ifadeleriyle karşılaşırız. Her ifade eder, eğer x, sırasıyla 1, 2, 3 ya da 4'e eşit, ve daha sonra temlik kher bir fonksiyon için *, +, -ve /daha sonra kısmi işlev yapar, ebağımsız değişken olarak. Son olarak, atamak eiçin kbirlikte çalışacak aikinci argüman ve artıma göre a.





2

TI83 / 84 TEMEL, 69 Bayt

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'da bir sayaç kurduk ve L1'i temizledik, böylece diziyi izlemek için kullanabiliriz. Daha sonra, bölme adımı bir kesire neden olana kadar tekrar ediyoruz. Döngüde önce N'yi listeye kaydederiz. Bir listenin sonunu geçen bir elemana ya da boş bir listeye saklamak o elemanı yaratır, bu nedenle bu mağaza her ne kadar bir kesire neden olmadığında bölmenin sonucunu ekler ve listeyi ilk seferde başlatır. Daha sonra dizinin sonraki 3 terimini eklemek için genişlemeyi kullanırız. Matematik, O değişkeninde A4k + 3 terimini hesaplayarak ve ardından A4k + 2 ve A4k + 4 kapalı O değerlerini temel alarak birkaç bayt daha küçük boyutta çalışır.

Sonunda bir Disp L1 kullandım ancak ekranın tüm şartlarına uymanın iyi bir yolu olmadığı için ne kadar ideal olduğundan emin değilim. Gerçekçi olarak, kullanıcı sonuçları kaydırmak için program manuel olarak çalıştıktan sonra kullanıcı L1'i yürütür.


1

Kömür , 29 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

İlk değeri girin.

W¬﹪θ¹«

Değer artık bir tamsayı olmayana kadar tekrarlayın.

Iθ⸿

Değeri kendi satırına yazdır.

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

Mevcut dört aritmetik işlemi hesaplayın ve mevcut çıkış satır numarasına bağlı olarak doğru olanı seçin.


1

Python 3 , 78 76 bayt

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

Çevrimiçi deneyin!

1 öğenin bir listesi olarak girdi alır ve tam sayı olmayana kadar dizinin bir sonraki öğesini tekrar tekrar ekler.

Giriş olarak bir listeye girilmesine izin verilmemesi durumunda, işte int olarak alan çok hızlı bir şekilde eklenmiş sürüm.

Bir tamsayı olarak giriş, 102 bayt

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)")])

Çevrimiçi deneyin!

Özyinelemeli fonksiyonu ismini unuttuğum için bana +2 bayt ...
Jitse sayesinde -4 bayt


1
Güzel yaklaşım! İşleviniz özyinelemeli olduğundan, isimsiz kalamaz. f=Ana kodunuza eklemelisiniz . Ancak, aynı zamanda 4 bayttan tasarruf edebilirsiniz n[-1]ve len(n)parantez içinde olması gerekmez. Çevrimiçi deneyin!
Jitse

Bir tamsayı yerine bir liste alma konusunda emin değilim (OP'ye sormanızı tavsiye ederim), ancak n[:-(n[-1]%1>0)]or f...bir bayt kurtarır
Jonathan Allan

1

Dal , 164 bayt

Tamam, bu yazmak gerçekten korkunçtu.

Sınırlamalar:

  • Hayır returns! Çıktınız ya da çıkmıyorsunuz
  • Yok hayır whileDöngü . Sen gerekir Özyinelemeyi ya da hiçbir şey kullanmak
  • Çıktı yapmak kolay değil! Her zaman çıktıyı tekrarlamanız gerekir
  • Kullanmadan değişkenlere değer veremezsiniz. setEtiketi
  • Döngüden kurtulmanın kolay bir yolu yok. Hiçbir yok break, continue,goto veya benzeri. Bu bir döngü kullanmak imkansız kılar.
  • Yalnızca 1 döngü var: for ... in ....ve bir dizideki tüm öğeler üzerinde durur, hiçbir şekilde durmaz.

Bütün bunlar kodu büyük yaptı!
Hey, hatta Java cevabından daha uzun sürdüm! @ Arnauld'un JavaScript cevapları
sürece ! ... 3 alternatifin tümü birleştirilerek.

İşte kod:

{%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 adresinde deneyebilirsiniz


Nasıl kullanılır:

Basitçe dosyayı alın ve ilk makroyu çağırın.

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

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

Kullanılabilir bir diziye sahip olmak için yapabilirsiniz a.a(21)|split(',').


Ungolfed:

{% 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 %}

Okuması kolay olmalı.
Bu gizli cevap, rastgele boşluk bırakmayacağından doğru çıktı vermeyecektir.
Sadece insanca okunabilir olmak için var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.