Wozモニター


17

チャレンジ

私は最近、8ビットのコンピューターを手に入れて、それらの機能や他の機能に魅了されています。したがって、このコードゴルフの目的は、Apple Iのためにスティーブウォズニアックによって設計されたウォズモニターの一部を複製することです。

2バイト幅の22個の16進値の配列(最小値$ 10、最大値$ FF)を保存し、n個の入力量を取得します。(通常2つ。Brainfuckのような言語は苦労するかもしれません)。
入力は、配列のどこから印刷を開始し、どこで停止するかを参照します。動作定義された入力の開始値は、終了値以下になります。プログラムは次に間のすべての16進数値を印刷することができなければならないとを含む、進数を入力しました。

この例:

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

この演習の興味深い部分は、ユーザー入力の境界を確認するものなら何でも使用できることです。人の入力helloとプログラムには未定義の動作がありますか?予告なく終了しますか?どちらも有効です。

唯一のルールは次のとおりです。

1.プログラムを開始する前に、プログラムの一部として22個の16進値の値を含める必要があります(ユーザーに入力を求めることはできません)。
2. 16進値の出力は、正確な形式に従う必要があります。 00 FF 00 FF 00末尾のスペース、タブ、または行はOKです。文字はそうではありません。
3.プログラム、メッセージで入力を要求する必要はありません。必要に応じて、「メッセージ」を空白のままにします。ただし、ユーザーは16進境界を入力する必要があります。
4. 22個の16進数の値は決定するのと同じであるため、値を印刷するだけでプログラムを模倣するのではなく、ストレージから実際に値をフェッチするプログラムを作成する必要があります。($ 00のリストなど)。
5。 入力のn量は、選択した言語が2バイト幅の16進数を認識するために必要な入力の量を指します。例えば。(Brainfuckは、ヘックスごとに2つの入力を必要とし、2つに対して4つになります)

説明が必要な場合は、お気軽にコメントしてください。

これはコードゴルフであるため、バイト数の最も短い答えが勝者です。

リーダーボード

以下は、Martin Enderの好意によるスニペットを生成するリーダーボードです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes


ユーザーに2つの入力またはnを要求していますか?22の16進値を選択しますか?
-xnor

はい、22個の値を決定するのはあなた次第です。入力値は、任意の量にすることができます。私は言ったnBrainfuckは、2文字の文字列に取ることができないので、あなたが入力する最初のバイト、最初の値の2番目を必要とし、その後、第二の値、合計で4つの入力のために再びそれを行うだろう。ただし、好きなだけ多くできます。
フィンレイメント

ただし、値を使用すると、単にすべてを00にすることはできず、プログラムが実際に配列を読み取るものを模倣することはできません。質問を更新します。
フィンレイメント

入力2が入力1より小さい場合、逆方向にラップまたは読み取る必要がありますか?
ジョナサンアラン

@JonathanAllanそれは完全にあなた次第です。入力が正しいことを確認すると、コードが大きくなる可能性があります。ルールのすぐ上に書かれているように、任意の形式の入力を許可し(必要に応じて)、必要に応じて未定義の動作やエラーを引き起こします。
フィンレイメント

回答:


4

ゼリー24 21 バイト

w@€ØHḅ⁴
ɠǵɠÇr@b⁴ịØHK

選択した値: [00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]

TryItOnline

2番目の入力が最初の入力よりも小さい場合、逆のシーケンスを出力します。
範囲外の動作は未定義です(たとえば、「foo」、「14」は38個の値を返します。これらの値のほとんどは配列内になく、その多くは長さ2ではありません)

どうやって?

w@€ØHḅ⁴ - Link 1, parse a string as a 1-based hex value e.g. "14"
w@€      - first index (1-based) of each character in
   ØH    - hex digits: "0123456789ABCDEF"                   [2,5]
     ḅ⁴ - convert from base 16                                 37

ɠǵɠÇr@b⁴ịØHK - Main link
ɠ  ɠ          - read a line from stdin               e.g. "04"  "14"
 Ç  Ç         - call the last link (1) as a monad          21    37
  µ           - monadic chain separation
     r@       - inclusive range, with reversed arguments  [   21,   22,...,   36,   37] 
       b⁴     - convert to base 16                        [[1,5],[1,6],...,[2,4],[2,5]]
         ị    - index into
          ØH  - hex digits: "0123456789ABCDEF"            [ "04", "05",..., "13", "14"]
            K - join with spaces

ああ、ごめんなさい。あなたは確かに正しかった。よくやった、リーダーボードの位置#1を持っています。:)
フィンレイメント

1
はい、1つのオフセット値を移動して変更しました(現在1F)。16進入力を「正しく」解釈したり、16を追加して変換する2桁の16進数を与える必要はありません。
ジョナサンアラン

4

JavaScript(ES6)、118 115 112 102 82 81バイト

ETHproductionsのおかげで1バイト節約

選択した値:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
10 10 11 14 10 10 15 15 11 14 10 10 15 15 11 14 10 10 15 15 10 11
  • 下限のプロンプトが表示され、次に上限のプロンプトが表示されます(例0x04/ 0x0f)。
  • 無効な下限は0x00(最小値)と解釈されます。
  • 無効な上限は次のように解釈されます 0x15(最大値)ます。
  • 下限が上限より大きい場合は何も出力しません。

alert((1/7+'789').replace(/./g,(v,i)=>i<a|i>b?'':(v|10)+' ',p=prompt,b=p(a=p())))

以前のバージョン(97バイト)

「true」16進値の擬似ランダムリストの生成:

alert((1/7+'789').replace(/./g,(v,i)=>i<a|i>b?'':(v*7|16).toString(16)+' ',p=prompt,a=p(),b=p()))

シーケンス:

10 10 17 1c 1e 38 33 31 17 1c 1e 38 33 31 17 1c 1e 38 33 31 38 3f

「メッセージ」:「キャッチされないでSyntaxError:無効な分割代入のターゲット」
フィンレイメント

@frayment-これはChromeですよね?[a,b]=prompt().split(' ')コマンドラインで文句を言わないので、それは奇妙です。とにかく、私の更新された答えはそれを修正するはずです。
アーナルド

よくやった!今すぐ動作します。Chromeがそれを行うのは奇妙なことです。JSテスターと開発者コンソールでテストしました。同じエラー。リーダーボードへようこそ。
フィンレイメント

0x04
Hedi

1
おい、あなたの代わりに何も悪いことはありません、それはここでうまく機能し、ルールの範囲内です。投稿を更新してください!:)
フィンレイメント

3

JavaScript(ES6)、107 152 137バイト

p=prompt,f=(a=+p(),b=+p(),[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'');alert(f())

選択した値:

FF F4 B6 D7 40 20 11 A4 F0 D0 FF 3D 9C 21 65 C4 A2 28 90 E7 D6 A5

入力:

  • 入力形式は 0x14
  • 入力が負の場合、または最初の入力が2番目よりも大きい場合: InternalError: too much recursion
  • NaN範囲外で印刷します。

以前のソリューション:
152バイト:

i=parseInt,p=prompt,f=(a=i(p()),b=i(p()),[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'');alert(f())

107バイト、無効なソリューション(入力がありません):

f=(a,b,[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'')

1
閉じる!ただし、ユーザーに入力を要求できる必要があります。あなたが何をしたかが好きconsole.log(...)です。;)
フィンレイメント

@frayment var とlast ;は答えの一部ではありません。そのスニペットだけのために、改行を追加しました。答えを編集します。
エディ

私の悪い@Hedi、それについてすみません。
フィンレイメント

2

Python、88 87 86バイト

@JonathanAllanのおかげで
1バイトの保存@JonathanAllanに 再び 1バイトの保存

また、コードのベースも変更され、より良くなりました。

a,b=[int(x,16)for x in raw_input().split()];l=[0]*22
while a<=b:print"%02x"%l[a],;a+=1

選択された値:00すべてのため。

私のCの答えと同じ考え。しかし今回は、コードはユーザーからの単一の入力を受け取り、両方の値の間にスペースを必要とし、それらを分割し、16進値にキャストしl、2つの入力値を含む配列内のすべての16進を印刷します。Pythonには素晴らしいエラーキャッチシステムがあるため、バッファオーバーフローは発生せず、したがってコードの安全性ははるかに高くなります。プログラムは未定義の動作から安全です、低い値の前に高い値が送信されたときに実行されないという意味で、です。

これはPython 2.xと3.xの両方で動作するはずです。私のシステムが両方をサポートしていないため、両方の通訳者にアクセスできないため、間違っている場合は修正してください。


2

C ++、98 95 93バイト

#include <iostream>
int _[22],a,b;int main(){for(std::cin>>a>>b;b/a++;)printf("%02x ",_[a]);}

選択した値はすべて0です


プログラミングパズルとコードゴルフへようこそ!これはよくできた答えですが、チャレンジの要件を満たしているとは思いません。22個の選択された16進値を含めてよろしいですか?
ETHproductions

もうすぐ!唯一の問題は、値04とを入力したときに06、2つの値しか返されないことです。私はこれらが値である05と疑ってい06ます。あなたはすべての値の間に提供する必要があると含めて、入力された値を。
フィンレイメント

1
@frayment、そうそう、それを修正しました!
ファティ・バキル

1

Perl、79 45 41バイト

「最小値$ 10」-例の最小値は$ 00です-これはタイプミスですか?

ここに、41バイトのかなり退屈なperlの回答があります(46だったので、スペースを見続けました。2行の入力を受け取ります。

printf'%02X ',$_ for(4..26)[hex<>..hex<>]

データはリスト04..1Aです

パック&アンパックがあまりにも賢い前に。入力バイトは一度に入力されます。たとえば、「020E」は2番目から14番目のエントリを出力します

printf'%02X ',$_ for sub{(4..26)[shift..shift]}->(unpack'CC',pack'H4',<>)

、すべて0を使用して、よりそれをゴルフ試してみてくださいsubstr、とprintf'%*vX'...長い私の答えをしているいいえ。48文字(ASCIIの文字列「7」、16進数37をデータとして使用)

printf'%*vX',' ',substr 7x22,$s=hex<>,1+hex<>-$s

1

CJam、22バイト

{r:~Gb}2*37m!s2/\)<>S*

選択した値:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15
-----------------------------------------------------------------
13 76 37 53 09 12 26 34 50 46 31 59 79 58 15 80 90 24 00 00 00 00

オンラインで試す


1

Scala、45バイト

(_:Int)to(_:Int)map(x=>f"$x%02X")mkString " "

ゴルフをしていない:

(a:Int,b:Int)=>a.to(b).map(x=>f"$x%02X").mkString(" ")

00to FFを値として使用しますが、2147483647まで機能します。


error: ')' expected but string literal found.ata.to(b).map(
フィンレイメント

それが私なのか、それとも何なのかわからない。:/何で実行してみますか?
フィンレイメント

なぜならScalaの2.10.0で導入された文字列の補間、おそらくだ@frayment
corvus_192

では、どのバージョンでこれをビルドしましたか?2.9?
フィンレイメント

@frayment 2.11.7 REPL
corvus_192

1

C、176の 175 161バイト

@JonathanAllanのおかげで1バイト節約14バイト
を節約してくれた@Downvoterのおかげで大助かりです!

int main(){int a[44]={0};char s[2];scanf("%s",s);int b=(int)strtol(s,0,16);scanf("%s",s);int c=(int)strtol(s,0,16);while(b<=c){printf("%d%d ",a[b],a[b+1]);b++;}}

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

選択された値:00すべてのため。

ゴルフのない答え:

int main() {
    int a[44] = {0};
    char s[2];
    scanf("%s", s);
    int b = (int) strtol(s, 0, 16);
    scanf("%s", s);
    int c = (int) strtol(s, 0, 16);
    while (b <= c) {
        printf("%d%d ", a[b], a[b+1]);
        b++;
    }
}

これの秘trickは、2つの入力を受け取り、それらを16進文字列に変換してから整数にキャストしようとすることです。エラーチェックなども行われないため、未定義の動作は単にエラーをスローしてプログラムを破壊することです。ユーザーは2つの入力を入力する必要がありますが、私のEclipse CDTコンパイラーは、同じ行にスペースを空けて入力できるようです。

小さい値の前に大きい値を要求してもwhile-loop はまったく実行されないため、正しい順序にする必要があります。

バッファオーバーフロー保護も存在しないため、$ 0から$ FFFFの範囲などの不合理なものを要求するだけで、a[44]アレイのメモリの割り当ての最初からすべてのメモリをコンピュータに取得できます。、後で65536値まで。


ほとんどのscanf形式はとにかく空白をスキップしますが、入力形式の単一の空白文字は入力ストリームの任意の量の空白と一致%xします。
ニール

なぜchar s[2]代わりに使用しないのmallocですか?mallocとにかくCでのキャストの戻り値は必要ありません。
cadaniluk

@Neilパーツについて説明している場合printf("%d%d ", ...)、フォーマットを置き換えることにより、単に「s」ではなく「s」%xのみを返し、スペースを入れません。000
フィンレイメント

@Downvoterありがとうございます!私はそれを考えていませんでした。今すぐ回答を編集しています。
フィンレイメント

いいえ、私はまだ話していscanfます。
ニール

1

GNU sed、209 + 1(rフラグ)= 210バイト

1{h
s:.*:,00 FF,01 F4,02 B6,03 D7,04 40,05 00,06 00,07 A4,08 F0,09 00,0A FF,0B 0D,0C 9C,0D 21,0E 65,0F C4,10 02,11 28,12 90,13 E7,14 D6,15 A5:
H;d}
G;s:\n(.*)\n.*(,\1.*):\n\2:
s:(.*)\n(.*,\1 ..).*:\2:
s:,..::g

オンラインでお試しください!出力には先頭に1つのスペースがあります。許可されていることを願っています。

例の実行:

me@LCARS:/PPCG$ echo -e "06\n0F" | sed -rf table_lookup.sed
 00 A4 F0 00 FF 0D 9C 21 65 C4
me@LCARS:/PPCG$ echo -e "13\n13" | sed -rf table_lookup.sed
 E7

説明:保管されている22個の16進値は、OPの例の値と同じです

value | FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5
-------------------------------------------------------------------------
index | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15

開始インデックスと終了インデックスは別々の行で読み取られます。出力は、そのインデックス範囲内のテーブル値を含む単一行です。未定義の入力は、無効な出力の複数の行を書き込みます。

# store START index in hold space
1{h
# generate the table
s:.*:,INDEX1 VALUE1,INDEX2 VALUE2,°°°:
# append table to hold space and delete pattern space
H;d}
# read END index, append hold space (pattern space format is: END\nSTART\nTABLE)
G
# delete table entries up to, but excluding, the START index (END\nTABLE')
s:\n(.*)\n.*(,\1.*):\n\2:
# delete table entries starting from, but excluding, the END index (TABLE'')
s:(.*)\n(.*,\1 ..).*:\2:
# remove the indexes and print (implicitly) the resulting values
s:,..::g

1

PHP、106105104 96 + 2バイト

eval($s='for($a=a;$a++<c;)$$a=hexdec($argv[++$i]);while($b<=$c)printf("%02X ",ord($s[$b++]));');

または

eval($s='for($a=a;$a++<c;)$$a=hexdec($argv[++$i]);');while($b<=$c)printf("%02X ",ord($s[$b++]));

php -nr '<code>' <lowindex> <highindex>;で実行 コード内の単一引用符をエスケープします。
...またはオンラインでテストする

dechex 文字が16進数字である限り、入力を16進文字列として解釈します。
0入力が何か他のもので始まる場合、ます。

最初の値が2番目の値より大きい場合は何も出力しません。

選択された値:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
66 6F 72 28 24 61 3D 61 3B 24 61 2B 2B 3C 63 3B 29 24 24 61 3D 68

(実行されたコードの最初の22のASCIIコード)

または

for($a=a;$a++<c;)eval($s='$$a=hexdec($argv[++$i]);');while($b<=$c)printf("%02X ",ord($s[$b++]));

これらの値:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
24 24 61 3D 68 65 78 64 65 63 28 24 61 72 67 76 5B 2B 2B 24 69 5D 

通常、回答には<?phpチャンクが組み込まれていますか?
フィンレイメント

@fraymentではなくを使用します-r。また、ファイルに保存する必要がある場合は、短い開始タグを使用します<?
タイタス

定数azおよびProgramingPuzles_CGolf不定です。ProgramingPuzles_CGolfとにかくどこから来たの?:/
フィンレイメント

@fraymentこれらは通知です。リルートstderr/dev/nullあなたは彼らのようにドント場合。PHPは、未定義の定数を文字列に評価します。
タイタス

しかし、構文エラーとして表示されるため、プログラムを実行できません。
フィンレイメント

1

Apple II 6502アセンブリ、75バイト

バイトコード:

A9 46 85 36 A9 10 85 37 A0 00 98 20 DA FD A9 A0 
20 ED FD C0 42 D0 F3 20 93 FE A2 FC 20 1B FD 9D 
04 01 E8 D0 F7 86 31 A9 8D 8D 04 02 20 A7 FF B5 
3C 0A 75 3C 95 3C CA 10 F6 A6 3D BD 05 02 20 ED 
FD E8 E4 3C D0 F5 99 05 02 C8 60

分解:

  LDA    #<+
  STA    CSWL
  LDA    #>+
  STA    CSWH    ;redirect stdout
  LDY    #$00
- TYA
  JSR    PRBYTE  ;print number
  LDA    #$A0    ;space
  JSR    COUT    ;print space
  CPY    #$42    ;22*3
  BNE    -
  JSR    SETVID  ;restore stdout
  LDX    #$FC
- JSR    KEYIN   ;fetch a key
  STA    $0104,X ;store to $200+
  INX
  BNE    -       ;four keys
  STX    MODE    ;set internal flags
  LDA    #$8D
  STA    $0204   ;set key delimiter
  JSR    GETNUM  ;convert keys to hex values
- LDA    A1L,X   ;fetch value
  ASL
  ADC    A1L,X   ;multiply by 3
  STA    A1L,X   ;store value
  DEX
  BPL    -       ;both inputs
  LDX    A1H     ;first input
- LDA    $0205,X ;fetch from index
  JSR    COUT    ;print character
  INX
  CPX    A1L
  BNE    -       ;until second input
+ STA    $0205,Y ;fall through to save a byte
  INY
  RTS

出力のように見えるメモリ内の配列を形成します。選択された値は次のとおりです。

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
00 03 06 09 0C 0F 12 15 18 1B 1E 21 24 27 2A 2D 30 33 36 39 3C 3F

ユーザーは4つのキーを押して入力を設定します。


OoooはApple独自のコードを使用しています。とてもうまくできました。
フィンレイメント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.