反復バイトカウンター


19

あなたの仕事は、バイト数Lの空でないプログラム/関数を書くことです。これは、M回繰り返されると、与えられた正の整数NL×Mに等しいかどうかをチェックします。

理論的には、任意の数の繰り返し(Mの任意の正の整数値)をサポートする必要がありますが、言語の制限により、特定のしきい値を超えて動作できない場合は問題ありません。プログラムのソースコードを読んだり、プログラムに関する情報にアクセスしたりすることは固く禁じられています。

出力を提供するには、状態の1つ(真実または偽)に一貫した値を選択し、他の状態に他の(必ずしも一貫性のない)可能な出力を使用する必要があります(Discussion)。

回答は、最初のプログラムの長さL(バイト単位)でスコアリングされ、バイト数は少ないほど良いです。

(初期)プログラムがであるとしましょうABCDE。次に:

  • ABCDE(1回の繰り返し)入力が5に等しいかどうかを確認する必要があります。
  • ABCDEABCDE(2回の繰り返し)入力が10に等しいかどうかを確認する必要があります。
  • ABCDEABCDEABCDE(3回の繰り返し)入力が15に等しいかどうかを確認する必要があります。等...

このサンプルコードのスコアは以下のようになり5初期ソースは5バイトの長さであるように、。


明確にするために、それ自体の時間の後に連結された長さのソースコードは、その入力がLMNL*M

回答:


12

ゼリー、1バイト

出力は、一致の場合は0、不一致の場合は非ゼロです。

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

使い方

これにより、過度にリベラルな出力形式を利用できます。 M回繰り返すと、入力がM回デクリメントされるため、結果がゼロになるのは、入力がLMの場合(L = 1の場合のみ)です。


なんてこった …(inb4全員が他のエソランに移植しています...
Xcoder氏18年

私は0バイトの回答を念頭に置いていましたが、ええ、クイン。:P
エリック・ザ・アウトゴルファー

私の最初の考え。23分倒された:(
Khuldraeseth na'Barya


8

網膜21 20バイト

\d+
*
^$
_
^_{20}

_

オンラインでお試しください!コードウィンドウでパーツを繰り返して、倍数の処理方法を確認します。

与える0他のすべての正しい複数の正の整数のために。

説明

最初に単一のプログラムを見てみましょう。

\d+
*

これは、10進数を単項に変換します(_単項数字として使用)。

^$
_

文字列が空の場合(入力が正であることが保証されているため、この時点では発生しません)、単一のに置き換え_ます。

^_{20}

ここで、最初の20個のアンダースコアを取り除きます。入力がの20場合、これは空の文字列になります。

_

そして最後に、結果のアンダースコアの数をカウントします20。これは、入力がであった場合はゼロです。


ここで、ソースコードを繰り返すとどうなりますか。プログラムに参加するときに改行を挿入しないため、最初の行は最後の行の最後に移動します。プログラムを2倍にすると、次のようになります。

\d+
*
^$
_
^_{20}

_\d+
*
^$
_
^_{20}

_

アンダースコアを数える代わりに、次の段階になります。

_\d+
*

この段階では何​​もしません。これは、この時点で作業文字列にもう数字がないため、正規表現が一致しないためです。

^$
_

これで、この段階が重要になります。入力が20の倍数より小さい場合、文字列はソースコードの以前のコピーによって空にされています。その場合、それを単一のアンダースコアに変換します。これは、プログラムで再び空の文字列に変換することはできません。これにより、M番目の倍数のみが受け入れられます(M番目までのすべての倍数ではありません)。

^_{20}

最初の20個の下線をもう一度削除します。したがって、可能であれば、ソースコードをM回繰り返すと、文字列から20Mの下線が削除されます。

_

そして、プログラムの最後に到達しても、アンダースコアをカウントするので、有効な入力はゼロになります。


6

x86 32ビットマシンコードフラグメント、1バイト

48                      dec    eax

EAXでの入力、EAXでの出力:trueの場合は0、falseの場合はゼロ以外。(ZFフラグはtrueに設定されたまま、falseに設定されていないため、可能ですje was_equal)。「ボーナス」として、ラッピングを心配する必要はありません。32ビットx86は4GiBのメモリのみをアドレス指定できるため、Mを十分に大きくして、すべてをラップして1 == 2**32 + 1何かを見つけることはできません。

呼び出し可能な関数を作成するには、M回0xC3 ret繰り返した後に命令を追加します0x48。(多くの言語は、競合するために関数本体または式のみを繰り返す必要があるため、合計数には含まれません)。

プロトタイプを使用してGNU Cから呼び出し可能 __attribute__((regparm(1))) int checkeqM(int eax); GNU Cさんregparmのx86関数属性など-mregparm使用、EAXを使用して最初の整数argを渡します。

たとえば、この完全なプログラムは2つの引数を取り、JITは命令の+ Mをバッファーにコピーし、retそれを関数として呼び出します。(実行可能ヒープが必要です;でコンパイルしますgcc -O3 -m32 -z execstack

/******* Test harness: JIT into a buffer and call it ******/
// compile with gcc -O3 -no-pie -fno-pie -m32 -z execstack
// or use mprotect or VirtualProtect instead of -z execstack
// or mmap(PROT_EXEC|PROT_READ|PROT_WRITE) instead of malloc

// declare a function pointer to a regparm=1 function
// The special calling convention applies to this function-pointer only
// So main() can still get its args properly, and call libc functions.
// unlike if you compile with -mregparm=1
typedef int __attribute__((regparm(1))) (*eax_arg_funcptr_t)(unsigned arg);

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc<3) return -1;
    unsigned N=strtoul(argv[1], NULL, 0), M = strtoul(argv[2], NULL, 0);

    char *execbuf = malloc(M+1);   // no error checking
    memset(execbuf, 0x48, M);     // times M  dec eax
    execbuf[M] = 0xC3;            // ret
    // Tell GCC we're about to run this data as code.  x86 has coherent I-cache,
    // but this also stops optimization from removing these as dead stores.
    __builtin___clear_cache (execbuf, execbuf+M+1);
     //   asm("" ::: "memory");  // compiler memory barrier works too.

    eax_arg_funcptr_t execfunc = (eax_arg_funcptr_t) execbuf;
    int res = execfunc(N);
    printf("%u == %u  =>  %d\n", N,M, res );
    return !!res;   // exit status only takes the low 8 bits of return value
}

非PIE実行可能ファイルは、仮想メモリの下位にロードされます。より大きな連続mallocを実行できます。

$ gcc -g -O3 -m32 -no-pie -fno-pie -fno-plt -z execstack coderepeat-i386.c
$ time ./a.out 2747483748 2747483748   # 2^31 + 600000100 is close to as big as we can allocate successfully
2747483748 == 2747483748  =>  0

real    0m1.590s     # on a 3.9GHz Skylake with DDR4-2666
user    0m0.831s
sys     0m0.755s

$ echo $?
0

 # perf stat output:
       670,816      page-faults               #    0.418 M/sec                  
 6,235,285,157      cycles                    #    3.885 GHz                    
 5,370,142,756      instructions              #    0.86  insn per cycle         

GNU Cはサポートしていないことに注意してくださいptrdiff_t(符号付き32ビット)より大きいオブジェクトサイズをがmallocmemsetまだ動作する。したがって、このプログラムは成功します。

ARM Thumbマシンコードフラグメント、2バイト

 3802            subs    r0, #2

最初のarg in r0および戻り値in r0は、標準のARM呼び出し規約です。これにより、フラグ(s接尾辞)も設定されます。楽しい事実; そのフラグ設定バージョンsub 32ビット幅の命令です。

追加する必要がある戻り命令は bx lrです。

AArch64マシンコードフラグメント、4バイト

d1001000        sub     x0, x0, #0x4

64ビット整数で動作します。入力/出力x0標準の呼び出し規則に従って、。 int64_t foo(uint64_t);

AArch64には(まだ)Thumbモードがないため、1命令が最善です。


これに遭遇した他の人への注意:への呼び出し__builtin___clear_cacheは、から取得したメモリを実行しているためにのみ必要ですmallocmmap代わりにメモリを取得した場合、最適化は行われません。
ジョセフ・シブル・ライステートモニカ

4

V、16(または1)バイト

退屈な答え:

<C-x>

1バイト。

退屈な答え:

uÓ^$/0
16Ø^a$

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

Hexdump:

00000000: 75d3 5e24 2f30 0a31 3601 d85e 1261 240a  u.^$/0.16..^.a$.

チャレンジが出てから約5分後に実際にこれを書きました。私が言語と呼ぶこの恐ろしいスパゲッティコードの山にパッチを当てるのに30分かかりました。





2

Brain-Flak、24バイト

({}[(((()()()){}){}){}])

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

0等しい場合に戻り、等しくない場合に何かを返します。

使い方:

({} #pop the top of the stack
  [(((()()()){}){}){}] #subtract 24
) #push the result.

このコードの実行n時間はn * 24入力から減算され、input =の場合にのみ0になりますn*24



2

TI-Basic(83シリーズ)、4バイト

:Ans-4

入力を受け取りますAns。たとえば、を17:prgmCODEGOLF入力してこれを実行するには、次のように入力し17ます。入力がL×Mと等しい場合Ansは値を0出力し、そうでない場合はゼロ以外の値を出力します(そしてを返します)。

:はコードの一部であることに注意してください。したがって、これをプログラムエディターに入力する場合は、

PROGRAM:CODEGOLF
::Ans-4

一度入力すると

PROGRAM:CODEGOLF
::Ans-4:Ans-4:An
s-4

3回入力した場合。



1

Befunge-98、15バイト

]#<@.-&+
>fv
v+

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

倍にしてみてください!

等しい場合は0を使用し、等しくない場合はその他を使用します。

説明:

このコードが何度も繰り返されると、次のようになります。

]#<@.-&+
>fv
v+]#<@.-&+
>fv
v+]#<@.-&+
>fv
 .
 .
 .
v+]#<@.-&+
>fv
v+
  1. ]右折。IPを送信します。

  2. >東に移動します。IP権利を送信します。

  3. f 16.を押します

  4. v南に移動します。IPを送信します。これが最後の場合、ステップ8に進みます。

  5. ]右折。残ったIPを送信します。

  6. +追加します。16をスタックの一番上に追加します。

  7. v南に移動します。IPを送信します。ステップ2に進みます。

  8. <西に移動します。IPを左に送信します。

  9. #スキップ。飛び越えて]最後まで回ります。

  10. +追加します。16をスタックの一番上に追加します。

  11. &入力。ユーザーから番号をプッシュします。

  12. -引きます。作業していた合計と入力の差を取得します。

  13. .印刷します。結果を印刷します。

  14. @ 終わり。



1

、13バイト

PI⁼Iθ×¹³L⊞Oυω

オンラインでお試しください!ソースを2倍にしたという私の答えに基づいて、あなたは出力を2倍にします!説明:

         ⊞Oυω   Push empty string to predefined empty list
        L       Take the length
     ×¹³        Multiply by 13
  ⁼Iθ           Compare to the input
 I              Cast to string
P               Print without moving the cursor

1真実と虚偽の出力を管理します0。後続の反復は、入力に対して比較13263952等が、回答が重ね刷りされるたびにこれだけ最終的な答えが見られます。


1

JavaScript ES6、32バイト

((f=k=>n=>n>0?n==k:f(k+32))(32))

trueが0で他がfalseの場合、31バイト

(f=k=>n=>n>0?n-k:_=>f(k+_))(31)

console.log([
    ((f=k=>n=>n>0?n==k:f(k+32))(32)) (31),
    ((f=k=>n=>n>0?n==k:f(k+32))(32)) (32),
    ((f=k=>n=>n>0?n==k:f(k+32))(32)) (33),
    ((f=k=>n=>n>0?n==k:f(k+32))(32)) (64),
    ((f=k=>n=>n>0?n==k:f(k+32))(32))((f=k=>n=>n>0?n==k:f(k+32))(32)) (32),
    ((f=k=>n=>n>0?n==k:f(k+32))(32))((f=k=>n=>n>0?n==k:f(k+32))(32)) (63),
    ((f=k=>n=>n>0?n==k:f(k+32))(32))((f=k=>n=>n>0?n==k:f(k+32))(32)) (64),
    ((f=k=>n=>n>0?n==k:f(k+32))(32))((f=k=>n=>n>0?n==k:f(k+32))(32))((f=k=>n=>n>0?n==k:f(k+32))(32)) (96)
]);


1

MIPS、4バイト

$a0引数および戻り値として使用します。

0x2084fffc    addi $a0, $a0, -4

MIPS、8バイト(MIPS呼び出し規約を使用)

0x2084fff8    addi $a0, $a0, -8
0x00041021    move $v0, $a0

x86、5バイト

これは私の最初のx86の回答なので、フィードバックを歓迎します。最初の引数としてecxを使用して_fastcall規則を使用します。

83 e9 05                sub    $0x5,%ecx
89 c8                   mov    %ecx,%eax

Peter Cordesのコメントには1バイトのソリューションがあります。


Brainfuckの解説:難しいのは、brainfuckに単一の値を返すことです。そうでなければ、このようなことは簡単でしょう。

- >,[-<->] < .

1
x86コードフラグメントは32ビット整数と同じサイズで、8に制限する必要はありません。しかし、カスタム呼び出し規約(ALの引数、他のどこかにretval)を使用した場合、2バイトのALスペシャルを使用できます。エンコードsub $4, %al/ mov %al, %dl。または、まだAL / EAXで戻り、dec %eax(32ビットモードで1バイト)でデニスのソリューションを取得します。はい、カスタム呼び出し規約はasmに適しています。それは、「Cから簡単に呼び出すことができるasm」ではなく、asmです。asmで記述された実際のコードは、それが役立つ場合にカスタム呼び出し規約を使用するため、これは完全に正当化できます。
ピーター

1
ARMの通常の呼び出し規約は最初のargでr0あり、これはretvalでもあるため、Thumb sub r0, #2は2バイトです。
ピーター

1
これらはどちらも関数ではないことに注意してくださいret。それらを呼び出す前に、繰り返しブロックの最後にが必要です。通常ret、x86 asm回答のバイト数を含めます。しかし、ここでルールを機能本体だけに曲げることは理にかなっていると思います。さもないと、多くの言語がまったく競争できなくなります。
ピーター

1
(nvm、これはretvalを%alに残しません)。 xchg %eax, %ecx/ sub $4, %al/ xchg %eax, %ecxは4バイトで、_fastcall規則に従います。AL、imm8、およびxchg-with-eaxショートエンコーディングを使用すると、コードゴルフに役立ちます。
ピーター

1
私は通常objdump -drwC -Mintel、マシンコードバイトのhexdumpを取得するために使用します。 add r32, imm8また、3バイトです:opcode + ModR / M + imm8。imm32を使用できるすべての命令には、符号拡張されたimm8を使用する代替オペコードがあります。たとえば、felixcloutier.com / x86 / ADD.htmlを参照してください。8086にさかのぼるすべての「クラシック」ALU命令(MOVを除く)には、modr / mなしの特別なAL / AX / EAX命令を含むすべてのエンコーディングがあり、op + imm8 / 16/32だけです。この回答には例があります
ピーター

1

オクターブ:23バイト

+23;[ans,i]((N==ans)+1)

N = L * Mの場合、式は0+i(純粋な虚数)を返します。それ以外の場合、式は実数成分を持つ複素数になります。

余分なバイトを犠牲にして少し良い結果を得るには:

+24;[ans,-1]((N==ans)+1)

N = L * Mの場合、式はを返し-1、それ以外の場合は正の数を返します。

デモ:

N=48;
+24;[ans,-1]((N==ans)+1)                                                 #>> 24 
+24;[ans,-1]((N==ans)+1)+24;[ans,-1]((N==ans)+1)                         #>> -1
+24;[ans,-1]((N==ans)+1)+24;[ans,-1]((N==ans)+1)+24;[ans,-1]((N==ans)+1) #>> 23

PS、あなたは同じ結果を得ることができます+24;if N==ans;-1;end;ansが、バイトカウントは同じです


1

ルア、 56 46バイト

a=(a or io.read())-46io.write(a<=0 and a or"")

等しい場合は0(末尾の改行なし)を出力し、等しくない場合はゼロまたは一連の負の数(場合によってはゼロが先行する)を出力します。

一人で: オンラインで試してみてください!

何度も繰り返しました: オンラインで試してみてください!

説明

a=(a or io.read())-46

最初の反復(aまだ定義されていないためnil)のa場合、入力から取得した数値に設定します。それ以外の場合はそれ自体に設定します。どちらの場合でも、46がから減算されaます。

io.write(a<=0 and a or"")

これaは、(入力が全長よりも大きい場合を処理するために)より小さいかゼロに等しい場合に出力し、そうでない場合は空の文字列を出力します。

-10バイトは、Luaが数字と文字列間の変換を自動的に行うことを覚えているためです。おっと。


0

JavaScript(ES6)、47バイト

これは、この回答でBenoit Esnardと同じテクニックを使用していますソースを2倍にすると、出力が2倍になります!)。

プリント0であれば、N = 47 * Mさもなければ、または非ゼロ値。

n=prompt(setTimeout`alert(n)`)-47/*
n-=47//*///

M = 1のデモ

n=prompt(setTimeout`alert(n)`)-47/*
n-=47//*///

M = 2のデモ

n=prompt(setTimeout`alert(n)`)-47/*
n-=47//*///n=prompt(setTimeout`alert(n)`)-47/*
n-=47//*///


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