Tantangan
Saya baru saja masuk ke komputer 8-bit dan terpesona dengan cara kerja mereka dan orang lain yang sama; dengan demikian tujuan golf kode ini, adalah untuk mereplikasi sebagian dari Woz Monitor, yang dirancang oleh Steve Wozniak untuk Apple I.
Anda harus menyimpan larik 22 nilai heksadesimal dengan lebar dua byte, (nilai min $ 10 , nilai maks $ FF ), dan kemudian menerima n- jumlah input. (Biasanya dua; bahasa seperti Brainfuck mungkin mengalami kesulitan).
Input akan merujuk ke mana dalam array untuk memulai pencetakan, dan ke mana harus berhenti; input dengan perilaku yang ditentukan akan memiliki nilai awal kurang atau sama dengan nilai akhir. Program Anda kemudian harus mampu mencetak setiap nilai heksadesimal antara, dan termasuk , heksadesimal yang dimasukkan.
Contoh dari ini:
Array
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15
Values
FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5
input first num:
04
input second num:
14
40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6
Sekarang bagian yang menarik dari latihan ini, adalah Anda dapat menggunakan apa pun yang Anda inginkan untuk memeriksa batasan input pengguna. Masukan orang hello
dan program Anda memiliki perilaku yang tidak jelas? Itu berhenti tanpa pemberitahuan? Keduanya valid.
Satu-satunya aturan adalah:
1. Anda harus memasukkan nilai 22 nilai heksadesimal sebagai bagian dari program Anda sebelum dimulai, (tidak dapat meminta input dari pengguna).
2. Output dari nilai heksadesimal harus mengikuti format yang tepat:
00 FF 00 FF 00
Trailing spasi, tab atau garis OK. Karakter tidak.
3. Program tidak perlu meminta input dengan pesan. Biarkan "pesan" kosong jika Anda mau. Pengguna harus memasukkan hex-bounds.
4. Karena nilai-nilai dari 22 hexadecimal terserah Anda untuk memutuskan, Anda harus membuat program yang benar-benar mengambil nilai-nilai dari penyimpanan, berlawanan dengan meniru program dengan hanya mencetak nilai. (seperti daftar $ 00 ).
5. n-jumlah input, mengacu pada jumlah input yang diperlukan untuk bahasa pilihan Anda untuk mengenali heksadesimal dua byte-lebar. misalnya. (Brainfuck akan membutuhkan dua input per hex, membuatnya menjadi empat untuk keduanya).
Jangan ragu untuk berkomentar jika Anda membutuhkan klarifikasi.
Ini adalah kode golf, jadi jawaban tersingkat dalam jumlah byte adalah pemenangnya.
Papan peringkat
Berikut ini adalah papan peringkat yang menghasilkan milik Martin Ender .
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/95080/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
n
karena Brainfuck tidak dapat mengambil string 2 karakter, Anda harus memasukkan byte pertama, kemudian yang kedua untuk nilai pertama, dan kemudian melakukannya lagi untuk nilai kedua, total 4 input. Namun mereka bisa sebanyak yang Anda suka.Jawaban:
Jelly ,
2421 byteNilai yang dipilih:
[00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]
TryItOnline
Jika input kedua kurang dari yang pertama akan menghasilkan urutan terbalik.
Perilaku di luar batas tidak terdefinisi (mis. "Foo", "14" mengembalikan nilai 38, yang sebagian besar bahkan tidak dalam array dan banyak yang tidak panjang 2)
Bagaimana?
sumber
1F
), artinya saya tidak perlu "dengan benar" menginterpretasikan input hex atau menambahkan 16 untuk memberi saya dua digit hex untuk mengkonversi kembali.JavaScript (ES6),
1181151121028281 byteDisimpan 1 byte berkat produk ETH
Nilai yang dipilih:
0x04
/0x0f
).0x00
(nilai minimum).0x15
(nilai maksimum).Versi sebelumnya (97 byte)
Menghasilkan daftar pseudo-acak dari nilai-nilai heksadesimal 'benar':
Urutan:
sumber
[a,b]=prompt().split(' ')
di baris perintah. Bagaimanapun, jawaban saya yang diperbarui harus memperbaikinya.JavaScript (ES6),
107 152137 byteTampilkan cuplikan kode
Nilai yang dipilih:
Input:
0x14
InternalError: too much recursion
NaN
luar batas.Solusi sebelumnya:
152 byte:
107 byte, solusi tidak valid (input tidak ada):
sumber
console.log(...)
. ;)var
dan yang terakhir;
bukan bagian dari jawabannya. Ini hanya untuk cuplikan, itu sebabnya saya menambahkan linebreak. Saya akan mengedit jawabannya.Python,
888786 byte1 byte simpan berkat @JonathanAllan
1 byte simpan lagi ke @JonathanAllan
Juga mengubah basis kode, jauh lebih baik sekarang.
Nilai yang dipilih:
00
untuk semuanya.Ide yang sama dengan jawaban C saya. Namun kali ini, kode mengambil input tunggal dari pengguna, membutuhkan ruang antara kedua nilai, membaginya, melemparkannya ke nilai hex, dan mencetak setiap hex dalam
l
array termasuk dan antara dua nilai yang diinput. Karena Python memiliki sistem penangkap kesalahan yang luar biasa, tidak ada buffer overflows yang hadir dan karena itu kodenya jauh lebih aman. Program ini aman dari perilaku yang tidak terdefinisi dalam arti bahwa ia tidak akan dieksekusi ketika nilai yang lebih tinggi diajukan sebelum nilai yang lebih rendah.Ini harus bekerja pada kedua Python 2.x dan 3.x; Harap perbaiki saya jika saya salah, karena saya tidak memiliki akses ke kedua penerjemah karena sistem saya tidak mendukung keduanya.
sumber
C ++,
989593 byteNilai yang saya pilih semuanya 0
sumber
04
dan06
, saya hanya mendapatkan dua nilai kembali. Saya curiga ini adalah05
dan06
nilai - nilai. Anda harus memberikan semua nilai antara dan termasuk nilai yang dimasukkan.Perl,
794541 byte"nilai min $ 10" - contohnya memiliki minimum $ 00- apakah itu kesalahan ketik?
Inilah jawaban perl yang agak membosankan dalam 41 byte (Apakah 46 dan kemudian saya terus melihat spasi, parens aku bisa kawin lari). Mengambil input dalam dua baris.
Data adalah daftar 04..1A
Sebelumnya saya terlalu pintar dengan paket & membongkar. Byte inputnya dimasukkan sekaligus dihancurkan bersama, misalnya "020E 'akan mencetak entri ke-14
Mungkin akan mencoba bermain golf lebih banyak menggunakan semua 0
substr
,, danprintf'%*vX'
... tidak yang membuat jawaban saya lebih lama. 48 karakter (menggunakan string ascii '7', hex 37 sebagai data)sumber
CJam, 22 byte
Nilai yang dipilih:
Cobalah online
sumber
Scala, 45 byte
Tidak Disatukan:
Penggunaan
00
untukFF
sebagai nilai-nilai, tetapi karya-karya hingga 2147483647.sumber
error: ')' expected but string literal found.
ata.to(b).map(
C,
176175161 byte1 byte simpan berkat @JonathanAllan
bantuan besar-besaran terima kasih kepada @Downvoter karena telah menyelamatkan saya 14 byte!
Cobalah online!
Nilai yang dipilih:
00
untuk semuanya.Batalkan jawaban golf:
Trik untuk ini, adalah mengambil dua input dan mencoba mengubahnya menjadi string heksadesimal dan kemudian dilemparkan ke bilangan bulat. Karena tidak ada pengecekan kesalahan atau apapun juga, perilaku tidak terdefinisi hanyalah melempar kesalahan dan merusak program. Pengguna perlu memasukkan dua input, namun kompiler Eclipse CDT saya sepertinya membiarkan saya memasukkan keduanya pada baris yang sama dengan spasi di antaranya.
Mereka harus berada dalam urutan yang benar, karena meminta nilai yang lebih besar sebelum nilai yang lebih kecil tidak akan menjalankan
while
-loop sama sekali.Masalahnya, tidak ada perlindungan buffer-overflow, jadi saya bisa meminta sesuatu yang tidak masuk akal seperti kisaran dari $ 0 hingga $ FFFF, dan saya akan mendapatkan semua yang ada di memori komputer saya dari awal alokasi memori untuk
a[44]
array. , hingga nilai 65536 nanti.sumber
%x
langsung?char s[2]
bukanmalloc
barang?malloc
Nilai pengembalian casting tidak perlu dalam C.printf("%d%d ", ...)
bagian, dengan mengganti format dengan%x
hanya mengembalikan0
bukan00
, dan tidak ruang mereka keluar.scanf
.GNU sed, 209 + 1 (r flag) = 210 byte
Cobalah online! Satu ruang terdepan hadir dalam output, saya harap itu diizinkan.
Jalankan contoh:
Penjelasan: 22 nilai heksadesimal yang disimpan sama dengan yang dari contoh OP
Indeks awal dan akhir dibaca pada baris yang berbeda. Outputnya adalah satu baris dengan nilai tabel dalam rentang indeks itu (inklusif). Input yang tidak terdefinisi akan menulis beberapa baris output yang tidak valid.
sumber
PHP,
106 105 10496 + 2 byteatau
Jalankan dengan
php -nr '<code>' <lowindex> <highindex>
; lepaskan tanda kutip tunggal dalam kode.... atau uji secara online .
dechex
menginterpretasikan input sebagai string heksadesimal sejauh karakter adalah digit hex,0
jika input dimulai dengan sesuatu yang lain.tidak mencetak apa pun jika nilai pertama lebih besar dari yang kedua.
nilai yang dipilih:
(22 kode ascii pertama dari kode yang dieksekusi)
atau
dengan nilai-nilai ini:
sumber
<?php
potongan?-r
. Dan jika saya perlu menyimpannya di file, saya menggunakan tag terbuka pendek<?
.a
,,z
danProgramingPuzles_CGolf
tidak terdefinisi. Dari manaProgramingPuzles_CGolf
datangnya? : /stderr
untuk/dev/null
jika Anda tidak seperti mereka. PHP mengevaluasi konstanta yang tidak terdefinisi pada string.Rakitan Apple II 6502, 75 byte
Kode byte:
Membongkar:
Ini membentuk array dalam memori yang terlihat seperti output. Nilai yang dipilih adalah:
Pengguna menekan empat tombol untuk mengatur input.
sumber