フロートをモッズ!


19

3Dモデリングソフトウェアは、主にUVマッピングを使用してテクスチャを3Dオブジェクトにマッピングします。UとVの両方の有効な値は、通常、包括的[0..1]範囲にあります。

チャレンジ

非常に使いやすい新しい3Dモデリングソフトウェアを購入しました。ただし、1つの問題があります。UV値からランダムな整数を加算または減算します。あなたの仕事は、入力値を変更して包括的な[0..1]範囲の浮動小数点値を取得するプログラムまたは関数を作成することです。

結果のフロートは、元と同じ小数部分を持ち、可能な限り元に近いはずです。両方のため01出力範囲にある、以下の任意の整数0又は0に変更する必要があり、任意の整数1以上を1に変更しなければなりません。

JavaScriptのアルゴリズムの例:

function modFloat(input) {
    while (input < 0 || input > 1) {
        if (input < 0) input += 1;
        if (input > 1) input -= 1;
    }
    return input;
}

ルール

  • 入力は単一の整数または浮動小数点値です。回答で指定されている限り、任意の合理的な形式が許可されます。
  • 出力は、float値の10進表現でなければなりません。
  • 出力精度は、少なくとも入力と同じ小数点以下である必要があります。
  • 末尾のゼロは許可されます。
  • 整数入力に対して出力するコードを0または1のいずれかが正しく選択していることを確認してください。

テストケース

Input       | Output
------------+---------
         -4 | 0
         -1 | 0
          0 | 0
          1 | 1
          2 | 1
     1.0001 | 0.000100
 678.123456 | 0.123456
-678.123456 | 0.876544
        4.5 | 0.5

これはなので、バイト単位の最短コードが勝ちです!


4
1を1にマッピングするつもりですか?通常、半開範囲が使用されます。あなたの擬似コードに基づいて、私はすべての整数> 1から1行くと、すべての整数を<0 GO TO 0>理解しておく必要があります
XNOR

4
入力が1の場合、すべての%1ソリューションが失敗します!
seshoumara

9
実際、私は1-> 1の事が好きです。それは問題が多くの言語の些細なビルトインになるのを防ぎます。
XNOR

2
これにsedを使用できますか?sedにはデータ型がありません。入力はテキストストリームでなければなりません。
seshoumara

1
@seshoumara any reasonable input format is allowedので、「なぜ?」と言うでしょう。
lolbas

回答:



9

Python、20バイト

lambda x:x%1or+(x>0)

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

1を法とする入力を受け取り、正の入力に対して0の出力を1に変換することにより境界ケースを処理します。bool出力は2バイトを節約します。

lambda x:x%1or x>0

1orシンタックスハイライターを壊していると思います。(私はそれは次のように解釈されますと仮定1 or
12Me21

@ 12Me21はい、正しく処理する蛍光ペンを見たことはありません。
XNOR


6

Brachylog14 11バイト

ゴルフ3バイトのFatalizeに感謝します。

∧≜:?+.≥0∧1≥

変更の場合、この回答ではmodを使用しません:)

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

説明

∧≜                Label an integer variable. This will start trying different
                  values for this variable, the ones closest to 0 first.
   :?+.           This variable summed to the input is equal to the output
      .≥0∧1≥      which is >= 0 and <= 1

オンラインで試してみると、この出力は正の整数に対して0です。
ニール

1
@Neil修正、ありがとうございます。なぜ逃したのかわからない
レオ

2
3バイトをそのまま保存できます∧≜:?+.≥0∧1≥
致命的

4

JavaScript(ES6)、19バイト

n=>(n%1+1)%1||n>0|0

JavaScriptではn%x、負の場合nは負の数を返します。つまり、正の剰余を取得するx場合nは、負の場合に加算する必要があります。(n%x+x)%xすべてのケースをカバー:

n     n%1   n%1+1 (n%1+1)%1
0     0     1     0
1     0     1     0
2.4   0.4   1.4   0.4
-1    0     1     0
-2.4  -0.4  0.6   0.6

20バイトの別の実用的なソリューションは、もう少しパターンを示しています。

n=>n%1+(n%1?n<0:n>0)

3

MATL、9バイト

1&\0>yg>+

オンラインでお試しください!または、すべてのテストケースを確認します

説明

入力のある例 678.123456

1      % Push 1
       % STACK: 1
&\     % Implicit input. Divmod with 1
       % STACK: 0.123456, 678
0>     % Is it positive?
       % STACK: 0.123456, 1
y      % Duplicate from below
       % STACK: 0.123456, 1, 0.123456
g      % Convert to logical: nonzero becomes 1
       % STACK: 0.123456, 1, 1
>      % Greater than? This is true if fractional part of input was zero
       % and non-fractional part was positive
       % STACK: 0.123456, 0
+      % Add. Implicitly display
       % STACK: 0.123456

3

Javascript、28バイト

m=f=>f<0?m(f+1):f>1?m(f-1):f

結果が[0,1]になるまで、値を1ずつ再帰的に増減します。


PPCGへようこそ、そしていい答えです!
ETHproductions

2

Japt、8バイト

u1 ªUbV1

オンラインでテストしてください!

私がこれを使用したのはこれが初めてだと思いますb...

説明

 u1 ªUbV1  // Implicit: U = input, V = 0
Uu1        // Take U%1, but add 1 if U is negative. This is equivalent to %1 in Python.
    ª      // If the result is falsy (0), instead take
     UbV1  //   U bound between 0 and 1.
           // This converts positive integers to 1, zero/negative integers to 0.
           // Implicit: output result of last expression

2

Mathematica、20バイト

#~Mod~1/. 0/;#>0->1&

説明

これは、/;私がそれを使用している場所のかなり珍しい使用です。&&なぜなら、その後の条件は、一致するパターンとは何の関係もないからです。

#~Mod~1...

Compute x % 1。正の整数を除くすべての場合に正しい。

.../. 0/;...

次の場合、前の式のゼロを置き換えます...

...#>0...

...入力は正です...

...->1...

1


2

PHP、37バイト

<?=($m=fmod($argn,1))+(!!$m^$argn>0);

で実行しecho <number> | php -R '<code>'ます。

これを行うには多くの方法があります...これはPHPで最も短いものの1つです。

fmod結果は、負のフロートのため、負である0正の整数のために、これらは調整!!$mが必要です。フロートの場合はtrue、$n>0正のフロートおよび負のintの場合はfalseになるxoring 、負のフロートおよび正のintの場合はtrue。またはに+キャスト-完了。10


2

C 57 56 73バイト

b;f(float n){b=n;printf("%f",((!(n-b)&&n<=0)?0:n<0?1.+n-b:(n-b)?n-b:1));}

@ pinkfloydx33指摘してくれてありがとう!

ゴルフされていないバージョン:

f(float n)
{
  int b=n;
  printf("%f",( (!(n-b)&&n<=0)?0:n<0?1.+n-b:(n-b)?n-b:1) );
}

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


1.代わりにできます1.0か?
クリティキシリトス

@KritixiLithos私はその表記法に精通していませんが、うまくいったようです。
アベルトム・

すべてを呼び出す必要がありますfか?また、かっこ(f<0)は必要ないと思います。
ケニー

これは単純化でき、減算を複製しないと思います。しかし、どちらの場合でも機能しませんf(1)(1を返すはずです)
pinkfloydx33

@ pinkfloydx33指摘してくれてありがとう、そのコードはまだ完成していませんでした。:)それを修正しました。
アベルトム


1

JavaScript(ES6)、19バイト

n=>(n>0==!(n%=1))+n

説明:%1すべての場合に正しい結果が得られるわけではありません:

input       %1          output
-ve int     -0
-ve frac    -ve frac    +ve frac
0           0
+ve frac    +ve frac
+ve int     0           1

間違っている場合は、余分な1を追加する必要があります。これは、負の非整数と正の整数の場合です。これは式が(n>0==!(n%1))計算するものです。


そこにはいくつかのこの他の配置がありますが、私はまだ短いです1 ...見つかっていない
ETHproductions

1

> <>、26バイト

:1%:?vr1(?v1n;
     >n;n0<

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

優れたゴルフ言語のソリューションはほとんどの場合即座に与えられるため、私は物事を混同することにしました。最初の<> <回答!

説明

:1%:?vr1(?v1n;    Assume input i in stack
     >n;n0<

:                 Duplicate i (need it if i%1 != 0)
 1                Push 1
  %               Pop i and 1, push i%1
   :              Duplicate top of stack because  we need one for the if     
    ?v            If i%1 != 0 ------------------------,
      r           Reverse stack so that i is TOS      | 
       1(?v       If i > 0 (not < 1)                  |
           1n;      Print 1 and Exit                  |
                  Else                                |                   
        n0<         Print 0 and --,                   |
     >n           Print n <-------|-------------------'
       ;          Exit <----------'

楽しい事実:説明は有効な<> <プログラムです!


0

Javascript、41 28バイト

n=>n-Math.floor(n)+(n<<0==n)

Math.floor() とても長い...


n|0短くなっているMath.floor(私はそれがうまくいくと思う)
KritixiのLithos

|0floor()負の数の場合とは異なります。
12Me21

0

Pyth、7バイト

|%Q1s<0

説明

|%Q1s<0
|%Q1s<0Q      Implicitly add input
 %Q1          Input mod 1
|             Short-circuting or
    s<0Q      1 if input is positive, 0 otherwise

TrueとFalseを1と0として使用してもかまわない場合はs、6バイトを削除できます。


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