Buat Nomor Bijaksana

18

Wise adalah bahasa bitwise sederhana yang saya rancang beberapa waktu lalu. Hal ini didasarkan pada operasi bitwise Python . Ini memiliki beberapa operasi sebagian besar adalah sama atau sangat mirip dengan simbol yang setara dengan Python.

  • : Gandakan bagian atas tumpukan

  • ? Putar bagian atas tumpukan ke bawah

  • ! Putar bagian bawah tumpukan ke atas

  • [ ] lingkaran sementara bagian atas tumpukan tidak nol

  • ~bukan bagian atas tumpukan ( -(n+1))

  • -negasikan bagian atas tumpukan ( -n)

  • >bitshift bagian atas tumpukan satu kali ke kanan ( n//2)

  • <bithift bagian atas tumpukan sekali ke kiri ( n*2)

  • ^xor dua item teratas dari tumpukan ( Sama seperti Python )

  • |atau dua item teratas dari tumpukan ( Sama seperti Python )

  • &dan dua item teratas dari tumpukan ( Sama seperti Python )


Membuat bilangan bulat di Wise cukup sederhana, Anda dapat membuat nol dengan ::^dan menambahkannya dengan ~-sehingga Anda membuat nol dan menambahnya beberapa kali. Namun jika kita menghapus -hal - hal menjadi sedikit lebih menarik.

Kami masih dapat membuat setiap angka menggunakan operasi yang tersisa. Misalnya di sini adalah 3

~<<~

TIO

Ini bekerja karena ~mengubah nol, string 0bit tak terbatas , menjadi negatif, string tak terbatas 1bit, masing-masing <menambahkan 0sedikit ke akhir, ketika kita selesai kita lakukan ~yang mengubahnya masing-masing menjadi string 0s diikuti oleh dua 1s , atau seperti kebanyakan orang menyebutnya 3.


Tugas

Tulis sebuah program yang ketika diberi bilangan bulat positif akan menampilkan program Wise yang akan membuat angka ntanpa -sumbernya (sumber output, Anda dapat menggunakan -sumber Anda sendiri). Anda dapat berasumsi bahwa sudah ada nol di atas tumpukan.

Ini adalah bukan sehingga Anda harus bertujuan untuk meminimalkan kode sumber yang menghasilkan belum tentu output.

Keluaran contoh

Daftar ini tidak lengkap mereka hanya mungkin keluaran

1  -> ~<~
2  -> ~<~<
3  -> ~<<~
4  -> ~<~<<
5  -> ~<~:<<|
6  -> ~<<~<
7  -> ~<<<~
8  -> ~<~<<<
9  -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<
Wisaya Gandum
sumber
adalah 0 termasuk dalampositive integers
colsw
4
Tidak, 0 tidak termasuk dalam bilangan bulat positif.
Zacharý
Rupanya :diterapkan pada tumpukan kosong mendorong a 0. Saya pikir ini harus ditentukan, karena tidak jelas bahwa duplikasi dari tumpukan kosong harus memberikan0
Luis Mendo
Apakah ada kesalahan sintaksis karakter lain, atau diabaikan?
xnor
@Luismendo Anda tidak tahu isi tumpukan selain itu juga jika tumpukan itu nol
Wheat Wizard

Jawaban:

8

Japt , 10 byte

¤d0'<1"~<~

Cobalah online!

Ide dasar: ambil representasi biner dari angka tersebut, dan petakan 0ke <dan 1ke ~<~. Output untuk 1-10:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<
Produksi ETH
sumber
Metagolf ini juga mudah. Pasangan telanjang~~
Draco18s
7

JavaScript (ES6), 34 33 byte

f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Berfungsi untuk integer 32-bit.

Neil
sumber
Ok saya menemukan ini. Keren! pekerjaan yang baik.
Wheat Wizard
7

Haskell , 38 byte

Saya merasa PPCG benar-benar meningkatkan Haskell saya. Membelai kucing putih.

f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id

fmengambil Intdan mengembalikan a String.

Cobalah online!

(Ngomong <$f-ngomong, itu maksud saya . Itu menghemat satu karakter \_->.)

Dalam Functorcontoh untuk (->) a(fungsi dari jenis a), kita memiliki: x <$ f = fmap (const x) f = const x . f = const x. Satu-satunya batasan adalah itu fdan final const xharus menggunakan tipe sumber yang sama a. Contoh ini benar-benar malas sehingga ini bahkan tidak pernah mengevaluasi f.

Atau, panjang yang sama tetapi kurang jahat ( (l!!)adalah fungsi anonim):

(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]

Cobalah online!

Keduanya menggunakan representasi yang sama dengan jawaban JET @ETHproductions, meskipun terutama yang pertama mungkin memberikan beberapa redundan <di awal.

Yang pertama menghitung semua kombinasi n "<"dan "~<~"string, kemudian indeks ke dalam daftar yang dihasilkan.

Yang kedua secara rekursif menghitung daftar tak terbatas yang dibentuk dengan mulai dengan ""dan kemudian membangun elemen baru dengan menambahkan "<"dan "~<~"merangkai ke setiap elemen yang sudah ada dalam daftar (sebenarnya itu sedikit lebih pendek untuk juga membiarkan ""bisa berubah menjadi"<" .)

Ørjan Johansen
sumber
1
Bagaimana cara <$fkerjanya? Beberapa contoh functor aneh?
xnor
@xnor Mwahahaha Saya kira saya harus menambahkan penjelasan kalau begitu.
Ørjan Johansen
3

Ruby , 118 116 109 107 105 91 byte

Disimpan 2 byte berkat cyoce!

->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}

Cobalah online!

Ini adalah fungsi yang mengambil integer sebagai input dan mengembalikan string yang mewakili integer di Wise. Anda dapat menemukan versi tanpa ungolfed sini , yang menguji program ini pada semua bilangan bulat dari 1 hingga

Gagasan dasarnya adalah merekam "kumpulan" konstanta. Kemudian, dengan setiap "langkah", konstanta ditambahkan ke kumpulan untuk setiap fungsi yang mungkin. Saya telah memilih fungsi ~,, <dan >, yang saya yakin cukup untuk mewakili setiap angka. (Setidaknya, setiap angka di bawah 10.000.)

Conor O'Brien
sumber
Anda dapat menggunakan dupsebagai ganti cloneiirc
Cyoce
Apakah Anda perlu dup? maptidak memodifikasi receivernya.
Cyoce
@Cyoce Saya pikir itu benar
Conor O'Brien
Oh saya mengerti sekarang. Ruby tidak suka memodifikasi saat iterasi.
Cyoce
3

Python2, 54 52 51 byte.

lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])

Terima kasih kepada Wheat Wizard untuk menghemat 2 byte, dan Ørjan Johansen untuk satu byte! Ini menggunakan ide yang sama dengan jawaban Japt ETHproduction, tetapi dengan string pengganti yang berbeda (yaitu menggunakan representasi biner)

Zacharý
sumber
Anda tidak perlu [ ]sekitar generator bagian dalam join. joindapat menggunakan generator sebagai argumennya.
Wheat Wizard
Saya pikir '>~<~'*int(i)mungkin menghemat satu byte.
Ørjan Johansen
Saya percaya skor terbaru seharusnya terdaftar terakhir, untuk kepentingan potongan papan skor otomatis dan sejenisnya.
Ørjan Johansen
Di sana, maaf sudah terlambat.
Zacharý
2

05AB1E , 11 byte

bS'<…~<~‚èJ

Cobalah online!

Mirip dengan jawaban Japt produk ETH.

Disimpan 4 byte berkat @Adnan!

Kamerad SparklePony
sumber
Hai bagus! Anda sebenarnya tidak perlu mengonversi angka menjadi string karena sama dengan 'tipe' di 05AB1E. Sama untuk jumlah literal (Anda dapat melakukannya tanpa '). Anda juga dapat menggunakan pengindeksan, yang seharusnya memberi Anda 11 byte :).
Adnan
@ Adnan Terima kasih banyak!
Kamerad SparklePony
@ Adnan Hanya pertanyaan singkat, bagaimana cara saya bekerja di sini?
Kamerad SparklePony
Pertama, ia bertukar argumen karena akan menjadi pengecualian jika dievaluasi secara normal. Setelah bertukar, ia memetakan 0ke elemen nol dan 1ke elemen pertama (karena vektor secara otomatis). Berikut ini adalah contoh yang lebih jelas tentang cara kerjanya.
Adnan
1

Python 2 , 123 110 byte

def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"

Cobalah online!

Juga sebagai a lambda

w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"

Cobalah online!

Bisa lebih pendek tapi ini solusinya. Dibutuhkan representasi biner dan mengubahnya menjadi kode.

Wisaya Gandum
sumber
0

Jelly, 11 10 byte

Bị“~<~“<”F

Ini adalah versi porting dari jawaban Japt ETHproduk. Omong-omong tentang produk ETH, mereka menyelamatkan saya satu byte!

Zacharý
sumber
Bisakah Anda menukar string dan berpura-pura pengindeksan berbasis 0?
ETHproduksi
Apa maksudmu? Saya merujuk pada fakta bahwa saya harus menambahkan representasi biner dari angka tersebut untuk mendapatkan indeks yang dapat digunakan.
Zacharý
Cobalah online!
ETHproduksi
Tidak berfungsi, 1 menghasilkan <, yang dalam Wise menghasilkan 0
Zacharý
Betulkah? Ini memberi ~<~saya
ETHproduksi