シーケンスを印刷する


24

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

このパズルに触発され、整数n>0与えられると、非整数に達するまで次のシーケンスを出力します(最初に自分でパズルを解きたい場合のためにネタバレ)

a0=n4 K + 1 = 4 、K4 K + 1 4 、K + 2 = 4 、K + 1 + 4 K + 2 4 、K + 3 = 4 、K + 2 - 4 k + 3 a 4 k + 4
a4k+1=a4k4k+1
a4k+2=a4k+1+4k+2
a4k+3=a4k+24k+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
いいえ、シーケンス全体を印刷する必要があります。
無限

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>およびと比較して1バイト節約されました"*+-/"。レガシーバージョンでは、0で除算される数値は同じままであるため、これは機能します。一方、新しいバージョンでは0になります。実際の数学では、ゼロによる除算エラーが発生します。


11

スクラッチ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声明を楽しんで、皆さんを見てください!まあ、私ではありません!いいえ ...スクラッチにはevalがないため、難しいことをしなければなりませんでした ... ifステートメント。

少なくともそうではありませんgoto...


2
ifステートメントとfloat除算を楽しんで、あなたを見てください!まあ、私ではありません!いいえ ...ホワイトスペースにはevals、ifステートメント、またはfloat-divisionがありません。そのためgoto、スタックベースの言語で、sと減算ループを使って、分割できるかどうかを確認する必要がありました。 。; p(すべての真剣さ、いい答え、私からの+1です。完成したホワイトスペースの答えで引用するのを
拒む

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]説明としてのみ追加。

オンラインで試す(未加工のスペース、タブ、改行のみ)。

@JoKingのコメントを示唆した-24バイトn%i > 0。のみが、if(x < 0)そしてif(x == 0)空白で利用可能な、単にチェックはif(x*-1 < 0)基本的に同じですif(x > 0)@JoKingの
おかげで、-25バイトが追加されました

説明:

スクラッチ回答からの引用:

少なくともそうではありませんgoto...

誰かが言ったgoto?空白にはgoto、ループとifステートメントの両方を作成する以外に何もありません。xDさらに、スタックベースの言語なので、かなり頻繁にスワップ/破棄/コピーする必要があります。さらに、ホワイトスペースには浮動小数点がなく、整数除算しかありませんので、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ほとんどの場所で...
ケビンCruijssen

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で、2番目の提案は-18です。:)
ケビンクルーッセン


7

JavaScript(V8)、52バイト

4つの用語のグループを印刷します。GBのRubyの回答に触発されました。

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

Piet297 190 144コーデル(432バイト)

新しいPietコード

を使用して新しいアプローチを試みました pointerswitch(k mod 4)としてコマンドをて出力コードを統合し、より高密度の10x19コード画像を作成。それから、私はそれを1行と2列で8x18まで下ろしました。

動作を確認するためのトレースを次に示します。

ここに画像の説明を入力してください

最初の行は、開始インデックスとしてスタックに0をプッシュします(できるのは push自然数ため、2をプッシュしてから減算します)、入力を数値として読み取ります。

一番左の列には、番号を複製して出力にポップし、スタックの一番上にインデックスを移動し、インクリメントしてから3回複製するという共有コードがあります。次に、濃いシアンのコーデルを通してパステルカラーの赤いr型ブロックを入力します。pointer、インデックスMOD 4の残りの部分に異なるパスを与えるコマンドの入力します。

Mod 1、上部を抜けて乗算します。最初にインデックスのコピーを後でシャッフルしてから、乗算を実行します。白を経て何もしなかった後、上記の列を入力してccパリティを修正します(ループを安定させるために偶数回反転する必要があります)。その後pointer (1)、マゼンタのバーに入ることから: 4つのパスをキャッチして、ループに送り返します。

Mod 2、後方に出て合計します。パステルコードブ​​ロックの形状は、入力した場所から上の行を抜けることを意味し、赤いコーデルを抜けてスタックにプッシュする3を使用します。pointer (3)自分自身の上にします。この列には、算術の前に空白があり、ccのプッシュと切り替えの順序が少し異なります。そうしないと、隣接する列の整数値コーデルと色が重複するためです。

Mod 3は減算のために下向きに送信します。乗算の除算と同じですが、途中で除算パスを通過します(パステルグリーンのバーに入るとccのパリティが異なるため、2つの実行は異なるバーでそのバーを終了します)。その間に、不要なduplicateコマンドをpop取得するため、cc補正およびコレクションバーに入る前に、濃い緑のコーデルでコマンドを戻します。

Mod 4、まっすぐに分割します。ここでは、整数をテストする必要があるため、最初にスタックをより激しくシャッフルして、nとaの2つのペアを取得して操作を実行する必要があります。私たちは、私がやっていることを行うmod最初のペアで、その後、notその後のためにすることを使用し、その結果にpointerそれは割り切れない場合、我々は2つので私たちを送信する、ストレート続ける- pointer避けられないブロックに反対側の隅にコマンドおよびそのプログラムを終了します。それ以外の場合は、右に曲がりdivide、マゼンタバーに入るコマンドを取得します。

古いバージョン

ピートコード

非常に単純なコード:1と入力をスタックにプッシュし、次の方法で4つの操作をループします。スタックの最上部のインデックスをシャッフルし、1ずつインクリメントし、複製し、1つのコピーをシャッフルして、算術演算を実行します。番号を複製し、出力にポップします。

除算(シーケンスが終了できる唯一の除算)では、より複雑なスタックを作成して、最初にn mod index == 0かどうかをチェックします。そうでない場合は、回避不能なコーデルに入り、終了します。それ以外の場合、iとnの2番目のコピーを使用して除算を実行します。


2列目と3列目を一緒につぶすことは可能でしょうか?つまり、ピンクのセルを(0,1)->(1,2)にピボットし、中央の3つのセルを下に移動し、右の列を1x2に縮小しますか?
ヴェスカ

簡単ではありません。push (1) pointer色付きのセルの上にある黒いセルまたは右のセルのいずれかのために、右のターンを実行するには2つのセルが必要です。
AlienAtSystem

4

C#(Visual C#インタラクティブコンパイラ)7270、69のバイト

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

オンラインでお試しください!


1
Arnauldの最初のJavaScript関数Rubyの回答の移植版)を移植して59バイト。そして、はい、この出力は許可されています。チャレンジのコメントでOPから確認を得ました。
ケビンクルーッセン

@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バイトのArnauldに感謝します。


私の最後の答えを移植して53バイト
アーノールド

3
Shaggyによって提案された改善を使用することで52バイト。JSでは同じ長さであることが判明しましたが、Rubyでは1バイト節約されます。
アーノールド

4

R90バイト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パズルのより深い分析から、次の。実際、3種類のシーケンスのみがあります。a⁰が8を法とする1に一致しない場合の長さ4のシーケンス。a⁰が32を法とする21に一致する場合、長さ12のもの。残りのケースの長さ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
{}for -2バイトを削除できます。
ロビンライダー

1
を避けて74バイトlength
ロビンライダー

3

Haskell104 86 85バイト

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

オンラインでお試しください!

h=それが唯一のテストのために使われていますので、省略することができます。

ああ、コードのゴルフ、時間の複雑さの2次的な増加は、1つのキャラクターを減らすために価値があります。

104バイト

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

オンラインでお試しください!

私はこの回答の方が好きですが、悲しいかなそれは長いです。


3

Japt25 24 バイト

GBのRubyソリューションの別の適応。

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

それを試してみてください

ここでの主なトリックは、c配列のメソッドのオーバーロードです。別の配列を引数として渡し、元の配列に連結します。最後の再帰呼び出しで行われるように、引数として数値を渡し、元の配列をその数のレベル1(この場合は丸めた後)でフラット化します。ただし、配列の深さは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);}

オンラインでお試しください。

4つの値すべてを含む配列を作成することは、@ GBのRubyの回答に触発されていますが、3つの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];

オンラインでお試しください!

Rutgerを再び使用したときです。残念ながら、それはのフォームを持っていないため、タスクに最適な言語ではない場合がありますeval場合があります。4つのifステートメントを使用する必要があります

使い方

ラトガーの仕組み

言語がどのように機能するかについての簡単な序文:すべては代入または関数のいずれかであり、すべての関数は引数を1つだけ受け取ります。複数の引数を必要とする演算(乗算など)の場合、最初の呼び出しは部分関数を返し、2番目の引数で再度呼び出されると、期待される結果を返します。例えば:

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

30を印刷しますオンラインで試してください!。通常、これは通常の代替手段よりも長いですが、たとえば時間テーブルを出力するときなど、1つの定数引数と1つの変更引数で関数が繰り返し呼び出されると、バイトを節約できる場合があります。

この1つの引数の規則は、ループや条件を含む、定数でも変数でもないすべてのものに適用されます。しかし、ループと条件は(ForEachWhileDoWhileIf及びIfElse)ですなんとか実際にそれらを実行するためには、つまり、Do関数は(答えの最後の行を参照)を呼び出さなければなりません。繰り返しますが、これは同じループを繰り返し実行するときにバイトを節約したり、定義とループの実行の間で任意のコードを実行できるようにします。

最後に、変数を参照する3つの方法があり、そのすべてがこのプログラムで使用されます。1つは直接参照で、変数名の前に$記号が付きます。これは変数の値に直接アクセスし、それを返します。2つ目は、機能参照です。これには、プレフィックス文字がありません。これにより、コードは変数に割り当てられた(潜在的に部分的な)関数と、特定の値を含む実際の変数を区別できます。最後に、シンボルを接頭辞とする間接参照@は、変数を作成し(まだ存在しない場合)、特定のスコープ内の変数オブジェクトを返します。これは、(例えば、あなたがループ変数を作成することができますifor 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];

オンラインでお試しください!

ご覧のとおり、入力、シーケンス内の変化する要素、新しい要素ごとの修正番号をそれぞれ表す3つの変数neおよびを割り当てることから始めaます。次に、whileループを作成します。

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

中括弧({および})はコードブロックを定義します。ブロック内の最後のステートメントは、whileループの条件です。この場合、部分モジュロ関数を定義することから始めます。これは、2番目の引数を受け取りm、を返しe % mます。次に、この部分関数を呼び出します1 2番目の引数として、 0整数の場合、浮動小数点数の場合はゼロ以外の整数。次に、この論理ではなく、マッピングを計算します01 そして n0n0

次に、whileループの本体で構成される絶対的な怪物に行きます。

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ループで、反復します 4whileループの各反復の時間は、次の反復変数を持ち、それら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]];

最初のステートメントは、シーケンスを変更する前に、シーケンスの各反復を出力します。次に、ループ変数との等価性をチェックする部分関数を作成し、x4つのifステートメントを見つけます。各ステートメントチェックがあればx、ISは、それぞれ1、2、3または4に等しく、そして次に割り当てをk各関数に*+-そして/次いで部分関数にそれを行い、e引数として。最後に、私たちは、割り当てるeためにk使用して実行a2番目の引数、および増分としてa





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をリストに格納します。リストの末尾または空のリストを超えて1つの要素に格納すると、その要素が作成されるため、この1つの格納では、分数が発生しない場合に除算の結果が追加され、最初のパスでリストが初期化されます。次に、augmentを使用して、シーケンスの次の3つの用語を追加します。変数Oで項A4k + 3を計算し、次にA4k + 2とA4k + 4をOに基づいて計算することにより、数バイト小さくなります。その後、分割チェックを繰り返してNをリセットし、Aに4を追加します。

最後にDisp L1を配置しましたが、画面上のすべての用語に適合する良い方法がないため、どれほど理想的かはわかりません。現実的には、プログラムを手動で実行して結果をスクロールした後、ユーザーはL1を実行します。


1

、29バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

初期値を入力してください。

W¬﹪θ¹«

値が整数でなくなるまで繰り返します。

Iθ⸿

値を独自の行に出力します。

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

4つの使用可能な算術演算を計算し、現在の出力行番号に応じて正しいものを選択します。


1

Pythonの378の、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バイト...
Jitseで-4バイト


1
素敵なアプローチ!関数は再帰的であるため、匿名のままにすることはできません。f=メインコードに含める必要があります。ただし、中括弧で囲む必要がないためn[-1]、4バイトを節約することもできlen(n)ます。オンラインでお試しください!
Jitse

整数ではなくリストを取ることについてはわかりませんが(OPに問い合わせることをお勧めしn[:-(n[-1]%1>0)]or f...ます)、バイトを節約します
Jonathan Allan

1

小枝、164バイト

さて、これは実際に書くのが恐ろしく恐ろしいことでした。

制限事項:

  • いやreturns!出力するか、出力しない
  • whileループなし。あなたはしなければならない再帰または何を使用します
  • 出力する簡単な方法はありません!毎回出力を繰り返す必要があります
  • setタグを使用せずに変数に値を与えることはできません
  • ループから抜け出す簡単な方法はありません。そこにはいないbreakcontinuegotoまたは類似しました。これにより、ループを使用できなくなります。
  • ループは1つのみです:for ... in ....、配列内のすべての要素をループし、停止する方法はありません。

これらすべてがコードを巨大にしました!
ちょっと、Javaの答えよりも長くしました!@Arnauldの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 %}

読みやすいはずです。
この無回答は、ランダムな空白を投げるので、正しい出力を提供しません。
それは単に人間が読めるように存在するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.