Dengan tantangan seperti Keluaran dengan panjang yang sama dengan kode dan Buat keluaran dua kali panjang kode , saya memikirkan tantangan terpisah, tetapi serupa.
Tugasnya adalah menghasilkan output. Ini bisa berupa string, daftar karakter, atau apa pun format output default program Anda. Namun, output Anda harus selalu sama, terlepas dari inputnya. Dan yang lebih penting, output harus berbeda untuk input yang berbeda .
Memasukkan
Bilangan bulat tunggal , rentangnya ditentukan oleh pilihan bahasa. Jika bahasa Anda memiliki bilangan bulat panjang variabel, kisarannya adalah .
Keluaran
String atau daftar karakter, atau cetak ke STDOUT atau STDERR. Anda hanya dapat menggunakan salah satu metode ini. Keluaran harus memiliki panjang yang sama terlepas dari input, tetapi terserah Anda untuk menentukan panjang yang mana. Output mungkin tidak mengandung karakter digit 0-9
, atau tanda minus-
. Outputnya harus deterministik .
Anda harus dapat membuktikan bahwa untuk setiap output hanya ada satu input yang mungkin , baik dengan bukti formal, argumen, atau pencarian brute-force.
Ini adalah pertanyaan kode golf, jadi hilangkan byte yang tidak tersedia. Semua bahasa dipersilakan, semakin banyak semakin baik!
Jawaban:
JavaScript (ES8), 33 byte
Mengharapkan input dalam kisaran integer JS aman :−253≤n<253 .
Mengembalikan string 76 karakter.
Cobalah online!
Bagaimana?
Langkah 1
Input pertama dikonversi ke biner. Ini mempertahankan tanda minus utama untuk angka negatif.
Contoh:
123
→"1111011"
-77
→"-1001101"
Langkah 2
String yang dihasilkan dikodekan dalam basis-64.
Ini berarti bahwa setiap blok 1 hingga 3 karakter akan diubah menjadi blok baru 4 karakter. Konversi ini aman karena tidak ada blok yang dihasilkan yang mengandung simbol terlarang (angka atau tanda minus).
Blok 3 karakter
Blok terakhir tunggal 1 atau 2 karakter harus dikodekan jika panjang string biner bukan kelipatan 3:
Blok 1 karakter
Blok 2 karakter
Langkah 3
Hasil akhir diisi dengan spasi tambahan.
sumber
Python 3 ,
4939 byteCobalah online!
-10 byte berkat negatif tujuh
Mengubah bilangan bulat menjadi heksadesimal, dan menambahkan spasi hingga total 9 karakter. Kemudian, gandakan kode ASCII dari setiap karakter dalam string (beberapa meluas di luar ASCII menjadi Unicode, tetapi Python menanganinya dengan baik), menghasilkan daftar karakter.
Ini berfungsi karena setiap digit, termasuk
-
, dipetakan ke karakter ASCII yang berbeda. Tidak ada bilangan bulat di antara-2147483648
dan2147483648
yang sama, jadi mengonversinya menjadi ruang heksadesimal dan tidak bergantung akan membuat mereka sama. Kemudian, memetakannya ke titik-titik kod yang berbeda tidak mengarah ke tabrakan, jadi masih tidak ada dua nilai dalam rentang yang menghasilkan output yang sama.Python 3 ,
595647 byteCobalah online!
-3 byte berkat Jitse
-9 byte berkat negatif tujuh
Algoritma yang sama, tetapi menggunakan
map
bukanfor
loop.sumber
map
pendekatan dengan menggantilist( ... )
dengan[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 byte-6 byte porting pendekatan @Stephen , jadi pastikan untuk meng - upgrade - nya!
Output daftar hingga 100 karakter, dengan100 - ( panjang input ) jumlah
@
(dua kali lipat dari codepoint ruang), dan semua-0123456789
dipetakan keZ`bdfhjlnpr
(dua kali lipat pada codepoint ASCII).Cobalah online.
Penjelasan:
Jawaban 11 byte asli :
Cobalah online (terbatas
1000
bukan2147483648
).Penjelasan:
Panjang keluaran selalu sepanjang 2.147.483.648 karakter. Ini akan menampilkan2147483648 - | n | - 1 jumlah ruang, ditambahkan dengan | n | jumlah baris baru, ditambahkan dengan 'a' jika n < 0 atau 'b' jika n ≥ 0 .
sumber
brainfuck ,
4829281613 byteProgram ini membutuhkan sel, di manacn∈ N , tetapi jika Anda ingin hasil yang konsisten, pastikan bahwa cn< 256
Output jelas akan menjadi unik, apa pun nomor yang akan Anda masukkan (- ∞ < n < ∞ ). Jika integer lebih pendek, program akan mengeluarkan output agar sama persis dengan ∞ byte, sehingga panjangnya selalu sama.
Jawaban ini agak melonggarkan tantangan, karena tidak menyatakan bahwa output harus terbatas.
Cobalah online!
Asli, jawaban 28 byte:
Yang ini akan pad output menjadi tepat28- 1 byte. Mekanisme konversi angka berfungsi sama di sini. Program ini mengasumsikan sama dengan program di atas.
sumber
Python 3 , 39 byte
Cobalah online!
Ternyata angka ke dalam string representasi biner (diisi dengan spasi), kemudian memetakan karakter
(space)-01
untukcaab
denganstr.translate
fungsi.sumber
Jelly , 4 byte
Tautan monadik yang menerima bilangan bulat yang menghasilkan daftar 52 karakter.
Kisaran input mungkin hingga agak lebih dari- 2223≤ n <2223 sejak 52 ! > 2224 .
Cobalah online!
Bagaimana?
Begitu...
sumber
Ruby , 27 byte
Cobalah online!
('%34b'%n)
Mengubah bilangan bulat ke dalam representasi binernya, gunakan..1
untuk menunjukkan angka negatif (ini dimaksudkan untuk mewakili awalan 1s yang tak terhingga panjang), dan menempatkan kiri ini ke 34 karakter menggunakan spasi. Lalu kita ganti0
huruf s dengan 'a' dan1
s dengan 'h' untuk membuat Representasi Pangkalan 2 Maniacal: string seperti "haaahahahaaha" diawali dengan spasi dan kadang-kadang..
. Karena setiap langkah di sini tidak dapat dibalik, ini adalah 1: 1.Sunting: Biarkan catatan menunjukkan bahwa @manatwork memposting solusi identik ini terlebih dahulu. Ups. Seharusnya aku menyegarkan.
sumber
Jeli , 6 byte
Cobalah online!
Karena Jelly memiliki bilangan bulat panjang yang berubah-ubah, tautan monadik ini mengambil bilangan bulat dalam kisaran± 231 dan mengembalikan string alfabet 7 panjang. Ia bekerja dengan menambahkan 232 dan kemudian basis dekompresi ke dalam huruf kapital.
sumber
C (gcc) , 38 byte
Cobalah online!
Ini memperluas setiap bit dari integer input ke dalam byte yang bernilai 0 atau 1 (yang keduanya merupakan karakter yang tidak dapat dicetak, tetapi tidak ada aturan yang menentangnya). Jadi output selalu 32 byte, dan dijamin unik.
sumber
f(a){putchar(a&1);f(a/2);}
C # (Visual C # Interactive Compiler) , 35 byte
Cobalah online!
sumber
x = int.MinValue
tidak dapat dinegasikan.Haskell, 31 byte
Cobalah online!
Menambah
2^60
input sehingga jumlah yang dihasilkan memiliki jumlah digit yang sama untuk seluruh rentang input. Ubah menjadi string dan geser setiap karakter 10 tempat ke kanan dalam urutan ASCII (0
->:
...9
->C
).sumber
C # (Visual C # Interactive Compiler) , 52 byte
Cobalah online!
Pendekatan berbeda terhadap solusi ac #, mengambil keuntungan dari kenyataan bahwa modulus c # negatif untuk bilangan negatif. Saya kira Anda bisa memotong satu atau dua byte jika Anda mengizinkan karakter non-tampilan ('\ 0', dan seterusnya) dengan memperbarui
+65...
untuk tidak mengimbangi nilai karakter ke sesuatu yang dapat dibaca manusia.sumber
Perl 5
-MDigest::MD5=md5_hex -p
, 23 byteCobalah online!
Sebelumnya:
Perl 5
-p
, 29 byteCobalah online!
Bertobat nomor untuk 64 bit representasi biner, maka transliterates
0
dan1
untuka
danb
masing-masing.sumber
T-SQL,
73 7061 byteSaya hanya langsung mengganti digit (dan
-
) dengan huruf, setelahSTR
mengisi integer menjadi 11 karakter. Tidak perlu konversi ke hex atau biner.TRANSLATE
diperkenalkan di SQL 2017.INT
EDIT : Disimpan 3 byte dengan mengganti padding manual dengan konversi ke CHAR (11), yang merupakan format karakter lebar tetap yang secara otomatis mengisi dengan spasi.
EDIT 2 : Disimpan 9 byte dengan menggunakan
STR()
fungsi alih-alihCAST
.STR
mengonversi angka menjadi string teks yang diisi hingga panjang yang ditentukan.sumber
APL (Dyalog Unicode) , 28 byte
Cobalah online!
Dfn sederhana, mengambil argumen integer. Penggunaan
⎕IO←0
.TIO menghubungkan ke suatu test case dari
-2^10
ke2^10
. Bagian0~⍨
menghapus duplikat0
dari argumen.Bagaimana:
sumber
Japt , 6 byte
Saya pikir ini benar. Terinspirasi oleh solusi Python Stephen jadi tolong
+1
dia.Cobalah
sumber
Malbolge , 2708 byte
Cobalah online!
sumber
Perl 6 , 12 byte
Cobalah online!
Anonim Apapun lambda yang mengambil angka dan merangkai OR dengan 11
@
detik. Ini memetakan digit kepqrstuvwxy
dan tanda hubung kem
, lalu mengisi string dengan 11 karakter dengan@
ssumber
Perl 5 (-p), 9 byte
Cobalah online!
Bitwxise-xor dari input dengan string
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.sumber
Bahasa Wolfram (Mathematica) ,
4433 byteCobalah dengan domain yang lebih kecil
Terima kasih Greg Martin
>>
Null
True
Mengingat ukuran output, saya sudah memasukkan test case dengan domain yang lebih kecil[ - 24, 24) sebagai gantinya
sumber
2^31
dan2^32
untuk13!
dan14!
masing-masing. Pada hilangnya beberapa "singkatnya" dalam output ....Stax , 6 byte
Jalankan dan debug itu
Prosedur:
sumber
PHP ,
6454 byte-10 byte dengan menggunakan
strtr
fungsi alih-alih penggantian karakter manual.Cobalah online!
Nilai int terbesar yang mungkin ada dalam PHP saat ini
9223372036854775807
adalah 19 digit, mengingat tanda minus dalam angka negatif, itu akan menjadi 20. Kode di atas menggantikan tanda minus (-
) denganA
karakter dan setiap digit dari0
hingga9
dengan karakter dariD
hinggaM
dan kemudian bantalan string di sebelah kanan dengan karakter spasi untuk selalu membuatnya sepanjang 20 karakter. Misalnya, output untuk input-9876543210
adalah"AMLKJIHGFED "
.Output adalah unik untuk setiap masukan integer dan Anda dapat kembali ke input dengan menghapus semua spasi, menggantikan
A
dengan-
dan menggantiD
untukM
dengan0
ke9
.PHP , 44 byte
Cobalah online!
Ini ide yang sama dengan jawaban Arnauld . Mengubah input menjadi biner, dan kemudian mengubahnya menjadi basis-64. Juga memasukkannya ke 88 karakter (panjang terbesar
-9223372036854775807
adalah 88 karakter) dengan karakter spasi di sebelah kanan untuk selalu mendapatkan panjang yang sama dalam output.sumber
Retina 0.8.2 , 21 byte
Cobalah online! Selalu menampilkan 11 karakter dari jangkauan
n
..z
. Penjelasan:Terjemahkan karakter ASCII yang dapat dicetak ke huruf kecil. Peta ini
-
untukn
dan0
..9
untukq
..z
. (Sangat beruntung bahwa digit-digit tersebut adalah karakter ASCII yang dapat dicetak dari tanggal 16 hingga 25!)Tambahkan 10
o
s. Karena input akan memiliki antara 1 dan 11 karakter, sekarang ada antara 11 dan 21 karakter.Ekstrak 11 karakter pertama. Karena jumlahnya kurang dari 22 karakter, ini hanya akan cocok sekali.
sumber
Arang , 9 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Selalu menghasilkan 10 spasi dan huruf besar. Penjelasan:
sumber
R , 37 byte
Cobalah online!
Sepertinya outputnya acak, tetapi tidak! Input digunakan sebagai seed dari Pseudo-Random Number Generator, dan kami kemudian mendapatkan salah satunya26 ! = 4 ⋅ 1026 permutasi alfabet. Outputnya selalu panjang 51 (26 huruf + 25 spasi).
Masih ada masalah mengasuransikan bahwa semua output berbeda. Kita berakhir dengan232≈ 4 ⋅ 109 permutasi (dari 4 ⋅ 1026 ). Jika kita berpura-pura bahwa permutasi didistribusikan secara seragam secara acak, maka probabilitas bahwa semua permutasi berbeda dapat dihitung dengan mengikuti perhitungan yang sama seperti untuk masalah Ulang Tahun . Probabilitas bahwa 2 output spesifik identik adalah10- 17 , jadi perkiraan urutan pertama dari probabilitas itu semua 232 output yang berbeda adalah
yang cukup dekat dengan 1 untuk saya.
sumber
brainfuck ,
2019 byte-1 byte terima kasih kepada Krzysztof Szewczyk
Cobalah online!
Menghasilkan angka dengan setiap digit dan tanda hubung yang dipetakan ke 255 dikurangi nilai ordinalnya, diisi hingga 255 karakter dengan NUL byte.
sumber
-[>,[->-<]>.[-]<<-]
R ,
4037 byteCobalah online!
Alternatif jawaban Robin Ryder ; ini tentu saja deterministik.
Ini mengubah input ke
raw
vektor 32 byte, setiap byte menjadi angka hex00
atau01
mewakili bit integer. Kami kemudian memaksa kelogical
dengan membandingkan0
, sehingga00
dipetakan keFALSE
dan01
keTRUE
. Maka kita perlu menghapus satu huruf dari masingFALSE
- masing untuk menjamin output dengan panjang yang sama, dipilih secara sewenang-wenangS
. Hasilnya dicetak (dengan spasi) untuk panjang 169.sumber
Zsh , 43 byte
Cobalah online!
Solusi ini mengatasi
long long
batasan bilangan bulat Zsh dengan bekerja hanya dengan karakter. Saya hanya menambahkannya ke 30 karakter agar mudah dibaca, tetapi menggantinya30
dengan99
akan memungkinkan metode ini bekerja pada semua angka dari-1E99+1
hingga1E100-1
.Efek menafsirkan kode desimal sebagai heksadesimal adalah sebagai berikut:
Zsh , 46 byte
Cobalah online!
Menyatakan x sebagai angka biner, nol-empuk hingga lebar 66. Kemudian peta
0
→a
dan1
→b
. Kami juga memetakan2
dan-
ke, karena karakter tersebut dicetak dalam[[-]][base]#[num]
notasi. Untuk melihat$x
seperti apa sebelum penggantian, dan batas Zsh dalam mem-parsing tipe integer, periksa output Debug di tautan TIO.sumber
Jawa (JDK) , 42 byte
Cobalah online!
Pertama, ini menciptakan representasi heksadesimal dari input, diisi dengan spasi yang memberikan batasan panjang yang sama (panjang 8 karakter), menghilangkan tanda minus, dan membuat setiap output intermediate unik.
Ini memberikan string dengan 17 karakter berbeda yang mungkin:
0123456789abcdef
dan ruang.Kemudian setiap karakter di-stream dan dipetakan dengan menambahkan 64 ke codepoint-nya jika itu digit atau spasi. Secara efektif, hasil ini dalam pemetaan berikut:
0123456789abcdef<space>
untukpqrstuvwxyabcdef`
yang memiliki 17 karakter yang berbeda, sehingga tidak ada dua angka akan menghasilkan output yang sama.sumber
Bash , 30 byte
Cobalah online!
Untuk membuktikan bahwa output itu unik, saya hanya mencari Google untuk tabrakan MD5, dan tidak menemukan hasil di antara bilangan bulat- 231 dan 231 . Untuk menghindari karakter terlarang dalam output, cukup terjemahkan karakter yang dimaksud menjadi huruf besar. Output selalu sama panjangnya dengan definisi, dan dijamin tidak mengandung karakter yang dilarang.
sumber