コンピューターの修理を先延ばしにしてください!


23

この挑戦は、本当の(そして悲劇的な)インスピレーションによってもたらされます。最近、キーボードの数字列が少し散発的になりました。キーは1-9時々機能しますが、それ以外の場合は結果がありません。熱心なプログラマーとして、これは恐ろしいことです!(その感嘆符を参照してください。それは、彼らが現在動作していることを知っている方法です。)数字自体だけでなく、記号もしばしば必要です。!@#$%^&*(半分の時間でも完全に無効です!Cプログラマーとして、ラップトップを修正するコードをいじくり回すという忙しいスケジュールから時間をとるのではなく、私はこの問題の回避にもっと興味を持っています。過去数週間にわたって、コード内の数字リテラルはすべてゆっくりと16進数に置き換えられたため、コピーして貼り付けるために数字を探し回る必要はありません。ただし、一部の数字は、キーなしでは簡単に入力できません1-9。たとえば、数字1を16進数で簡単に記述することはできません。1コード内のs をに置き換えました0xF - 0xE。影響を受けている唯一のキーがある1-9ので、私はのようなシンボルの完全な使用を維持し+-/。ただし、乗算または括弧は使用できません。*そして(、しばしば壊れています。これはあなたの挑戦につながります。

入力

n標準入力または使用言語の同等の整数。必要に応じて、整数の前または後に改行または他の空白文字を追加できます。または、コマンドライン引数を介して入力を受け取ることもできます。

プログラムは負の入力に正しく応答し、少なくとも32ビットの符号付き整数を処理できる必要があります。

出力

プログラムは、数nを1つ以上の16進値の合計、差、または除算として書き込むための、最短の(空白文字以外の)方法を、観察可能な形式で出力する必要があります。この問題を解決する方法は複数あり、同じ長さの出力を他の出力よりも優先する必要はありません。

出力の形式にする必要があり、次の16進数値である数字だけを含有し、そしてシンボルの一つです。浮動小数点ではなく、整数除算について説明しましょう。A % A % A...A0xA-F a-f%-+//

(出力nは、慣例のように、最初に左から右に除算を評価し、次に左から右に加算と減算を評価するときに結果になることに注意してください。)

テストケース

入出力

  1. 1

    0xF - 0xE(または0xF-0xEまたは0xB-0xAまたは0xd - 0xcまたは0xF/0xF

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

スコアリングとルール

これはコードゴルフです。予備スコアは、ソースファイルのバイト数です。

1-9ソースで数字を使用することはできません。

!@#$%^&*(ソースでシンボルを使用できますが、それぞれのスコアに+20のペナルティが課せられます。

プログラムはn、その関数が人間が読める形式の出力を生成する限り、引数として受け取る関数に置き換えられます。関数の戻り値は出力としてカウントされません。

標準の抜け穴は許可されていません。

最低スコアが勝ちます!がんばろう!

書式設定/質問/明確さに関して何か問題がありましたか?お知らせ下さい!これはこのサイトへの私の最初の提出です!


整数のサイズに上限はありますか?また、負の数は任意の精度(つまり32ビット)で表現されますか?
FryAmTheEggman

@FryAmTheEggman明確にするために元の投稿を編集しました。入力は負である可能性があり、プログラムは少なくとも32ビットの入力に正しく応答する必要があります。ありがとう!
BrainSteel


あなたには、いくつかのフィードバックが欲しい場合には、この私にはかなり固体スペックのように見えます、しかし、私はそれを投稿お勧めサンドボックスあなたがフィードバックを得ることができるので、(今後の課題のために)前に、あなたがメインでそれを投稿し、人々がそれで作業を開始します。
マーティンエンダー

1
整数除算または浮動小数点除算?
edc65

回答:


5

JavaScript 287(187 + 20 * 5)295(195 + 20 * 5)338(198 + 20 * 7)

6つの許可された16進数(0xA〜0xF)と3つの許可された演算子の可能なすべての組み合わせをチェックする関数。要求に応じて、ポップアップを介して出力し、値を返しません。

[]を使用してコンマ区切りの式をグループ化しましたが、ループと関数呼び出しのための5 7の開き括弧を避けることができませんでした。
数字を避けるために、1、2、3の変数A、B、Cがあります(これによりコードがさらに不明瞭になります)

'('の回避に焦点を合わせて修正された編集コードif。sの削除と明示的なRegExp作成

注意:この関数は非常に遅いため、FireFoxのスクリプトの制限時間を超えます(90などの小さな入力でも)。

考えられるすべての式を列挙するために、3から始まり、永久に上がる数値を使用します。数字エンコード:
0,1,2は演算子+、-、/
4から9は16進数A..F
3は許可されません
各数字は正規表現でチェックされ/3|[0-2]{2}/、数字3を避け、2つの連続する演算子(また、トレースおよび先行演算子を避ける-コードを参照)

結果として得られる文字列は0xA + 0xA - 0xD、有効なjavascriptのようなものなので、evalを使用して評価します。残念ながら、 '/'演算子は浮動小数点であり、JavaScriptの整数ではありません。そのため、結果が整数になる最終イベントをキャストする正しいイベントであることは100%確信できません(しかし、小さな丸め誤差が「*」で増幅される)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

他の何か

今、おかしなもの。eval呼び出しを避けるために、過度に単純化された式パーサーを使用しましたが、面白いことに、それははるかに高速であることが判明しました。

パーサーは実際に単純化されています。実際のパーサーでは、VとOは保留中の値スタックと保留中の演算子スタックを含む配列である必要があります。ここで、Vは単一の保留中の値(および戻り値)であり、Oは最大2文字の文字列です。Pには、「-+ /」=>「112」の演算子優先順位テーブルが含まれます

このスコアは275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Firefox / FireBugコンソールでテストし、リターンでアラートを変更します(さらに使いやすくなります)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA-0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + 0xF

少しわかりにくい(ただし辛抱強く)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + 0xF
51 0xDD-
0xAA 62 0xEA-0xAC
73 0xA + 0xEA-0xAB
84 0xFE- 0xAA
95 0xA + 0xFF-0xAA


3

Python 2:185バイト+ 2 * 20 = 225

深刻な答えには長すぎます。しかし、まだ答えがないので、とにかく投稿します。

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

product許可された文字のすべての異なる配置を作成します。execデコードしようとします。これは悲しいことに例外を返しますtry - catch。結果に問題がなければ、印刷して存在します。

関数呼び出し中の中括弧のため、2倍のペナルティ。


2
この答えにはいくつかの問題があります。(1)016進リテラルではありません。(2)Pythonで負の数を含む
除算
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.