常に同じ長さの出力


26

以下のような課題にコードと同じ長さの出力二回のコードの長さを出力を作成し、私は別のが、同様の課題を考えました。

タスクは出力を生成することです。文字列、文字のリスト、またはプログラムのデフォルトの出力形式を使用できます。ただし、入力に関係なく、出力は常に同じ長さでなければなりません。さらに重要なことに、出力は入力ごとに異なる必要があります

入力

単一の整数nの範囲は、言語の選択によって決まります。お使いの言語が可変長整数を持っている場合、範囲は231n<231

出力

文字列または文字のリスト、またはSTDOUTまたはSTDERRへの印刷。これらの方法のいずれかのみを使用できます。出力は、入力に関係なく同じ長さである必要がありますが、どの長さを定義するかはユーザー次第です。出力には、数字0-9またはマイナス記号が含まれていない場合があります-出力は決定的でなければなりません

正式な証明、引数、または総当たり検索によって、すべての出力に対して可能な入力が1つしかないことを証明できるはずです。

これはコードゴルフの質問であるため、余分なバイトを取り除きます。すべての言語が歓迎されます、より良い!


4
理論的には、プログラムはどんな入力に対しても機能しますか?または、必ずしも言語の制限ではなくメソッドの制限のために、指定された範囲(制限)でのみ機能するメソッドを使用するだけで十分ですか?±231
Xcoder氏

4
@ Mr.Xcoderは、任意の長さの整数を処理する必要がある場合、どのように長さを選択できますか?
スティーブン

2
@ Mr.Xcoderあなたは、それがその範囲で機能することを証明する必要があります。このルールは、数字が数千桁になるPythonなどの言語を支援するためのものです。そのルールがなければ、PythonとPython派生物(多くのゴルフ言語が含まれます)の両方にとってはるかに困難になります。
maxb

11
言語は可変長整数を持っていませんが、より大きな値をサポートすることができた場合は、我々は制限された範囲の使用を許可している- 2 31N < 2 31231231n<231
アーナルド

2
@Arnauldの最大範囲は、言語の制限に関係なく、32ビット符号付き整数です。言語はその範囲のみを縮小できます。
maxb

回答:


15

JavaScript(ES8)、33バイト

範囲内の入力期待セーフ:JS整数を253n<253

76文字の文字列を返します。

n=>btoa(n.toString(2)).padEnd(76)

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

どうやって?

ステップ1

入力は最初にバイナリに変換されます。これにより、負の数の先頭のマイナス記号が保持されます。

例:

  • 123"1111011"
  • -77"-1001101"

ステップ2

結果の文字列はbase-64でエンコードされます。

つまり、1〜3文字の各ブロックが4文字の新しいブロックに変換されます。結果のブロックには禁止シンボル(数字またはマイナス記号)が含まれないため、この変換は安全です。

3文字のブロック

"-10" -> "LTEw" | "011" -> "MDEx"
"-11" -> "LTEx" | "100" -> "MTAw"
"000" -> "MDAw" | "101" -> "MTAx"
"001" -> "MDAx" | "110" -> "MTEw"
"010" -> "MDEw" | "111" -> "MTEx"

バイナリ文字列の長さが3の倍数でない場合、1文字または2文字の単一の最終ブロックをエンコードする必要があります。

1文字のブロック

"0"   -> "MA==" | "1"   -> "MQ=="

2文字のブロック

"-1"  -> "LTE=" | "10"  -> "MTA="
"00"  -> "MDA=" | "11"  -> "MTE="
"01"  -> "MDE=" | 

ステップ3

最終出力には、末尾スペースが埋め込まれます。


1
これらの特定の文字の組み合わせがbase64に変換されたときに数字を含まないことを既に知っていましたか、または実験的にわかりましたか?
トマシュ・ザト-モニカの復職

@TomášZatoそれは、ASCIIテーブルの下部にある非常に小さな文字セットであるという事実に基づいて、自信を持って推測できました。
アーノールド

10

Pythonの349の 39バイト

lambda i:[chr(ord(x)*2)for x in"%9x"%i]

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

マイナス7のおかげで-10バイト

整数を16進数に変換し、合計で最大9文字のスペースを付加します。次に、文字列内の各文字のASCIIコードを2倍にし(一部はASCIIの外側をUnicodeに拡張しますが、Pythonはそれを適切に処理します)、文字のリストを出力します。

これ-は、を含むすべての数字が異なるASCII文字にマッピングされるため機能します。-2147483648との間に整数2147483648はないため、16進数に変換してスペースを追加しても等しくなりません。次に、それらを異なるコードポイントにマッピングしても衝突は発生しないため、範囲内に等しい出力をもたらす2つの値はまだありません。

Pythonの359 56 47バイト

lambda i:[*map(lambda x:chr(ord(x)*2),"%9x"%i)]

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

-3バイトのおかげで Jitseの

-9バイトのおかげで マイナス7の

同じアルゴリズムですがmapforループの代わりに使用します。


2
あなたは3つのバイトオフに剃ることができますmap置き換えることによって、アプローチをlist( ... )して[* ... ]
Jitse

3
埋め込み文字列を作成できます"%9x"%i
負の7

@negativesevenは本当に天才である、あなたに感謝
スティーブン・

1
ASCII 2を使用してPython 2で39バイトにとどまることができました`4e9+n`
ジョナサンアラン

8

05AB1E11 5 バイト

тjÇ·ç

-6バイトの@Stephen移植のアプローチをので、必ず彼にしてください!

出力100文字までのリスト、100(input length)の量@(二重空間コードポイント)、およびすべて-0123456789にマッピングされZ`bdfhjlnpr(二重ASCIIコードポイント)。

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

説明:

 j     # Prepend spaces in front of the (implicit) input-integer to make it of length:
т      # 100
  Ç    # Convert each character to its unicode value
   ·   # Double each
    ç  # And convert it back to a character
       # (after which the resulting list is output implicitly)

元の11 バイトの回答:

Ķ×AIdè«žIj

オンラインで試してください1000代わりに2147483648)。

説明:

出力の長さは常に2,147,483,648文字です。2147483648|n|1を出力します- | n | 1個のスペース、|n|追加 n | 「」のいずれかの場合が付加改行量、n<0又は「B」であればn0

Ä            # Get the absolute value of the (implicit) input-integer
 ¶×          # And have a string with that many newline characters
   A         # Push the lowercase alphabet
    Id       # Check if the input is non-negative (>=0) (1 if truthy; 0 if falsey)
      è      # Use that to index into the alphabet (so "a" for <0 and "b" for >=0)
       «     # Append that to the newline-string we created earlier
          j  # And prepend spaces to make the string of a length:
        žI   # 2147483648 (this has been replaced with `₄`/1000 in the TIO)
             # (after which the result is output implicitly)

7

ブレインファック48 29 28 16 13バイト

このプログラムは、細胞、必要とcnNしていますが、一貫性のある結果をしたい場合は、ことを確認してくださいcn<256

出力は明らかにあなたが(入力されますどのような数のユニークなノー事項になります<n<)。整数が短い場合、プログラムは正確にに一致するように出力をパディングしますバイトため、長さは常に同じです。

この答えは、出力が有限である必要があるとは述べていなかったため、チャレンジを少しループホール化したものです。

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

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


元の28バイトの回答:

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

これにより、出力が正確に281バイトになるようにパディングされます。番号変換メカニズムはここでも同じように機能します。このプログラムは、上記のプログラムと同じものを想定しています。



@JoKingこれは、私がこの答えを出した後に述べられました。しかし、もしあなたが本当にこれで傷ついたと感じたら、私は単純にチャレンジをやめて、最初の答えを非競合と宣言することができます
レジストフシェフチク


5

ゼリー、4 バイト

œ?ØẠ

52文字のリストを生成する整数を受け入れる単項リンク。

入力範囲は幾分以上までとすることができる2223n<2223以降の52>2224

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

どうやって?

œ?ØẠ - Link: integer, n
  ØẠ - alphabet (Jelly's longest built-in character list containing no digits
     -           or hyphen) = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
œ?   - permutation at index (n) if all 52! permutations were written out
     - in lexicographical order.
     - This indexing is modular so when n = -x we fetch the (52!-x)th entry.

そう...

-2147483648 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONIGCDAMLJKFEHB
-2147483647 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONIGCDAMLJKFHBE
-2147483646 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONIGCDAMLJKFHEB
-2147483645 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONIGCDAMLJKHBEF
    ...
         -4 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDACB
         -3 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDBAC
         -2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDBCA
         -1 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCAB
          0 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA
          1 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
          2 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxzy
          3 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz
          4 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyzx
    ...
 2147483644 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmrtxwznoqpsvyu
 2147483645 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmrtxwznoqpsyuv
 2147483646 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmrtxwznoqpsyvu
 2147483647 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmrtxwznoqpusvy

5

ルビー、27バイト

->n{('%34b'%n).tr'01','ah'}

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

('%34b'%n)整数をそのバイナリ表現に変換し、..1負の数を示すために使用し(これは1の無限に長いプレフィックスを表すことを意味します)、スペースを使用して34文字に左詰めします。次に、0sを「a」に置き換え、1 sを 'h'に置き換えて、マニアカルベース2表現を作成します..。「haaahahahaahaha」などの文字列の前にスペースを追加し、場合によってはを追加します。ここのすべてのステップは可逆的であるため、これは1:1です。

編集:@manatworkがこの同一のソリューションを最初に投稿したことをレコードに表示させます。おっとっと。リフレッシュする必要があります。


3
笑。あなたの出力は私の出力よりもずっと面白いです。
マナトワーク


4

C(gcc)、38バイト

f(a,i){for(i=32;i--;putchar(a>>i&1));}

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

これにより、入力整数の各ビットが0または1のいずれかのバイトに拡張されます(どちらも印刷不可能な文字ですが、それに対するルールはありません)。したがって、出力は常に32バイトであり、一意であることが保証されます。


NULバイトを使用したBrainfuck応答パディングに似た巧妙なアプローチ。
maxb

終了しないプログラムが実際に仕様内にあるかどうかはわかりませんが、もしそうなら、28バイトですか?f(a){putchar(a&1);f(a/2);}
G.スリーペン

Malbolgeの例外を作成しましたが、一般にプログラムは終了するはずです。長さとして「無限大」を持つことは、ちょっとしたごまかしです。
maxb


3

Haskell、31バイト

map(\d->[d..]!!10).show.(+2^60)

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

2^60入力に加算して、結果の数値が入力範囲全体で同じ桁数になるようにします。文字列に変換し、各文字をASCII順で10桁右にシフトします(0-> :...- 9> C)。


1
Does it handle negative numbers?
maxb

@maxb: no, but now it's fixed.
nimi

3

C# (Visual C# Interactive Compiler), 52 bytes

x=>(new char[32]).Select(y=>(char)(x%2+65+(x/=2)*0))

Try it online!

Different approach to a c# solution, takes advantage of the fact that c# modulus is negative for negative numbers. I suppose you could shave off a byte or two if you allow non-display characters ('\0', and so on) by updating the +65... to not offset the character value to something human readable.


44? - I am outputting non-printable characters (which seems ok) but you could convert to printable by adding 65 like your current answer.
dana

1
42 - This time with printable characters :)
dana

3

Perl 5 -MDigest::MD5=md5_hex -p, 23 bytes

$_=md5_hex$_;y/0-9/k-t/

Try it online!

Previously:

Perl 5 -p, 29 bytes

$_=sprintf'%064b',$_;y/01/ab/

Try it online!

Converts the number to its 64 bit binary representation, then transliterates 0 and 1 to a and b, respectively.


5
And you have confirmed there are no collisions for all valid inputs?
Sparr

... and that no md5 hash produces a digit character by chance?
AlexR

Forgot about the requirement to exclude digits. I've updated to accommodate that.
Xcali


2

T-SQL, 73 70 61 bytes

SELECT TRANSLATE(STR(n,11),'-0123456789','ABCDEFGHIJK')FROM t

I'm just directly replacing the digits (and -) with letters, after STR pads the integer to 11 characters. No conversion to hex or binary is necessary.

TRANSLATE was introduced in SQL 2017.

Input is via a pre-existing table t with INT column n, per our IO rules. Range of the INT datatype in SQL is 231n<231.

EDIT: Saved 3 bytes by replacing manual padding with a conversion to CHAR(11), which is a fixed-width character format that automatically pads with spaces.

EDIT 2: Saved 9 bytes by using STR() function instead of CAST. STR converts a number to a text string padded to the specified length.


2

APL (Dyalog Unicode), 28 bytes

{11' Z'[⍵≤0],⎕A[⍎¨'¯'~⍨⍕⍵]}

Try it online!

Simple Dfn, taking an integer argument. Uses ⎕IO←0.

TIO links to a test case from -2^10 to 2^10. The 0~⍨ part removes the duplicate 0 from the arguments.

How:

{11' Z'[⍵≤0],⎕A[⍎¨'¯'~⍨⍕⍵]}  Dfn
              A[         ]   Index the Uppercase Alphabet with
                        ⍕⍵    String representation of the argument
                   '¯'~⍨      Without the character ¯
                 ⍎¨           Executing each digit back into integers
             ,                Prepend
    ' Z'[   ]                 A character from the string ' Z' indexed by
         ⍵≤0                  Argument  0. Returns 1 if true, else 0.
                              This will prepend a whitespace to positive numbers, and a Z otherwise.
 11                          Take the first 11 characters, padding with whitespace.

2

Japt, 6 bytes

I think this is right. Inspired by Stephen's Python solution so please +1 him.

¤ùI cÑ

Try it

¤ùI cÑ     :Implicit input of integer
¤          :Convert to binary string
 ù         :Left pad with spaces
  I        :  To length 64
    c      :Map codepoints
     Ñ     :  Multiply by 2

2

Malbolge, 2708 bytes

This answer is super cheaty, because it always produces the same amount of input, which is equal to .

bP&A@?>=<;:9876543210/.-,+*)('&%$T"!~}|;]yxwvutslUSRQ.yx+i)J9edFb4`_^]\yxwRQ)(TSRQ]m!G0KJIyxFvDa%_@?"=<5:98765.-2+*/.-,+*)('&%$#"!~}|utyrqvutsrqjonmPkjihgfedc\DDYAA\>>Y;;V886L5322G//D,,G))>&&A##!7~5:{y7xvuu,10/.-,+*)('&%$#"yb}|{zyxwvutmVqSohmOOjihafeHcEa`YAA\[ZYRW:U7SLKP3NMLK-I,GFED&%%@?>=6;|9y70/4u210/o-n+k)"!gg$#"!x}`{zyxZvYtsrqSoRmlkjLhKfedcEaD_^]\>Z=XWVU7S6QPON0LKDI,GFEDCBA#?"=};438y6543s1r/o-&%*k('&%e#d!~}|^z]xwvuWsVqponPlOjihgIeHcba`B^A\[ZY;W:UTSR4PI2MLKJ,,AFE(&B;:?"~<}{zz165v3s+*/pn,mk)jh&ge#db~a_{^\xwvoXsrqpRnmfkjMKg`_GG\aDB^A?[><X;9U86R53ONM0KJC,+FEDC&A@?!!6||3876w4-tr*/.-&+*)('&%$e"!~}|utyxwvutWlkponmlOjchg`edGba`_XW\?ZYRQVOT7RQPINML/JIHAFEDC&A@?>!<;{98yw5.-ss*/pn,+lj(!~ff{"ca}`^z][wZXtWUqTRnQOkNLhgfIdcFaZ_^A\[Z<XW:U8SRQPOHML/JIHG*ED=%%:?>=~;:{876w43210/(-,+*)('h%$d"ca}|_z\rqYYnsVTpoRPledLLafIGcbE`BXW??TY<:V97S64P31M0.J-+G*(DCB%@?"=<;|98765.3210p.-n+$)i'h%${"!~}|{zyxwvuXVlkpSQmlOjLbafIGcbE`BXW??TY<:V97S64P31M0.J-+G*(D'%A@?"=<}:98y6543,1r/.o,+*)j'&%eez!~a|^tsx[YutWUqjinQOkjMhJ`_dGEaDB^A?[><X;9U86R53O20LKJ-HG*ED'BA@?>7~;:{y7x5.3210q.-n+*)jh&%$#"c~}`{z]rwvutWrkpohmPkjihafI^cba`_^A\[>YXW:UTS5QP3NM0KJ-HGF?D'BA:?>=~;:z8765v32s0/.-nl$#(ig%fd"ca}|_]yrqvYWsVTpSQmPNjMKgJHdGEa`_B]\?ZY<WVUTMR5PO20LK.IHA))>CB%#?87}}49zx6wu3tr0qo-nl*ki'hf$ec!~}`{^yxwvotsrUponQlkMihKIe^]EEZ_B@\?=Y<:V97S64P31M0.J-+GFE(C&A@?8=<;:{876w43s10qo-&%kk"'hf$ec!b`|_]y\ZvYWsVTpSQmlkNiLgf_dcba`C^]\?ZY;WV97SLK33HM0.J-+G*(D'%A$">!};|z8yw543t1r/(-,+*)(i&%fd"!~}|_t]xwvutslqTonmPkjLhKIeHFbEC_^A?[TSX;9UT7R4JIN1/K.,H+)E(&B%#?"~<}{987x/4ussr)p-,m*)ihh}$#d!awv{^\x[YuXVrUSonQlNdchKIeHFbaD_AWV[><X;988MRQ4O1GFK.,++@ED'B$:9>!};:9zy0wuut1*/p-,mk#"hh}$#"cb}v{^\\[vunWrqTonmOkjMLgf_HcbE`_A]@>ZY<:VONS64P31M0.J-+G*(D'%A$">!}||3876wv321*/p-,mk#"'hf$ec!b`|{^y[qpuXVUUjonQOkdchKIeHFbEC_B@\?=Y<:VUT76QPONG0KJ-HGFED'%A:9!!6;:9zy654321*q.-n+*j(ig%fd"ca}`^]]rwvYtVlkpSQmPNMMbgfIdF\[`_^A@[ZYXWVUNS6443NMLKJIHG@)DC&A@?!=<}|98765432+r/.-,+k#('&%e{dy~}|uzsx[vuXsrqpoRPledLLafedGF[`C^]\?ZY;W:8T7544INM0.JCBG*(''<A@#!=65:{yxx/43tr0)(-nlkk"'&ge#zy~a_^^sxwZXtmlqTRQQfkjMKg`_dcbEZ_B]\?=SRW:8T75Q42N1/KJ-+G@?D'%A$">!};|z87x5u-,1rp.-n+k#"'hfeez!~}`_t]xwvYtsUTTinmPNjcbgJHdGEa`_BW\?ZY<WVUTS64PIH00EJIH+*?(&&;@#!!~5:{87xv.-2sq/.om+$#(ig%$e"bxw|_]y\ZvuXsUkjoRPOOdihKfH^]bEC_^A\>TS;;PUTS65JO2MLK.,BA))>CBA$9>!}}|3z765v32r0/p-m%$)jh&ge#"c~`vuz][ZZotsVqSihmPNMMbgfIdF\[`CA@@UZY<W9ONS6433HML/J,BAF)'&&;@?"=}549zx6wutt+0/.on%l)('h%$d"ca}`^z][wvYtVlkpSQmPNjiLJf_^cFDCCX]\?=YRQV9766KPO20LEDI,*))>CB%#?87<}{9zx6wu3tr0/.o&m*)('&%fA/cQ>_^;]87%54"32pRA-yejih:s_GGFDDC^{i[T<XQ9b8r_5]O20Li-zB*SdQPO%##]nml43V1TvS@cs0/_'JJH#jhg%BTd!xw_{t99J6$tV21SBR@?kjcbtJ%^F"DD21]@[xfw;)9Nqq5Jmm~LKWVyx@E't&%:]][~YkF8hgv.tssOMp:&ml6Fi&D1T"y?,O<^s\7vX#Wr2}|Rzl+j<bK`r$F"4ZCk|\?-=RQ

Try it online!


1
With it being Malbolge, I might let that slide... Fantastic job!
maxb

2

Perl 6, 12 bytes

*~|('@'x 11)

Try it online!

Anonymous Whatever lambda that takes a number and string ORs it with 11 @s. This maps the digits to pqrstuvwxy and the dash to m, then pads the string out to 11 characters with @s



2

Wolfram Language (Mathematica), 44 33 bytes

Echo@Table[Or[i>#+13!,],{i,14!}]&

Try it with a smaller domain

-2 thanks to Greg Martin

Prints >> , followed by the 523069747202-character string representation of a list of 13!+n Nulls padded by Trues to a length of 14!, and a newline. Works on the domain [13!,14!13!), which is a superset of [231,231).

Given the size of the output, I've included a test case with a smaller domain of [24,24) instead


Nice :) I think you can save two bytes by changing 2^31 and 2^32 to 13! and 14! respectively. At the loss of some "brevity" in the output....
Greg Martin


1

PHP, 64 54 bytes

-10 bytes by using strtr function instead of manual character replacement.

<?=str_pad(strtr($argn,'-0123456789',ADEFGHIJKLM),20);

Try it online!

Largest int value possible in PHP as of now is 9223372036854775807 which is 19 digits long, considering the minus sign in negative numbers, it will be 20. The code above replaces minus sign (-) with the A character and every digit from 0 to 9 with a character from D to M and then pads the string in the right with space character to always make it 20 characters long. For example, the output for input of -9876543210 is "AMLKJIHGFED ".

The output is unique for each integer input and you can get back to the input by removing all spaces, replacing A with - and replacing D to M with 0 to 9.


PHP, 44 bytes

<?=str_pad(base64_encode(decbin($argn)),88);

Try it online!

This is same idea as Arnauld's answer. Converts the input to binary, and then converts it to base-64. Also pads it to 88 characters (largest length is for -9223372036854775807 which is 88 characters) with space character at right to always get same length in the output.


1

Retina 0.8.2, 21 bytes

T`p`l
$
10$*o
!`.{11}

Try it online! Always outputs 11 characters from the range n..z. Explanation:

T`p`l

Translate the printable ASCII characters to the lowercase letters. This maps - to n and 0..9 to q..z. (It's really fortunate that the digits are the 16th to the 25th printable ASCII characters!)

$
10$*o

Append 10 os. Since the input will have between 1 and 11 characters, there are now between 11 and 21 characters.

!`.{11}

Extract the first 11 characters. Since there are fewer than 22 characters, this will only match once.


1

Charcoal, 9 bytes

◧⍘﹪NXχχαχ

Try it online! Link is to verbose version of code. Always outputs 10 spaces and uppercase letters. Explanation:

   N        Input as a number
  ﹪         Modulo
     χ      10
    X       To power
      χ     10
 ⍘     α    Convert to base 26 using uppercase letters
◧       χ   Left pad to length 10

1

R, 37 bytes

set.seed(scan())
cat(sample(LETTERS))

Try it online!

Looks like the output is random, but it isn't! The input is used as the seed of the Pseudo-Random Number Generator, and we then get one of the 26!=41026 permutations of the alphabet. The output is always of length 51 (26 letters + 25 spaces).

There is still the issue of insuring that all the outputs are different. We end up with 2324109 permutations (out of 41026). If we pretend that the permutations are distributed uniformly at random, then the probability that all the permutations are different can be computed following the same calculations as for the Birthday problem. The probability that 2 specific outputs are identical is 1017, so a first order approximation of the probability that all 232 outputs are distinct is

1exp(264/26!)0.99999998

which is close enough to 1 for me.


While yes, it's statistically unlikely that there's a collision, that doesn't mean it's impossible as the question asks for
Jo King

2
I like the probability calculation. I guess you could run through all 4 billion inputs if you really wanted to check for collisions, but if you don't feel like doing that I might let it slide. As it is now, you've presented a compelling argument, and if anyone finds a counterexample, you'd have to modify your submission.
maxb

1

brainfuck, 20 19 bytes

-1 byte thanks to Krzysztof Szewczyk

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

Try it online!

Outputs the number with each digit and dash mapped to 255 minus their ordinal value, padded out to 255 characters with NUL bytes.


1
You can save one byte: -[>,[->-<]>.[-]<<-]
Krzysztof Szewczyk

1

R, 40 37 bytes

cat(gsub("S","",intToBits(scan())>0))

Try it online!

An alternative to Robin Ryder's answer; this is certainly deterministic.

This converts the input to a raw vector of 32 bytes, each byte being a hex number 00 or 01 representing the bits of the integer. We then coerce to a logical by comparing to 0, so 00 is mapped to FALSE and 01 to TRUE. Then we need to remove a single letter from each FALSE to guarantee equal-length output, arbitrarily selected to be S. Result is printed (with space) for a length of 169.


1

Zsh, 43 bytes

for c (${(s::)${(l:30::0:)1}})echo \\x$[#c]

               ${(l:30:0:)1}                 # left-pad with zeroes to 30 characters
        ${(s::)             }                # split characterwise
 for c (                     )               # for each character
                                      $[#c]  # get character code (in decimal)
                              echo \\x$[#c]  # interpret as hex code, print (with newline)

Try it online!

This solution gets around the long long limits of Zsh's integers by working with only characters. I only padded it to 30 characters for readability, but replacing 30 with 99 will allow this method to work on all numbers from -1E99+1 to 1E100-1.

The effect of interpreting the decimal codes as hexadecimal are as follows:

0 => 48 => H    1 => 49 => I    2 => 50 => P    3 => 51 => Q
4 => 52 => R    5 => 53 => S    6 => 54 => T    7 => 55 => U
8 => 56 => V    9 => 57 => W    - => 45 => E

Zsh, 46 bytes

integer -i2 -Z66 x=$1
<<<${${x//[02-]/a}//1/b}

Try it online!

Declares x as a binary number, zero-padded to a width of 66. Then maps 0a and 1b. We also map 2 and - to a, since those characters are printed in [[-]][base]#[num] notation. To see what $x looks like before replacement, and Zsh's limits in parsing integer types, check the Debug output in the TIO link.


1

Java (JDK), 42 bytes

n->"".format("%8x",n).chars().map(i->i|64)

Try it online!

First, this creates the hexadecimal representation of the input, left-padded with spaces which provides the same length constraint (8 characters-long), removes the minus sign, and keeps each intermediate output unique.

This gives a string with 17 different possible characters: 0123456789abcdef and space.

Then each character is streamed and mapped by adding 64 to its codepoint if it's a digit or a space. Effectively, this results in the following mapping: 0123456789abcdef<space> to pqrstuvwxyabcdef` which has 17 different characters, so no two numbers will result in the same output.


1

Bash, 30 bytes

echo $1|md5sum|tr '0-9-' 'A-K'

Try it online!

To prove that output is unique, I just googled for MD5 collisions, and found no results within the integers between 231 and 231. To avoid having forbidden characters in the output, just translate the characters in question to be upper case letters. Output is always the same length by definition, and guaranteed to not contain any forbidden characters.

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