Konverter nomor bangunan basis profesor

12

Profesor matematika yang sinting ini ingin menyandikan semua penelitian mereka menggunakan sistem yang pasti akan mengalahkan pesaing mereka yang paling keren sekalipun!

Untuk tujuan ini, profesor telah memutuskan untuk mengubah basis bukan hanya nomor yang mereka tulis tetapi setiap digit di nomor itu, sesuai dengan tempat digit itu menemukan dirinya (menghitung dari kanan, dimulai dengan 1). Sebagai contoh:

Angka 0 memiliki satu digit, sehingga diwakili dalam basis 1: 0

Angka 1 akan memiliki satu digit di basis sepuluh, tetapi dalam sistem profesor kami itu tidak valid. Tempat pertama dicadangkan untuk basis 1 digit saja! Ini berarti harus ditabrak ke tempat kedua di mana basis 2 diizinkan: 10

Angka 2 mengharuskan setidaknya basis 3 ditulis: 100

Tetapi sekarang angka 3 dapat ditulis dengan mengubah angka di tempat kedua: 110

dan 4 sebagai: 200

Berikut beberapa contoh lain untuk membantu Anda mendapatkan ide:

5: 210

6: 1000

7: 1010

8: 1100

9: 1110

10: 1200

11: 1210

12: 2000

13: 2010

14: 2100

15: 2110

16: 2200

17: 2210

18: 3000

Dengan menggunakan sistem ini, catatan profesor tidak akan masuk akal bagi siapa pun kecuali mereka, dan mereka akhirnya dapat mengambil alih dunia !!!! tidur nyenyak di malam hari.

Tentu saja metode pengkodean harus sejelas mungkin.


Tugas Anda adalah menulis 10 cuplikan kode, masing-masing mewakili salah satu dari 10 digit basis

0 1 2 3 4 5 6 7 8 9

yang bila digabungkan dalam urutan nomor yang akan dikonversi akan menghasilkan angka yang ditulis dalam sistem penomoran jahat profesor (metode output mungkin pilihan Anda tetapi harus nomor yang dapat dibaca manusia dengan hanya menggunakan angka 0-9)

Misalnya jika cuplikan saya adalah:

0 = MONKEY 1 = CONTOH, 2 = KODE, 3 = GOLF dan 9 = UJI

kemudian

19 = EXAMPLETEST -> 3010

20 = CODEMONKEY -> 3100

21 = CODEEXAMPLE -> 3110

22 = CODECODE -> 3200

23 = CODEGOLF -> 3210

Tidak ada angka input dengan lebih dari 10 digit atau angka negatif yang perlu dipertimbangkan, meskipun jika Anda ingin menulis kode untuk digit tambahan Anda akan mendapatkan pujian tambahan. Ini adalah kode golf, jadi jawaban tersingkat (menggunakan total byte gabungan dari semua snippet) menang dan celah standar tidak diizinkan.

ADDENDUM: Sebelum ada yang memulai apakah 0 adalah representasi yang benar dari 0 di basis 1, saya ingin mengingatkan Anda bahwa profesor ini gila. Jalani saja.

Joe Bloggs
sumber
1
Catatan: Sistem profesor juga dikenal sebagai sistem angka faktorial .
ETHproductions
Ini juga OEIS A124252
user41805
@ ETHproductions Saya tidak pernah mengatakan pengkodean Profesor itu bagus .
Joe Bloggs
@KritixiLithos Terima kasih untuk itu! Saya mencari itu untuk digunakan sebagai konfirmasi.
Joe Bloggs
4
Selamat datang di PPCG, by the way :-)
ETHproduk

Jawaban:

1

Mathematica (lingkungan REPL), 858 total byte

Berikut adalah cuplikan kode 86-byte untuk digit 9:

1;ValueQ@a||(a=0;b=3);a=10a+9;b++;FromDigits[a~IntegerDigits~MixedRadix@Range[b,1,-1]]

Cuplikan kode untuk angka 1 hingga 8 identik, kecuali bahwa 9 diganti dengan angka yang sesuai. Cuplikan kode untuk angka 0 sama, kecuali +9hanya dihapus.

a~IntegerDigits~MixedRadix@Range[b,1,-1]menghitung daftar angka sistem angka faktorial a, selama bpaling tidak sebesar jumlah digit; FromDigitsmengonversi daftar angka itu menjadi integer basis-10 biasa untuk keperluan output. (Jika salah satu elemen daftar melebihi 9, sesuatu yang lucu terjadi.)

Dalam lingkungan REPL Mathematica, perhitungan dapat diakhiri dengan titik koma untuk menekan output; jadi hanya output terakhir dalam rantai yang dipisahkan titik koma yang akan ditampilkan. Kami mendefinisikan bilangan bulat yang aditunjuk oleh cuplikan secara rekursif , dan juga terikat bpada jumlah digit sistem-faktorial yang diperlukan. Perintah ValueQ@a||(a=0;b=3)menginisialisasi variabel-variabel ini jika mereka tidak diinisialisasi (yaitu, dalam potongan pertama) dan membiarkannya sendiri; kemudian a=10a+9;b++melakukan rekursi. Akhirnya, yang pertama 1;adalah untuk menempelkan potongan: itu mengalikan perhitungan menengah dengan 1 (yang tidak pernah kita lihat lagi pula).

Greg Martin
sumber
Saya menikmati penyalahgunaan titik koma.
Joe Bloggs
0

Goruby, 790 810 980

Inilah upaya kedua, dengan mengandalkan fakta bahwa, pada dasarnya shell apa pun, mencetak carriage return ("\ r") tanpa baris baru ("\ n") akan menimpa baris yang sebelumnya dicetak, pada akhirnya memastikan bahwa hanya bit terakhir yang dicetak. (yaitu, hasil akhir) ditampilkan.

Ini harus dijalankan dalam shell, mis ruby name_of_file.rb.

Ini berfungsi untuk angka positif dengan panjang tidak terbatas.

Kode adalah sepuluh salinan cuplikan di bawah ini, dengan X(di bagian atas) diganti dengan angka 0-9, satu per cuplikan.

->*t{n,d,o="X#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Artinya, cuplikan yang mewakili (misalnya) 8 akan terlihat seperti:

->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Tantangan menyatakan bahwa cuplikan harus "digabungkan" untuk membuat mewakili angka beberapa digit, jadi, untuk menambahkan satu digit ke suatu angka, cukup letakkan di kurung siku di ujung angka. Dengan demikian, angka 103 (dalam desimal) adalah:

->*t{n,d,o="1#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="0#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[]]]
Pengawas
sumber
Maksud Anda nomor 108.
user75200