North by North by North by South East


30

N、S、E、Wの文字列が与えられた場合、方位(北から時計回りの角度、度単位)を出力し、小数点以下5桁に修正します。

従来のコンパス表記、文字列は、わずか2(NNWまたはESEのような)これらの文字で構成されています。ここでは、4つすべてを含む文字列(WNNNSEなど)も受け入れる必要があります。2つのシンボルのみを使用すると、人間が意味を直感的に理解できます。4つのシンボルを許可すると読みにくくなりますが、指定された精度で方位を記述するより短い方法が許可されます。

ASはで指摘(コメントによってuser2357112、それはあなたが、私は偽の前提にこの課題に基づきまして、任意のベアリングのために、4記号列は、2記号列とまったく同じ長さになることを証明することができ判明します。この実用的な目的の欠如が、チャレンジの楽しみを損なうことはないことを願っています...)

正確な方法を以下に説明し、従来の表記法と同等です(変更するのではなく、拡張します)。

入力

  • 入力は、文字のみを含む単一の文字列NESWです。
  • 必要に応じて、入力に文字のシーケンスを使用できますが、これには前処理が含まれていません。たとえば、ネストされたリスト[N, [E, [S, [W]]]]を使用して処理の順序を支援することは許可されていません。
  • 異なるキャラクターを使用することは許可されていません。の1234代わりにの文字列を使用することはできませんNESW

出力

  • 出力は、10進数または1のストリング表現でなければなりません(有理数/分数ではありません)。
  • 末尾のゼロを表示する必要はありません。方位がの場合、9.00000出力9は小数点以下5桁まで正しいものとしてカウントされます。
  • 出力の範囲は[0、360)です。つまり、0を含むが360は除外されます。
  • 出力が小数点以下5桁に丸められることにより、正当性がチェックされます。ベアリングが0.000005の場合、これは0.00001に丸められます。出力0.00001と0.000005は両方とも正しいです。
  • 一部の入力については科学表記法での出力が許容されます。たとえば、の1e-5代わりに0.00001

変換

  • 単一文字コンパスポイントNES、及びW対応する0°、90°、180°、及び270°夫々 。
  • これらのいずれかを文字列の前に付けると、単一文字の方位と元の文字列の方位を二分する方位になります。
  • NEが225度ではなく45度を表すように、2つの可能な二等分軸受のうち最も近いものが選択されます。
  • これは、二分される角度が180度である場合を除いて明確です。したがってNSSNWE、及びEW不定ベアリングに対応し、入力は、これらのいずれかで終わることはありません。ただし、これらはあいまいさを引き起こさないため、入力文字列の他の場所に表示される場合があります。
  • 最後の2つの文字が同一である場合、2分割が同じ方位を返すため、最後の文字は冗長になります。これは表記に何も追加しないため、コードでこれを処理する必要はありません。したがってNNEESS、及びWW不定ベアリングに対応し、入力は、これらのいずれかで終わることはありません。ただし、入力文字列の他の場所に表示される場合があります。

N: 0
E: 90
S: 180
SE: halfway between S and E: 135
NSE: halfway between N and SE: 67.5
NNSE: halfway between N and NSE: 33.75
NNNSE: halfway between N and NNSE: 16.875
NNNNSE: halfway between N and NNNSE: 8.4375

テストケース

提出は、すべてのテストケースに対して正しい出力を提供する場合にのみ有効です。テストケースは、倍精度で処理できる範囲に限界があることに注意してください。デフォルトで単精度になっている言語では、正しい出力を得るために、おそらくバイトを使用して倍精度を指定する必要があります。

テストケースの出力は、小数点以下5桁に丸められ、任意の精度で表示されます。両方とも有効な出力です。

WNE 337.5 337.5
WEN 337.5 337.5
WEWEWEWEWEWEWEWEWEWEWEN 330.00001 330.000007152557373046875
NESWNESWNESWNESWNESWNESWNESW 90 89.99999932944774627685546875
NNNNNNNNNNNNNNNNNNNNNNNE 0.00001 0.0000107288360595703125
NNNNNNNNNNNNNNNNNNNNNNNW 359.99999 359.9999892711639404296875
SNNNNNNNNNNNNNNNNNNNNNNNE 90.00001 90.00000536441802978515625
SNNNNNNNNNNNNNNNNNNNNNNNW 269.99999 269.99999463558197021484375

得点

これはです。スコアは、バイト単位のソースコードの長さであり、最短が勝ちです。


衒学

私は、「North by North West」が有効なコンパスの方向だと考えて間違えました。それは挑戦のアイデアにつながったが、私は、その後から発見されたので、幸せな間違いは、ウィキペディアのページ

「アルフレッド・ヒッチコック1959映画のタイトル、北北西に進路を取れは、実際に32風のコンパスの方向点ではなく、映画にはノースウエスト航空への言及が含まれています。」

また、このチャレンジに使用される方法は、16ポイントコンパスまでの従来のコンパスポイントとのみ一貫していることがわかります。そのページで説明されている32風のコンパスは微妙に異なっており、この挑戦​​のためにその存在を都合よく見落としていました。

最後に、「South East」の代わりに「Southeast」を使用する必要があると考える人には、


WNNNSE<=投稿開始時のこのエントリ例の出力はどうなりますか?私には無効に聞こえますが、それを伝えるのは難しいです。
テンシバイ

@Tensibai入力の場合WNNNSE、出力はになります323.4375。この場合に同じ方法で適用されるウォークスルーについては、例のセクションを参照してください。
trichoplax

入力はf(N,N,N,S,E)大丈夫ですか?
カールナップ

@KarlNapf入力セクションを拡張して明確にしました。私が正しく理解している場合、複数の引数を使用した入力例は文字のシーケンスと同等であるように見えるため、受け入れられます。
trichoplax

2
「4つのシンボルを許可すると、読むのが恐ろしくなりますが、特定の精度で方位を記述するより短い方法が許可されます。-本当によろしいですか?同じ方位を記述するすべての入力は同じ長さを持っているようです。各方位に0から1の二項有理数を割り当てると、N> 1の長さNの文字列は常に分母2 ^(N +1)最低条件。また、ベアリングに2つ以上の異なる文字を許可しても、表現力は追加されません。3つのまたは4文字で表さ任意軸受2と表すことができる
user2357112支持モニカ

回答:


13

JavaScript(ES6)、84 80 78 74 72バイト

@Titusのおかげで1バイト、@ Neilのおかげで1

f=([c,...s],b="NESW".search(c))=>b*90-(s[0]?(b-=f(s)/90)-4*(b*b>4):0)*45

しばらく時間がかかりましたが、ようやく式が完成しました...

テストスニペット

説明

最も単純なケースから始めましょう。単一文字の文字列です。結果は、単に文字列内の(0から始まる)位置にNESW90を掛けたものです。

2文字の文字列の場合、結果は最初の文字の結果と2番目の文字の結果の中間にあります。ただし、キャッチがあります。2つの間の絶対差が180より大きい場合(NWまたはWN)、反対方向を向かないように角度を180にする必要があります。

長い文字列の場合、結果は最初の文字の結果と文字列の残りの結果の中間にあります。これは、次の方法で一般化できます。

  • 入力が単一の文字である場合、文字列のインデックスにNESW90を掛けた値を返します。
  • それ以外の場合は、文字列の最初の文字のインデックスにNESW45を掛けた値に、文字列の残りの結果の半分を加えた値を返します。2つの絶対差が90を超える場合は、180を追加します。

文字列から最初の文字を切り取る優れた方法!あなたは45で割った値で計算する場合は、1つのバイトを保存することができます
タイタス

@Titusその手法で2バイト節約できます、ありがとう!
ETHproductions

1
searchindexOfバイトを節約する代わりに。
ニール

@Neilありがとうございます!方程式を完全に並べ替えることで、さらに3回ゴルフをすることができました。
ETHproductions

10

C#6、226 217 207 185バイト

using System.Linq;double N(string s){double b=f(s.Last());foreach(var c in s.Reverse()){b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0))/2;b=(b+4)%4;}return b*90;}int f(char x)=>"NESW".IndexOf(x);

編集:ETHproductionsのサブミッションからアイデアを「借りる」ことで-10バイト@Titusの
おかげで-22バイト

非ゴルフ

// Call this method
double N(string s){
    // Initialize bearing with last direction
    double b=f(s.Last());
    // Do backward. Doing last direction once more doesn't impact result
    foreach(var c in s.Reverse()){
        // Average current bearing with new bearing, adjusted with wrapping
        b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0))/2;
        // Make bearing back to range [0,4)
        b=(b+4)%4;
    }
    // Change from "full circle = 4" unit to degree
    return b*90;
}
// helper method to convert direction to bearing. This returns bearing with full circle = 4.
int f(char x)=>"NESW".IndexOf(x);

trichoplax

@trichoplax小数点以下は切りませんか?
タイタス


1
b=(b+360)%360;代わりに10バイト節約しますb+=b>360?-360:b<0?360:0;。すべてを90とで割って、さらに12バイトを節約しますreturn b*90;
タイタス

1
さらに10バイトあります:2つの割り当てをマージし、ブレースを削除します。b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;その後+8、3進結果に分配しますb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
Titus

8

PHP、95の 88 86 100 127 104 101バイト

  • ヌル合体演算子を使用した-7バイト
  • -2バイトを置換しないNことにより(さらに、ループヘッドに変換を配置できるため:Nさらに、0計算では評価されます)
  • 分割()を修正するための+41バイト
  • @ETHproductionsのコードから直接インスパイアされた-7バイトと間接的に-16バイト
  • strtr私のビットジャグリングの1つに置き換えることで-3バイト

for($i=strlen($s=$argv[1]);$i--;$p=($q+$p=$p??$q)/2+2*(abs($q-$p)>2))$q=ord($s[$i])/.8+3&3;echo$p*90;

ヌル合体演算子を使用するのは、これが公式に初めてです。で実行し-rます。

PHP 7.1

今後のPHPのバージョンでの負の文字列のオフセットは12のバイトが保存されます:
元に戻しstrlen($s=$argv[1])0$sして$argv[1]


(ほぼ)全員の空きバイト:

  • 0,1,2,3の代わりに、0,90,180,270で計算し、2つのバイトを保存します90で、最終的な結果を乗算し、おそらく、さらにゴルフを許します。
  • 文字のASCIIコードにはいくつかのパターンがあります。あなたの言語でこれらのいずれかを試してください:
    • (a/2%6+2)%5
    • a<87?a/2&3^3:3 または a/2&3^3*(a<87)
    • a&1?a&2|a/4&1:0
    • a/.8-1&3

5

Python 3、133 113バイト

このアカウントを作成したばかりで、まだコメントを作成できないため、@ L3viathanの回答を改善するだけです。

d={"N":0,"E":.5,"S":1,"W":1.5}
def B(s):
 b=d[s[-1]]
 for c in s[::-1]:b=(b+d[c])/2+(abs(b-d[c])>1)
 return b*180

プログラミングパズルとコードゴルフへようこそ、そして素晴らしい改善
...-trichoplax

私はあなたの答えを見ませんでしたが、タイタス​​は同様のアイデアを持っていた、と私は別のものを持っていた、私は今98になっています:)
L3viathan

5

05AB1E48 42 37 32バイト

Emignaのおかげで6バイト節約されました。範囲[0,4 [で動作し、最後に90を掛けるというTitusのアイデアのおかげで5バイト節約されました。アドナンの古代のxor / modulo変態の習得により5バイト節約されました。

したがって、すべての角度は、実行中に範囲[0,360 [から範囲[0,4 [に減少します。その後、結果に90が乗算されて表示されます。

Ç30^5%R¬U¦vXy+;DX-Ä0›2*+4%U}X90*

It can be divided into two sequentially called subprograms.
First program: convert input string into an array of the corresponding angles in range [0,4[
Ç      Take the ascii value of all input characters
 30^5% Dark ascii manipulation that yields [0,1,2,3] for [N,E,S,W]

Now we have an array of integers in range [0,4[.

Second program: actually compute the final angle
R                          Reverse the array
 ¬                         Take the first value (the last of the non-reversed array)
  U                        Pop it from the stack and set X to the same value
   ¦                       Strip the first element
    v                      For each remaining element
     Xy+;                  Compute the average value between the leftmost value and X
         DX-Ä0›            Push 1 if angular distance cast to integer is > 0 (i.e. if it is >= 1), 0 otherwise. It's equivalent to checking >= 90 degrees
               2*+         Multiply by 2 (=2 if angular distance is >= 1 and 0 otherwise) and add it to the formerly computed average value. It's equivalent to multiplying by 180
                  4%       Perform mod 4. It's equivalent to performing mod 360
                    U      Store the result back to X
                     }     End for, mandatory if input has only one character
                      X90* Push X*90 and implicitly display it

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

ゴルフの潜在的な軸:

  • そのmod 4が必要かどうかわかりません(2バイト節約できます)。すべてのテストケースはそれなしでも機能しますが、トリッキーなケースが存在する可能性があります。それを検証するか無効にするかの数学的な証明は一流でしょう。
  • 結果を表示する以外に暗黙的なものはありません(閉じ引用符、閉じ括弧)。

1
NNNNNNNNNNNNNNNNNNNNNNNEおよびSNNNNNNNNNNNNNNNNNNNNNNNEテストケースで要求された結果が得られないようです。
エミグナ

2
奇妙な。今私もそうです。間違ったものを貼り付けたに違いない、ごめんなさい。コードをに短縮できv"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}Xます。
エミグナ

1
素晴らしい説明!89›実際に整数部分が89より大きいことを意味するメモを含める価値があります。これは、完全な数が90 以上であると言うことと同じです(正確に90は発生しないため正常に機能します)。現在、説明されているコードのコメントは、89を超えているかどうかをチェックしているように聞こえますが、コードはテストケースに合格しているため、明らかに90を超えているかどうかを正しくチェックしています。
センモウヒラムシ

1
説明を編集しましたが、負の浮動小数点値に対して演算子がどのように振る舞うべきかわからないため、「整数にキャスト」を作成しました。絶対値で機能するため、ここでは問題はありませんが、演算子についてあまり強い仮定を立てないことを好みます。

1
あなたは置き換えることができv"NESW"yk})Ç30^5%:)
アドナンを

5

Pythonの3、146 145 117 107 97 94の 93の 92バイト

f(s):u='NESW'.find(s[0])*90;return(u+f(s[1:]))/2+180*(abs(u-‌​f(s[1:]))>180)if s[1:]else u

f文字列で呼び出します。


...0elseSyntaxErrorをスローする2つを持つことはできません。
ジョナサンアラン

@JonathanAllan使用しているPythonのバージョンは何ですか?3.5.2を使用していますが、動作します。
L3viathan

あなたが間にスペースを削除することができます-私は3.3.3でそれを実行elseし、-あまりにも?(3.3.3で可能)
ジョナサンアラン

@JonathanAllanはい、できます!おかげで、もう1バイト節約できます。
L3viathan

2
@Titus d.findができること、私は1分前に​​正確なアイデアを持っていました。更新された回答を参照してください。
L3viathan

5

C、184バイト

double h(char c){return ((c=='E')+(c=='S')*2+(c=='W')*3);}double d(char*s){double f=h(*s);if(s[1]){double t=f;f=(f+d(s+1)/90)/2;if(((t-f)>1)||((f-t)>1))f+=2;if(f>=4)f-=4;}return f*90;}

非ゴルフ

// a helper function
double direction_(char ch)
{
    if (ch=='N')
        return 0.;
    else if (ch=='E')
        return 90.;
    else if (ch=='S')
        return 180.;
    else
        return 270.;
}

// this is the main function to call
double direction(char* str)
{
    double fAngle = direction_(str[0]);
    if (str[1])
    {
        double tmp = fAngle + direction(str+1);
        if (tmp>=360.)
            tmp-=360.;
        tmp/=2;

        if (((tmp-fAngle)>90.) || ((tmp-fAngle)<-90.))
        { //  check if we need to take the "other side"; if the resulting angle is more than 90 degrees away, we took the wrong on
            if (tmp>=180.)
                tmp-=180.;
            else
                tmp+=180.;
        }
        fAngle = tmp;
    }
    return fAngle;
}

フロートを使用すると、必要な精度が得られないようです。
エアルレフ

4
PPCGへようこそ!:D
mbomb007

関数の名前が互いに競合することはありません(名前は両方とも dませんか)?
clismique

@qwerp、異なる署名(1つはchar *を取り、もう1つはcharのみを取ります)
Eyal Lev

2
関数名は、C ++のようにCでマングルされた名前ではないため、Cにしたい場合は、いずれかの名前を変更する必要があります。
KLASLindbäck

3

R、172 146バイト

z=rev((0:3*90)[match(scan(,""),c("N","E","S","W"))]);p=z[1];l=length(z);for(i in 2:l)p=(p+z[i])/2+(abs(p-z[i])>180)*180;if(l<2)p=z;sprintf("%f",p)

非ゴルフ

z=rev((0:3*90)[match(scan,""),c("N","E","S","W"))]); #1
p=z[1];                                              #2
l=length(z)                                          #3
for(i in 2:l)p=(p+z[i])/2+(abs(p-z[i])>180)*180;     #4
if(l<2)p=z                                           #5
sprintf("%f",p)                                      #6

説明した

  1. stdinから入力を読み取る
    • 入力をインデックスで一致させる c("N","E","S","W")
    • 一致したインデックスから:度のベクトルに一致します0:3*90(代わりにc(0,90,180,270)
    • 逆にして保存 z
  2. p入力の最後の文字に相当する程度に初期化する
  3. 入力の長さとして l
  4. 繰り返し、2つの可能な二等分軸受の中で最も近いものを計算します。
  5. 入力が1つだけの場合、設定 pしますz
  6. フォーマットと印刷

R-fiddleでテストケースを試してみてください (これはscanR-fiddleで動作しないため、機能であることに注意してください)


出力が小数点以下5桁まで正しい場合は、丸めを実行する必要はありません。チャレンジから:Outputs 0.00001 and 0.000005 are both correct.したがって、丸めないことでいくつかのバイトを節約できるはずです
-trichoplax

@trichoplaxわかりました。入力は、次のような文字列文字のベクトルにもできますか?c("N","N","E")代わりに"NNE"?これは、ネストされていないpython listと同等["N","N","E"]です。
ビリーウォブ

はい。「シーケンス」は、配列、ベクトル、リスト、タプルなどを含む一般的な用語であることを意図していました。
-trichoplax

1
すべてを90とprintf(p * 90)で除算すると、4バイト節約できると思います。
タイタス

3

Haskell、109105103バイト

h=180
a#b|abs(a-b)<h=n|n>h=n-h|1>0=n+h where n=(a+b)/2 -- calculates the new "mean" on the cirlce
f 'N'=0                                          -- translates characters to angles
f 'E'=90
f 'S'=h
f _=270
foldr1(#).map f                                  -- traverses the whole string

-2バイト@xnorをありがとう!


の完全なリストfは長く見えますが、もっと短いものを見つけるのに苦労しています。一番近いのはf c=90*until(\i->"NESW"!!i==c)(+1)0(35)です。私はあなたが交換することができると思います'W'_
xnor

ええ、もっと短いものがあると思っていましたが、何も見つかりませんでした。をありがとう_
flawr

3

Dyalog APL55 45 38 バイト

溶液

が必要⎕IO←0です。これは多くのシステムでデフォルトです。方向を尋ねます。

360|÷○÷180×12○(+÷(|+))/¯12○○2÷⍨'NES'⍳⍞

説明

複素数1∠に各文字を変換することによって、問題を一周θ A + iのA・B各ステップで正規化しながら、右から左からの和の減少(APLの強みを)やって、。次に、最終的なθは度に変換され、[0、360)以内に正規化されます。

'NES'⍳⍞「NES」の各入力文字のインデックス。N→0、E→1、S→2、その他のすべて→3

○2÷⍨ラジアン単位の角度に変換します。θ = π x 2

¯12○ 単位円上の複素数に変換します。 e i・θ

(...)/リストを縮小します(つまり、...の要素の間に関数を挿入します)

+÷(|+)...正規化された合計。x n -1 + x n| x n -1 + x n |

12○ 角度に変換; θ

÷○÷180×度に変換します。1 / π1 / 180・X

360| 360で除算したときの除算余り

TryAPLオンライン!

逸話

入力と出力が直交する複雑な単位である場合、ソリューション全体は次のようになります。

(+÷(|+))/

コードの残りの部分は、入力の解析と出力のフォーマットです。


テスト出力は、チャレンジの出力と小数点以下5桁が一致しないため、これは無効になります。Dyalog APLには倍精度を使用するオプションがありますか?
trichoplax

@trichoplaxはい、⎕FR←1287128ビットの浮動小数点数を使用しますが、TryAPLでは使用できません。
アダム

64ビット以上の浮動小数点数であれば動作するはずです(ただし、Pythonでしかテストしていません)。これは、コードを有効にできるが、その言語をインストールした人にしか機能しないという意味ですか?スコアの完全な有効なコードを表示し、アルゴリズムが正しいことを人々が確認できるように、必要な精度を十分に備えていないオンラインバージョンを含めることができます。
-trichoplax

@trichoplax実際、TryAPLは倍精度を使用しますが、テストケースは53ビットを超えるエラーを蓄積します。
アダム

違いがIEEE 754標準の解釈の違いによるものであり、まだ標準に準拠していることがわかる場合は、テストケースを調整して、両方の解釈で小数点以下5桁まで同じ結果が得られるようにします。Pythonの浮動小数点(倍精度)と任意精度の小数の両方で小数点以下5桁まで同じ結果が得られるように、テストケースを選択しました。私はそれを見ていきます。
trichoplax

2

Common Lisp、347 327バイト

@Titusに感謝します

これはおそらくもっとゴルフすることができますが、少なくともそれはうまくいきます(私は思う):

(defun d(c)(if(eql c #\N)0(if(eql c #\E)1(if(eql c #\S)2(if(eql c #\W)3)))))(defun m(a b)(if(> a b)(rotatef a b))(if(<(+(- 4 b)a)(- b a))(+(/(+(- 4 b)a)2)b)(+(/(- b a)2)a)))(defun f(s)(let((c))(setf c(d(char s(1-(length s)))))(do((a)(p(-(length s)2)(1- p)))((< p 0))(setf a(char s p))(setf c(m(d a)c)))(format t"~5$"(* c 90))))

使用法:

* (f "WNE")
337.50000
NIL

この関数はd、文字を取りNEW、またはS、適切な度合いを返します。関数mは、与えられた2つの方向の適切な結合度を取得します。関数fは、指定された文字列を反復処理し、適切な次数を計算して、浮動小数点として出力します。


私のLISPは錆びていますが、すべてを90で割ると6バイト節約できますか?
タイタス

@タイタスそれはそう思う。私は自分のコンピュータでいる時、私はこれを追加しますので、私は他のいくつかの改善を実現してきました
artificialnull

2

Befunge、 183 181 175バイト

>~#+:#25#%6*#/`#2_$>5%4*:00p"Z}"4*:***20g#v_+2/00g10g-:8`\0\-8`+!v
v5:+*:*:"d"/+55+5$_^#!:\p01/**:*4"}Z":p020<%**:*"(2Z"+**5*:*"0}"!<
>5>+#<%#56#58#:*#/+\#5:#5_$$$,,,".">:#,_@

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

説明

これは他の多くの回答と同様のアルゴリズムに従いますが、Befungeは浮動小数点をサポートしていないため、整数でエミュレートされた固定小数点計算のみを使用しています。

おかげで ASCII-to-intルーチンの@Titusにます。

 ~ : 5 6* ` _$        while ((c = getchar()) > 30)  // ends with any ctrl char or EOF
> + 2 %6 / 2            push(c / 2 % 6 + 2)         // partial conversion to int

                      do {
  5%                    dir = pop() % 5             // completes the conversion to int   
  4*:00p                dir *= 4; lowres_dir = dir  // used by the 180-flip calculation
  "Z}"4*:***            dir *= 22500000             // this is 90000000 / 4 
  20g_                  if (!first_pass) {
    +2/                   dir = (dir+last_dir)/2    // last_dir is second item on stack
    00g10g-               diff = lowres_dir - last_lowres_dir
    :8`\0\-8`+!!          flip = diff>8 || -diff>8
    "}0"*:*5**+           dir += flip * 180000000   // add 180 degrees if we need to flip
    "Z2("*:**%            dir %= 360000000          // keep within the 360 degree range
                        }
  020p                  first_pass = false
  :"Z}"4*:**/10p        last_lowres_dir = dir / 22500000
  \                     last_dir = dir              // saved as second item on stack
  :!_                 } while (!stack.empty())

$                     pop()                         // this leaves the final dir on top
5+55+/                dir = (dir + 5)/10            // round down to 5 decimal places
"d":*:*+              dir += 100000000              // add a terminating digit
                      while (true) {                // convert into chars on stack
:55 + % 6 8 * +\ : _    push(dir%10+'0'); if (!dir) break
   > < 5 5 : /+ 5 5     dir /= 10
                      }

$$$                   pop() x 3                     // drop the chars we don't need
,,,                   putchar(pop()) x 3            // output first three chars
"."                   push('.')                     // add a decimal point
>:#,_@                while(c=pop()) putchar(c)     // output the remaining chars

それは単に、より大きな固定小数点型(小数点以下の桁数)をエミュレートする必要があるということですか?テストケースは、有効数字が17桁(最大16桁)である倍精度を必要とするように設計されており、小数点以下14桁で十分な場合があります。
センモウヒラムシ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.