冗長ブール


19

前書き

古典的に、ブール値は1ビットです。trueまたはfalse1または0。先行ゼロは単に冗長になります。たとえば、001とは、00001またはと同じことを意味し1ます。

32ビットのブール値

真/偽の値を指定すると、同等の32ビットブール値を文字列として出力します。(または、何らかの理由で言語が先行ゼロをサポートしている場合は数値として。)

あなたのプログラムは、すべての真実/偽のタイプに対して機能する必要はありません。あなたのプログラミング言語が最適に機能するものだけです。

例I / O

Input >> Output

truthy >> 00000000000000000000000000000001
falsey >> 00000000000000000000000000000000

これはなので、最低バイトが勝ちです!


6
可能性のある真実または偽の値、またはブール値を処理する必要がありますか?
-xnor

私の言語が型をサポートし、ブール値を持っている場合、1(int)を真実として使用できますか?
-LiefdeWen

@LiefdeWenもちろん
グラビトン

1
回答/言語ごとに真実/偽の入力を区別することができないため、重複はなくなりました。
グラビトン

私は表示されない理由はなく、ハァッ、大丈夫〜
V.クルトワ

回答:


10

Python 333の 25 18 15バイト

ヒントをありがとう@ jurjen-bos __mod__

'%.32d'.__mod__

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


だろうlambda b:'%0.32d'%b動作しますか?
ბიმო

ああ、None 真実偽りか?
ბიმო

@BruceForte Falsey
wrymug

1
また25バイトですが、python3.6 +の場合:lambda b:f'{bool(b):032}'またはlambda b:f'{not b<1:032}'
フェリペナルディバティスタ

1
の先頭のゼロを削除することで1バイトを節約できます0.32d
GarethPW

9

x86-16マシンコード(DOS)、16バイト

B4 02          mov  ah,  2
B2 30          mov  dl, '0'
B9 1F 00       mov  cx, 31

            PrintZeros:
CD 21          int  0x21
E2 FC          loop PrintZeros

00 CA          add  dl, bl
CD 21          int  0x21
C3             ret

上記の関数は、ブール値(0 == falsey、1 == truthy)を受け取ります BLレジスタ(の下位バイトBX、「冗長ブール」文字列を標準出力に出力します。

割り込み(0x21)を呼び出してDOS関数呼び出し(設定により選択)を実行することで機能します。 AH 2にしてDL)を実行し、標準出力に1文字(in )を印刷します。

最初に、ASCII文字「0」がにロードされDL、カウンター(CX)が31に設定され、「冗長」バイトを印刷するためにループします。次に、入力ブール値が追加されますDLBLfalseyの場合、0を追加するDLとASCII '0'のまま変更されません。BL真の、DLASCII '1'に1ずつ増加します)、最後のバイトが出力されます。

関数は値を返しません。

文字列を実際に実行しない言語にはかなりまともです。


フルプログラム、21バイト

完全なプログラムにする場合は、あと5バイトしか必要ありません。入力をレジスタに渡すのではなく、アプリケーションを呼び出すときにコマンドラインで渡された引数から入力を読み取ります。引数が0の場合、引数が完全に欠落しているのと同様に、偽と解釈されます。0より大きい引数は、真理として解釈されます。

次のコードをCOMプログラムとしてアセンブルし、コマンドラインで実行します。

B4 02            mov   ah,  2
B2 30            mov   dl, '0'
B9 1F 00         mov   cx, 31

               PrintZeros:
CD 21            int   0x21
E2 FC            loop  PrintZeros

3A 16 82 00      cmp   dl, BYTE PTR [0x82]  ; compare to 2nd arg, at offset 0x82 in PSP
D6               salc                       ; equivalent to sbb al, al
28 C2            sub   dl, al
CD 21            int   0x21
C3               ret                        ; you can simply 'ret' to end a COM program

サンプル出力:

C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001 
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001

どのように機能しますか?まあ、それは基本的に同じことです、あなたがCMP指示に着くまで。これは、コマンドライン引数をDLレジスタの値と比較します(覚えているように、ASCII '0'が含まれています)。COMプログラムでは、コードのバイトはオフセット0x100でロードされます。その前にプログラムセグメントプレフィックス(PSP) DOSプログラムの状態に関する情報を含むです。具体的には、オフセット0x82で、プログラムが呼び出されたときにコマンドラインで指定された最初の(実際は2番目、スペースであるため)引数を見つけます。したがって、このバイトをASCII '0'と比較しているだけです。

比較によりフラグが設定され、次にSALC命令(Pentiumより前のドキュメント化されていないオペコードsbb al, alで、2の代わりに1バイトのみ)はAL、2つの値が等しい場合は0に、異なる場合は-1に設定されます。ALからを引くとDL、必要に応じてASCII '0'または '1'にな​​ります。

(最初の文字だけを見るため、コマンドラインで先頭に0を付けて引数を渡すと、やや皮肉なことに、それを壊すことに注意してください。したがって01、falseyとして扱われます。



7

Javascript、23バイト

a=>'0'.repeat(31)+ +!!a

!!a aをブール値に強制します。これは単項プラスがintになります。


a=>'0'.repeat(31)+(+a)1バイト短くなります。
Kritixi Lithos

文字列、空の配列、NaN、関数、および数値への強制が0または1にならないその他の値で失敗する@Cowsquack
SuperStormer

空のオブジェクト、配列、無限大、未定義
SuperStormer

1
...しかし、今...Your program doesn't have to work for every truthy/falsy type, only what your programming language work best for.
edc65

1
a=>'0'.repeat(31)+~~atrue、false、1,0
edc65で




4

ArnoldC、369バイト

IT'S SHOWTIME
HEY CHRISTMAS TREE A
YOU SET US UP 0
GET YOUR ASS TO MARS A
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
BECAUSE I'M GOING TO SAY PLEASE A
TALK TO THE HAND "00000000000000000000000000000001"
BULLSHIT
TALK TO THE HAND "00000000000000000000000000000000"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

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


2
PPCGへようこそ!
スティーブン

4

Brainfuck61 60 36バイト

++++[>++++<-]>[>++>+++<<-]>-[>.<-]>>,.

ポインタであまり動き回らない賢い方法があると確信しています。

私は正しかったです。あった。@Gravitonにアイデアをくれてありがとう!

次のステップ:32および48の値をすばやく取得します!

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

++++        - Increment 1st slot by 4
[           - Loop until 4 becomes 0
    >++++   - Add 4 to 2nd slot
    <-      - Decrement loop
]           - At this point, we point to slot 1 and slot 2 contains 16, which is the Greatest Common Divisor of 48 (value 0 in ASCII) and 32 (final length of answer)
>           - Point to value 16 (slot 2)
[           - Start loop to get our target values 32 and 48
    >++     - Point to slot 3 and multiply 16 by 2 = 32
    >+++    - Point to slot 4 and multiply 16 by 3 = 48
    <<-     - Decrement the loop so that slot 2 becomes 0
]           - We now point slot 2
>-          - Move to slot 3 and remove one so we can spam (output) 31 zeroes
[           - Start outputting until slot 3 is empty
    >.      - Move to slot 4 where our ASCII value for 0 is
    <-      - Decrement the loop so that slot 3 becomes 0
]           - We are now at slot 3 and it is empty.
,.          - We can now gather input from the user and output it.

最初のゴルフは楽しかったです!

今では手遅れになっています。私は何をしていますか


エントロピーのおかげで、私は、数16に到達するために、それは1バイト短く
ラファエルコテ

楽しみのために、ここに60バイトバージョン>-[-[-<]>>+<]>--<<-[>+<-----]>--->[-<.>],.があります:(0または1として入力を取ります)オンラインで試してみてください!
グラビトン

まあ、@ Gravitonに感謝します。ASCII値を0に落とすだけで、それを出力しなければならないことにあまりにも多くの労力を費やしていることに気づきました。
ラファエルコーテ

3

Scala、32バイト

申し訳ありませんが、32バイトでそれを強制されました> _ <

var s=t
for(u<-0 to 30)s="0"+s
s

これtはパラメーターとしてstring受け取る関数に囲まれており(a は偽または真偽の場合は「0」または「1」になることがあります)、s返されます。

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

有効な応答:Scala、46バイト

私のjava応答と同じように、パラメーターにブール値を使用することになっていた。そう :

var s=if(t)"1"else"0"
for(u<-0 to 30)s="0"+s
s

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


3

Braingolf10 8バイト

#␟>[0_]N

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

ASCIIのユニットセパレーター 0x1F、または31です。TIOに貼り付ける実際の文字が見つからないため、TIOは代わりにを使用し# 1-、スペース(32)をプッシュして31に減らします。

説明

#␟>[0_]N  Implicit input from commandline args
#␟        Push unit separator (31)
   >       Move top item to bottom of stack
    [..]   Loop, runs 31 times
     0_    Print 0
        N  Boolean conversion, truthy values become 1, falsey values become 0
           Implicit output of top of stack

これに0x1F文字を含むTIO
PunPun1000

@ PunPun1000ああありがとう!投稿を更新します
Skidsdev

2

オクターブ、23バイト

@(x)[48+[!(1:31),x],'']

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

これは私が試したすべてのアプローチより短いですprintf。私は電話でこれをやったので、私は何かを逃したかもしれません。

1バイトだけ長い

@(x)[dec2bin(0,31),x+48]

文字列として1/0を使用できる場合、これは18バイトになります。

@(x)[48+!(1:31),x]

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


2

Javaの8、31の 27バイト

b->"".format("%032d",b?1:0)

@OlivierGrégoireのおかげで-4バイト。

ここで試してみてください。


1
うん、まだここであなたをアウトゴルフします:"".format;)
オリビエグレゴワール

1
@OlivierGrégoireそれだけでした!くそー、私はバカだ.. xD私がタイプしString.formatていたとき、どういうわけか短い方法があることを知っていたが、私はおそらく前回String変数を使用したと思った...ありがとう。;)
ケビンクルーイッセン







1

C, 26 bytes

Pretty much the same idea as 1bluestone's solution, but in C it's shorter, and it does work correctly for any integer input:

f(a){printf("%032i",!!a);}

Of course, this includes some implicitly typed variables/functions as all good C-golf answers do... The !! operator is the shortest way to convert any truthy value to 1 in C (via double negation, ! is defined to return either 1 or 0).

Test with:

#include <stdio.h>
f(a){printf("%032i",!!a);}
int main() {
    f(0), printf("\n");
    f(1), printf("\n");
    f(2), printf("\n");
    f(-1), printf("\n");
}


1

PHP, 28 bytes

<?=str_pad($argv[1],32,0,0);

Save as bool.php and run:

$ php bool.php 0
00000000000000000000000000000000
$ php bool.php 1
00000000000000000000000000000001

3 bytes shorter: printf('%032d',$argv[1]); (requires the -r flag).
user63956

1

Ly, 20 15 13 bytes

65*1+[0u1-]nu

EDIT: Saved 5 bytes thanks to ovs.
EDIT: Saved another 2 bytes by printing 0 as a number rather than a character.


Would 65*1+["0"o1-]nu work?
ovs

1

Octave,16 11 bytes

@(x)x(1:32)

Try it online!

A function handle that takes "00000000000000000000000000000001" as truthy and "00000000000000000000000000000000\0" as falsey.

Explanation:

In Octave an array is considered as falsey if at least one of its elements is zero. The 33th element of the second string is a character with the ASCII value of 0 so it can be considered as falsey.


1

Java, 40 chars, 40 bytes

This takes string as parameter, which is not correct (falsy/truthy java value is forced by OP to be represented by a boolean).

c->{for(int i=0;++i<32;c=0+c);return c;}

Try It Online!

Valid response : Java, 60 chars, 60 bytes

c->{String k="";for(k+=c?1:0;k.length()<32;k=0+k);return k;}

Try It Online!

I know there is already a Java answer which is shorter than this one, but still :)


Yes, the return statement is part of your code, so part of your byte-count. But your answer doesn't fulfill the rules: you must get a boolean as input. "Truthy/falsy" is translated in Java as either true or false, and nothing else. So you can't get a String as input parameter.
Olivier Grégoire

I see. I'll modify it soon enough. Thanks.
V. Courtois

1
You don't need to put the final semicolon (;). Also, you can shorten your code like this: c->{String k="";for(;k.length()<31;)k+=0;return k+=c?1:0;}. The k+=c?1:0 is to shorten k+(c?1:0).
Olivier Grégoire

@OlivierGrégoire Thanks but why isn't the final semicolon mandatory?
V. Courtois

1
It is mandatory, in the code, but not in the snippet. In the TIO, the footer can simply start with ;. A statement requires a semicolon. A lambda is not a statement.
Olivier Grégoire

1

Japt, 13 11 bytes

?1:0 ¤i31ç0

Explanation:

?1:0 ¤i31ç0
?              // If the input is a truthy, return:
 1             //   1
  :0           //   Else, 0
     ¤         // Convert to a base-2 string
      i        // Insert at index 0:
       31ç0    //   A string filled with 0s, length 31

Saved a byte using a base-2 conversion built-in!

To insert the string of 0s in front of the 1/0, I need to cast the 1 and 0 into a string. The typical way of doing that would be 1s  (3 bytes). But because we're only converting 1s and 0s, I can use the base-2 built-in (2 bytes).


Input can be in the form of an integer or string.

0 and "" are falsy in Japt.

Try it online!

Test suite


1

C# (.NET Core), 29 bytes

a=>new string('0',31)+(a?1:0)

OP said 1/0 can be used for truthy/falsey, so can make a an int and it becomes

a=>new string('0',31)+a

C# doesn't really have truthy/falsey though so I will not use this answer.

Try it online!


1
I don't think the second one is valid. Integers are neither truthy nor falsey in C#, only bools are.
Skidsdev

@Mayube I did ask and OP said its okay, but I kinda agree with you so will edit.
LiefdeWen

1
Annoyingly Padleft comes in at the same byte count here.
TheLethalCoder

@TheLethalCoder Started with PadLeft as well :)
LiefdeWen

2
Not sure if this is possible, but interpolated strings can be quite useful here: b=>$"{(b?1:0):D32}" 19 bytes
auhmaan

1

MY, 10 9 bytes

𝕫BṄiℑpέ←←

Try it online!

Explanation (codepage [with reasoning behind the character]/hex code):

𝕫: 1A - Push an integer from STDIN (lowercase integers)
B: 0B - Push 11 (B is 11 in hex)
Ṅ: 36 - Pop n; push the nth prime, 11th prime is 31 (Ṅ-th)
i: 49 - Pop n; push [1,...,n] (index/iota)
ℑ: 34 - Pop n; push imag(n) (ℑmaginary part, applied to each element, which gives 0 for real numbers)
p: 60 - Pop n; push stringified n (0=>"0" ... 35=>"Z", the b in base upside down)
έ: 56 - Pop n; push n joined by "" (έmpty string)
←: 26 - Pop n; output n with no newline (out←in)
←: 26 - Pop n; output n with no newline (out←in)

I can't believe that this is possible without any two-argument commands whatsoever!

Edit: Saved 1 byte by using primes instead of arithmetic to get 31.


0

APL, 11 bytes

⍕¯32↑1↑1\⍨⊢

How?

1\⍨⊢ - repeat 1 input times - return empty array on falsy value

1↑ - take the first item

¯32↑ - align right with 31 zeros

- format as string


Simply ⍕¯32↑⊢ should work
Kritixi Lithos

1
@Cowsquack & Uriel Neither works as they include spaces. You need ∊⍕¨¯32↑⎕ or something.
Adám

0

J, 11 bytes

(31#'0'),":

Try it online!

how?

31 zeros
00...000  append     turn the 0 or 1 input into string
(31#'0')    ,       ":

note: in J, booleans are 0 or 1, also known as "the iverson convention," after ken iverson, creator of J and APL


I understand that 1 and 0 are booleans in J, but you're just appending the input to 31 0s. Shouldn't there be some form of boolean validation?
Oliver

@Oliver The problem specifies "Given a truthy/falsey value..." so no, I don't think you should be validating... Also, note that ": is required for this to work -- it changes a boolean to a string.
Jonah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.