独自の「for」命令


38

独自の「for」命令

次の入力があると仮定します。 a, b, c, d

入力は、「a / b / c / d」または「a、b、c、d」などの形式を使用して1行で入力できます。

4つの入力を使用することもできます。

次の動作をコーディングする必要があります(ここでは疑似コード)。

var i = <a>
while (i <b> <c>)
    print i
    i = i + <d>
    print "\n"

以下にいくつかのテストケースを示します。

input : 1,<,10,1
output :
1
2
3
4
5
6
7
8
9

もう一つ:

input : 20,>,10,1
output :
20
21
22
23
24
25
26
27
...
infinite loop / program crashes
  • a整数で、の初期値ですi

  • bある文字列またはcharが、それは何か他のもの、の終了条件で使用されるコンパレータことはできません forループ。

    bとができなければなりません以下の文字列のいずれかであります:

    - ">"
    - "<"
    
  • cは、 ループの終了条件で使用される整数である整数forです。

  • dある整数すべてのループでIに添加されます。

これはコードゴルフです、最短の答えが勝ちます!


1
関数から標準出力に出力するのではなく、リスト/シーケンスとして数値を返すことはできますか?
smls

@smlsいいえ、申し訳ありませんが、出力は例のようである必要があります!
シグメイ

1
私のコードは擬似コードに従う必要がありprint "\n"、がありますが、私は各行にjavascriptのアラートを使用しています。それは受け入れられますか、それとも代わりにconsole.logを使用して回答を長くする必要がありますか?

2
出力機能としてアラート機能を使用できますが、複数のアラートを使用することはできません。alert("23\n24\n25");動作しalert("23"); alert("24"); alert(25);ないが動作しないようなもの
シグメイ

回答:


25

JavaScript(ES6)、 44  43 56バイト

ETHproductions Editのおかげで1バイト節約
:出力要件に準拠するように修正

(a,b,c,d)=>{for(s='';eval(a+b+c);a+=d)s+=a+`
`;alert(s)}

テスト


スコープの素晴らしい使用!
ETHproductions

evalバイトを節約するために再配置できると思います:(a,b,c,d)=>{for(;eval(a+b+c);a+=d)alert(a)}
-ETHproductions

@ETHproductionsああ、はい。良いですね!
アーナルド

5
チュチュ付きの44です!
アロス

これは、出力が行ごとにU + 000Aで行単位である仕様には従いません。
ジョーイ

17

Javascript(ES6)、47 42 48バイト

forバージョンを作成したかったのですが、誰かが速かったので、ここに再帰バージョンがあります。

(b,c,d)=>F=a=>eval(a+b+c)&&console.log(a)|F(a+d)

f=前に追加して、のように呼び出す必要がありますf(b,c,d)(a)

素晴らしいゴルフをしてくれたArnauldに感謝します。

alertconsole.log出力仕様のために変更されました


@Arnauldありがとう、それはかなりクールなゴルフです。私は彼に尋ねただけなので、彼がそれを受け入れるかどうか見てみましょう。

それが受け入れられてうれしいです。;)
アーナウド

これは、出力が行ごとにU + 000Aで行単位である仕様には従いません。
ジョーイ

@Joeyそれは単なる擬似コードですが、これについてOPに尋ねます。

@Masterzagh:代替の出力形式についてはすでに質問がありましたが、拒否されました。
ジョーイ


13

ゼリー、12バイト

Ṅ+⁶µ⁴;⁵¹vµ¿t

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

Jellyには反復を簡潔に実行したり、範囲を作成したりする多くの方法があります。ただし、C ++の動作を正確にミラーリングするのはかなり困難です。 )、および間違った方向に進む増分(したがって、ループの終了条件が自然に満たされないことを意味します)。そのため、このソリューションは基本的にC ++の直接的な翻訳ですが、通常はJellyプログラムよりも低レベルになります。幸いなことに、C ++には符号付き整数オーバーフローに関する未定義の動作があります(質問ではが使用されますint)。つまり、プログラムはその場合に何でもできるので、オーバーフロー動作を模倣する必要はありません。

説明

Ṅ+⁶µ⁴;⁵¹vµ¿t
   µ     µ¿   While loop; while ((⁴;⁵¹v) counter) do (counter = (Ṅ+⁶)counter).
    ⁴;⁵       Second input (b) appended to third input (c), e.g. "<10"
        v     Evaluate, e.g. if the counter is 5, "<10" of the counter is true
       ¹      No-op, resolves a parser ambiguity
Ṅ             Output the counter, plus a newline
 +⁶           Add the fourth input (d)
           t  Crashes the program (because the counter is not a list)

プログラムのクラッシュは、Jellyの暗黙的な出力をオフにする最も簡単な方法です(そうしないと、カウンターの最終値が出力されます)。stderrで大量のエラーメッセージが生成されますが、通常は許可されると考えています。

ちなみに、ループを開始する前に、ループカウンターは現在の値で初期化されます。プログラムの開始時にループが表示されるため、それが最初の入力になります。


クラッシュしないtように変更できます。デキューの結果、空のリストが生成され、Jellyの暗黙的な印刷では何も生成されません。
ジョナサンアラン

@JonathanAllan:ありません。実際に行うのは、2から指定された値までの範囲を作成することです。これは、暗黙の印刷で確実に表示されます。

ああ、負の領域で終わるループでその理論をテストしたに違いありません。実際、範囲は暗黙的に作成されます。
ジョナサンアラン

ええと、これは12文字ですが、12バイトではありませんか?
ランチャー

@Cruncher:Jellyは、言語で使用される各文字が1バイトで表される独自のエンコーディングを使用します(256個の異なる文字のみを使用します)。コードページ437のようなよく知られたものを使用しない理由は、入力しやすくするためです(つまり、入力はそれほど簡単ではありませんが、gs2のような言語よりも簡単です)。このプログラムの16進ダンプの長さは12バイトです。



9

Java、58バイト

(a,b,c,d)->{for(;b>61?a>c:a<c;a+=d)System.out.println(a);}

14
作成する理由はありますiか?初期化部分をスキップして使用することはできますaか?また、 '>'(62)のASCII値を使用すると、バイトが節約されます。
ライリー

6
ライリーさんのコメントに続いて、あなたが行うことができますb>61
KritixiのLithos

これがコンパイルされるとは思わない。
ChiefTwoPencils

@ChiefTwoPencilsこれは関数です。コンパイルするには、テストプログラムを作成する必要があります。
-wizzwizz4

@ wizzwizz4、明らかに。しかし、それでもまだ機能しません。試してみます。さらに、私の理解では、実行に必要なすべてのバイトがカウントされます。
ChiefTwoPencils

7

05AB1E22 20バイト

[D²`'>Q"‹›"è.V_#D,³+

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

説明

[                       # start loop
 D                      # copy top of stack (current value of a)
  ²`                    # push b,c to stack
    '>Q                 # compare b to ">" for equality
       "‹›"             # push this string
           è            # index into the string with this result of the equality check
            .V          # execute this command comparing a with c
              _#        # if the condition is false, exit loop (and program)
                D,      # print a copy of the top of the stack (current value of a)
                  ³+    # increment top of stack (a) by d

1
任意の入力形式が受け入れられるため、2番目のバージョンは問題あり
ません

7

SmileBASIC、53バイト

INPUT A,B$,C,D
S=ASC(B$)-61WHILE S*A>S*C?A
A=A+D
WEND

説明:

INPUT A,B$,C,D
IF B$=="<" THEN S=-1 ELSE S=1 'get comparison direction
I=A
WHILE S*I>S*C 'loop while I is less than/greater than the end
 PRINT I
 INC I,D
WEND

これは以下X<Yと同じ事実を使用します-X>-Y


私はこれについてあなたを信頼します、私はテストする3DSを持っていません:)
Sygmei

Petit Computerを持っているので、とてもクールなアイデアです!私はこのような何かいつか...しようとする
のpython-B5

READ1バイトを節約するステートメントを使用できます。
ckjbgames

@ckjbgamesどうやって?
12Me21

@ 12Me21 SmileBASICのマニュアルを確認してください。それは、SmileBASICのための指示のリストにあるべきです。
ckjbgames

6

積み上げ、34バイト

@d@c@b[show d+][:c b tofunc!]while

オンラインでお試しください!(テストが含まれています。)これは、スタックが次のようになることを期待する関数です。

a b c d

例えば:

1 '<' 10 2
@d@c@b[show d+][:c b tofunc!]while

説明

@d@c@b[show d+][:c b tofunc!]while
@d@c@b                               assign variables
               [............]while   while:
                :c                   duplicate "i" and push c
                   b tofunc!         convert b to a function and execute it
      [.......]                      do:
       show                          output "i" without popping
            d+                       and add the step to it

4

C ++、80

おっと、これはC++そうではありませんC。質問に少し混乱しました。

void f(int a,char b,int c,int d){for(;b==62?a>c:a<c;a+=d)cout<<a<<endl;}

これはCまたはC ++ですか?
betseg

10
C ++のどの実装ですか?(私はあなたがusing namespace std無料で似たようなものを得ている方法に興味があります)
H・ウォルターズ

i始める必要はaありません0か?単に使用aしてi完全にスキップし、 '>'のASCII値を使用できます。for(;b==62?a>c:a<c;a+=d)
ライリー

動作しませんf(1,'<'3,1);
ローマングレーフ

ええ、ええ、両側に数学が必要です。for(b-=61;b*a>b*c;a+=d)シングルバイトで動作します。しかしそうfor(;b-62?a<c:a>c;a+=d)です。
H・ウォルターズ



4

ピップ、14バイト

W Va.b.ca:d+Pa

4つのコマンドライン引数を取ります。負の浮動小数点数と比較演算子をサポートしています< > = <= >= !=オンラインでお試しください!

                a,b,c,d are cmdline args
W               While loop with the following condition:
  Va.b.c          Concatenate a,b,c and eval
            Pa  Print a with newline (expression also returns value of a)
        a:d+    Add d to that and assign back to a

4

ゼリー、8バイト

ḢṄ+⁹;µV¿

これは、a、b、cを左引数、dを右引数とするダイアディックリンクです。出力は無限であり、STDOUTに送られます。

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

使い方

ḢṄ+⁹;µV¿  Dyadic link.
          Left argument:  a,b,c (integer, character, integer)
          Right argument: d     (integer)

       ¿  While...
      V     the eval atom applied to a,b,c returns 1:
     µ       Combine the links to the left into a chain and apply it to a,b,c.
Ḣ              Head; pop and yield a from a,b,c.
 Ṅ             Print a, followed by a linefeed.
  +⁹           Add a and the right argument (d) of the dyadic link.
    ;          Concatenate the result and the popped argument of the chain,
               yielding a+d,b,c.

コマンドライン引数はPython構文を使用し、文字とシングルトン文字列を区別できません。CLAを使用する場合はF、配列を平坦化するためにを挿入する必要があります。
デニス

2
今、私はそれが時代遅れなので、残りの半分を保持しながら、私のコメントの半分を削除したい。関連する半分を繰り返し、残りを削除すると思います。「ああ、それは関数として定義したので、PPCGルールの下での暗黙的な出力を無視できます。それについて考えるべきでした。」


4

プレーンTeX、88バイト

\newcount\i\def\for#1 #2 #3 #4 {\i#1\loop\the\i\endgraf\advance\i#4\ifnum\i#2#3\repeat} 

このコマンド\forは、要求された機能を提供します。これを保存してfor.texから実行し、コマンドラインで変数値を入力しますpdftex '\input for \for 1 < 5 1 \bye'。変数値はスペースで区切る必要があります。


4

Python 3、61バイト

1つのライナー:

e=input;exec(f'i={e()}\nwhile i{e()}{e()}:print(i);i+={e()}')

サイトへようこそ!新しいリテラル文字列補間機能の素晴らしい使用。\tスペースで置き換えることでバイトを節約できるかもしれません。
0 'を

ありがとう。3番目のe()の後に\ n \ tを削除した後も同じサイズ
G-Ox7cd




3

Common Lisp、 82 80 79 73 64バイト

(defmacro f(a b c d)`(do((i,a(+ i,d)))((not(,b i,c)))(print i)))

テスト

(f 1 < 10 1)

1 
2 
3 
4 
5 
6 
7 
8 
9 
NIL
CL-USER> 

PrzemysławPのおかげで-9バイト。


おそらく、マクロを定義することで9バイトを節約できます。(defmacro f(a b c d)<insert backqoute here>(do((i,a(+ i,d)))((not(,b i,c)))(print i)))使用法:(f 1 < 10 1)

@PrzemysławPありがとうございます!
コアダンプ

3

PHP、69 65バイト

for(list(,$i,$b,$c,$d)=$argv);$b<"="?$i<$c:$i>$c;$i+=$d)echo"$i
";

「-r」で実行します。入力としてコマンドライン引数を提供します。

以下のためにちょうど1バイト以上 4つの以上のバイトは、私はすべての作業を実行できます。

for(list(,$i,$b,$c,$d)=$argv;eval("return $i$b$c;");$i+=$d)echo"$i
";

ええ、悪の評価。何かを返すことができることをご存知ですか?


略式の構造化[,$i,$b,$c,$d]=$argv;により、さらに4バイト節約できます。
しかし、PHP 7.1はこの課題の後期です。


きちんとした!チャレンジを作成するときに、すべての一般的な演算子を含める必要があるかどうかは
わかり

うわー、評価は悪です。
サイバービット

PHP 7.1を使用して短くすることができるように思えます。そうでない場合は、使用するとlist4バイトに加えて4バイトが短い構文で保存されます
ヨルグヒュルサーマン

@PHP 7.1はチャレンジをポストデートします。しかし、ありがとうlist()
タイタス

2

Perl 6、44バイト

{.say for $^a,*+$^d...^*cmp$^c!= $^b.ord-61}

使い方

{                                          }  # A lambda.
          $^a                                 # Argument a.
             ,*+$^d                           # Iteratively add d,
                   ...^                       # until (but not including the endpoint)
                       *cmp$^c                # the current value compared to c
                                              # (less=-1, same=0, more=1)
                              != $^b.ord-61.  # isn't the codepoint of the b minus 61.
 .say for                                     # Print each number followed by a newline.

typeの値として(潜在的に無限の)数値のシーケンスを返すことが問題ない場合Seqは、数値をstdoutに出力する代わりに、.say forパーツを削除して35バイトに減らすことができます。


2

Clojure、66 63バイト

#(when((if(= %2"<")< >)% %3)(println %)(recur(+ % %4)%2 %3 %4))

を因数分解して-3バイトloop。実行中のアキュムレーターとして機能するために、initパラメーターを「乱用」しています。

再帰的ソリューション(TCOを使用)。pregolfedコードのコメントを参照してください。TCO以外の再帰的なソリューションを試したところ、67バイトになりました。

Clojureでこのビートを見たいです!これは私が手に入れることができる最小のものだと思います。

(defn my-for [init-num com-str com-num inc-num]
  (let [op (if (= com-str "<") < >)] ; Figure out which operator to use
    (when (op init-num com-num) ; When the condition is true, print and recur
      (println init-num)
      (recur (+ init-num inc-num) com-str com-num inc-num))))
    ; Else, terminate (implicit) 

ああ、私はこの答えに気づかなかった。#(when(({">">"<"<}%2)% %3)(println %)(recur(+ % %4)%2 %3 %4))あなたwhenとmy を組み合わせた61バイトになります({">">"<"<}%2)
ニコニール

2

Groovy、51バイト

{a,b,c,d->while(Eval.me("$a$b$c")){println a;a+=d}}

これは名前のないクロージャーです。オンラインでお試しください!

注意 -を使用してこれをテストgroovy consoleする場合は、入力によって無限ループが発生したときにプロセス全体を強制終了してください。〜5ギガバイトのRAMを消費した後、私はこれに気付きました。


2

QBIC51 40バイト

:;::{?a┘a=a+c~A=@<`|~a>=b|_X]\~a<=b|_X

そして、投稿後3分で、ターミネーターロジックを簡略化できることに気付きました...

:;::      Consecutively read a, A$, b and c from the command line
{?a┘      Start an infinite loop; print a, add a newline to the source
a=a+c     increment a
~A=@<`|   If we are in LESS THAN mode
  ~a>=b   and IF we are no longer LESS
    |_X]  THEN QUIT, end if.
  \       ELSE (we're in GREATER THAN mode)
    ~a<=b IF we are no longer GREATER
    |_X   THEN QUIT
          The last IF and the loop are auto-closed

2

バッチ、94バイト

@set i=%1
@set o=gtr
@if "%~2"=="<" set o=lss
:g
@if %i% %o% %3 echo %i%&set/ai+=%4&goto g

2番目のパラメーターの動作がなかった場合、53バイトで実行できます。

@for /l %%i in (%1,%4,%n%)do @if not %%i==%3 echo %%i

ステップの符号が間違っている場合、これは単に何もしません。追加のテストは、バッチのforループによりループ変数が終了値に等しくなるためです。


2

Clojure、66バイト

#(loop[i %](if(({">">"<"<}%2)i %3)(do(println i)(recur(+ i %4)))))

これは、55のバイトだったかもしれない<>のClojureでの関数です。

(def f #(loop[i %](if(%2 i %3)(do(println i)(recur(+ i %4))))))
(f 1 < 10 1)

ここでの地図の使用が好きです。私はそれが私の道を打ち負かすだろうと思ったことはなかったでしょう。また、アプローチがわずかに異なりますが、両方の初期カウントが同じであったことも興味深いです。
発癌性

bを関数にすると、一部の言語で不公平な利点が得られます:)
シグメイ

確かに、Clojureを除き、私が知っているほとんどの言語<"<"、の代わりにを許可してもあまりメリットがないと思います。
ニコニール

@Sygmei本当。しかし、それはおかしく甘いでしょう。あなたがその電話をしたことを責めることはできません。
発癌性

OPは、比較演算子btwの文字列ではなく、文字は問題ないと言いました。これにより、数バイト節約できます。
発癌性

2

TI-Basic、41 34バイト

Prompt A,Str2,Str3,D
While expr("A"+Str2+Str3
Disp A
A+D->A
End

1
TI計算機の動作方法では、多くのシンボルが1バイトとして保存されます。Prompt Str2Str3While expr(Disp ->、およびEndすべての半角記号です。29バイトを数えます。
パベル

@Pavelご関心をお寄せいただきありがとうございます!TI-Basicがトークン化されているのは事実ですが、すべてのトークンが1バイトではありません。たとえば、Str2Str3、およびexpr(すべての2バイトのトークンです。1バイトトークンのリストを確認するには、tibasicdev.wikidot.com
Timtech
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.