Mod các phao!


19

Phần mềm mô hình 3D chủ yếu sử dụng UV Mapping để ánh xạ họa tiết lên vật thể 3D. Các giá trị hợp lệ cho cả U và V thường nằm trong một [0..1]phạm vi bao gồm .

Thử thách

Bạn đã mua một phần mềm mô hình 3D mới cực kỳ dễ sử dụng. Tuy nhiên, có một vấn đề với nó: nó cộng hoặc trừ một số nguyên ngẫu nhiên từ các giá trị UV. Nhiệm vụ của bạn là tạo ra một chương trình hoặc một chức năng sửa đổi giá trị đầu vào để có được giá trị nổi trong [0..1]phạm vi bao gồm .

Phao kết quả phải có cùng một phần phân số như bản gốc và càng gần với bản gốc càng tốt. Vì cả hai 01đều nằm trong phạm vi đầu ra, mọi số nguyên 0 trở xuống sẽ thay đổi thành 0 và mọi số nguyên 1 hoặc lớn hơn sẽ thay đổi thành 1.

Một thuật toán ví dụ trong JavaScript:

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

Quy tắc

  • Đầu vào là một số nguyên hoặc giá trị float. Bất kỳ định dạng hợp lý đều được cho phép miễn là nó được chỉ định trong câu trả lời của bạn.
  • Đầu ra phải là biểu diễn thập phân của giá trị float.
  • Độ chính xác đầu ra phải có ít nhất cùng một số thập phân như đầu vào.
  • Số không được phép.
  • Hãy chắc chắn mã của bạn chọn chính xác 0 hoặc 1 cho đầu ra số nguyên.

Các trường hợp thử nghiệm

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


4
Bạn có ý định cho 1 để ánh xạ tới 1? Thông thường một phạm vi nửa mở được sử dụng. Dựa trên mã giả của bạn, tôi có nên hiểu tất cả các số nguyên> 1 đi tới 1 và tất cả các số nguyên <0 đi đến 0>
xnor

4
Tất cả các giải pháp% 1 đều thất bại nếu đầu vào là 1!
seshoumara

9
Trên thực tế, tôi thích điều 1-> 1, nó giữ cho vấn đề không phải là một tích hợp tầm thường cho nhiều ngôn ngữ.
xnor

2
Tôi có thể sử dụng sed cho việc này không? Không có loại dữ liệu trong sed, đầu vào sẽ phải là một luồng văn bản.
seshoumara

1
@seshoumara any reasonable input format is allowed, vì vậy tôi sẽ nói "Tại sao không?".
lolbas

Câu trả lời:


1

Thạch , 6 byte

%1o>0$

Hãy thử trực tuyến!

Jelly không có Truehoặc False, nhưng sử dụng 10ở vị trí của chúng.

%1o>0$ - Main link: float v
%1     - v mod 1
     $ - last two links as a monad
   >0  -     v greater than zero?
  o    - or - replace the 0 result of the mod with 1 when v is greater than 0.

9

Python , 20 byte

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

Hãy thử trực tuyến!

Lấy modulo đầu vào 1, sau đó xử lý trường hợp biên bằng cách chuyển đổi đầu ra từ 0 thành 1 cho đầu vào dương. Một đầu ra bool sẽ tiết kiệm hai byte.

lambda x:x%1or x>0

Tôi nghĩ 1orlà phá vỡ cú pháp highlighter. (Tôi cho rằng nó được hiểu là 1 or)
12Me21

@ 12Me21 Có, và tôi chưa thấy bất kỳ công cụ tô sáng nào xử lý chính xác.
xnor


6

Brachylog , 14 11 byte

Cảm ơn Fatalize vì đã chơi golf 3 byte.

∧≜:?+.≥0∧1≥

Để thay đổi, câu trả lời này không sử dụng mod :)

Hãy thử trực tuyến!

Giải trình

∧≜                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

Đầu ra 0 này cho các số nguyên dương khi tôi thử trực tuyến.
Neil

1
@Neil đã sửa, cảm ơn bạn. Tôi không biết tại sao tôi lại bỏ lỡ nó
Leo

2
Bạn có thể lưu 3 byte như vậy : ∧≜:?+.≥0∧1≥.
Gây tử vong vào

4

JavaScript (ES6), 19 byte

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

Trong JavaScript, n%xtrả về số âm nếu nâm, nghĩa là nếu chúng ta muốn có dư lượng dương, chúng ta phải thêm xnếu nâm.(n%x+x)%xbao gồm tất cả các trường hợp:

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

Một giải pháp làm việc khác ở 20 byte, cho thấy nhiều hơn một chút về mẫu:

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

3

MATL , 9 byte

1&\0>yg>+

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Ví dụ với đầu vào 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 byte

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

Đệ quy giảm / tăng các giá trị thêm 1 cho đến khi kết quả nằm trong [0,1]


Chào mừng bạn đến với PPCG, và câu trả lời tốt đẹp!
Sản xuất ETH

2

Japt , 8 byte

u1 ªUbV1

Kiểm tra nó trực tuyến!

Tôi nghĩ rằng đây là lần đầu tiên tôi từng sử dụng b ...

Giải trình

 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

Toán học, 20 byte

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

Giải trình

Đây là một cách sử dụng khá bất thường /;khi tôi sử dụng nó giống như &&vì điều kiện sau nó không liên quan gì đến mẫu mà nó phù hợp.

#~Mod~1...

Tính toán x % 1, đó là chính xác cho tất cả các trường hợp ngoại trừ số nguyên dương.

.../. 0/;...

Thay thế số không trong biểu thức trước nếu ...

...#>0...

... đầu vào là tích cực ...

...->1...

với 1.


2

PHP, 37 byte

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

Chạy với echo <number> | php -R '<code>'.

Có rất nhiều cách để làm điều này ... đây phải là một trong những cách ngắn nhất trong PHP.

Các fmodkết quả là âm tính cho nổi tiêu cực và 0cho số nguyên dương; những điều cần điều chỉnh: !!$mđúng với số float, xored với $n>0kết quả là false cho float float và int âm, true cho float âm và int dương; +phôi mà để 1hoặc 0- thực hiện.


2

C 57 56 73 byte

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

@ Pinkfloydx33 Cảm ơn bạn đã chỉ ra!

Phiên bản bị đánh cắp:

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

Hãy thử trực tuyến!


Bạn có thể làm 1.thay vì 1.0?
Kritixi Lithos

@KritixiLithos Tôi không quen với ký hiệu đó nhưng có vẻ như nó hoạt động.
Abel Tom

Bạn có phải gọi tất cả mọi thứ fkhông? 😂 Ngoài ra tôi không nghĩ dấu ngoặc đơn (f<0)là cần thiết.
kennytm

Điều đó có thể được đơn giản hóa tôi nghĩ để không lặp lại phép trừ. Nhưng dù bằng cách nào thì nó cũng không hoạt động f(1)(sẽ trả về 1)
Pinkfloydx33

@ Pinkfloydx33 cảm ơn rất nhiều vì đã chỉ ra nó, mã đó đã không được thực hiện. :) Đã sửa nó, nên chạy tốt ngay bây giờ!
Abel Tom


1

JavaScript (ES6), 19 byte

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

Giải thích: %1không đưa ra kết quả chính xác trong mọi trường hợp:

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

Thêm 1 cần phải được thêm vào trong các trường hợp sai, đó là những số nguyên không âm và số nguyên dương. Đây là những gì biểu thức (n>0==!(n%1))tính toán.


Có một số cách sắp xếp khác, nhưng tôi chưa tìm thấy cách nào ngắn hơn ...
Sản phẩm ETH

1

> <> , 26 byte

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

Hãy thử trực tuyến!

Bởi vì các giải pháp trong ngôn ngữ chơi golf tốt hầu như luôn luôn được đưa ra ngay lập tức, tôi quyết định kết hợp mọi thứ. Đầu tiên <> <trả lời!

Giải trình

: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 <----------'

Sự thật thú vị: lời giải thích là một chương trình <> <hợp lệ!


0

Javascript, 41 28 byte

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

Math.floor() quá dài ...


n|0ngắn hơn Math.floor(tôi nghĩ nó hoạt động)
Kritixi Lithos

|0khác với floor()số âm.
12Me21

0

Bình thường, 7 byte

|%Q1s<0

Giải trình

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

Nếu bạn không phiền khi sử dụng Đúng và Sai là 1 và 0, bạn có thể bỏ s 6 byte.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.