Mod the Floats!


19

ซอฟต์แวร์การสร้างแบบจำลอง 3 มิติส่วนใหญ่ใช้การทำแผนที่ UVเพื่อทำแผนที่พื้นผิวไปยังวัตถุ 3 มิติ ค่าที่ถูกต้องสำหรับทั้ง U และ V มักจะอยู่ใน[0..1]ช่วงรวม

ท้าทาย

คุณซื้อซอฟต์แวร์การสร้างแบบจำลอง 3 มิติใหม่ซึ่งใช้งานง่ายสุด ๆ อย่างไรก็ตามมีปัญหาหนึ่งเรื่อง: เพิ่มหรือลบหมายเลขจำนวนเต็มแบบสุ่มจากค่า UV งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่ปรับเปลี่ยนค่าอินพุตเพื่อรับค่าทศนิยมใน[0..1]ช่วงรวม

ทุ่นที่เกิดขึ้นควรมีส่วนที่เป็นเศษส่วนเหมือนกับของจริงและใกล้เคียงกับของจริงมากที่สุด เนื่องจากทั้งคู่0และ1อยู่ในช่วงเอาต์พุตจำนวนเต็มใด ๆ 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;
}

กฎระเบียบ

  • อินพุตเป็นจำนวนเต็มหรือค่าลอยเดียว รูปแบบที่เหมาะสมใด ๆ ที่ได้รับอนุญาตตราบใดที่มันระบุไว้ในคำตอบของคุณ
  • ผลลัพธ์ควรเป็นตัวแทนทศนิยมของค่าลอย
  • ความแม่นยำของเอาต์พุตควรเป็นทศนิยมอย่างน้อยเดียวกันกับอินพุต
  • อนุญาตเลขศูนย์ต่อท้าย
  • ตรวจสอบให้แน่ใจว่ารหัสของคุณถูกต้องเลือกว่า 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 ไปที่ 0>
xnor

4
โซลูชัน% 1 ทั้งหมดล้มเหลวหากอินพุตคือ 1!
seshoumara

9
ที่จริงแล้วฉันชอบสิ่งที่ 1-> 1 มันช่วยป้องกันปัญหาจากการมีอยู่ภายในเล็กน้อยสำหรับหลายภาษา
xnor

2
ฉันสามารถใช้สิ่งล่อใจกับสิ่งนี้ได้หรือไม่? ไม่มีประเภทข้อมูลใด ๆ อยู่ภายในอินพุตจะต้องเป็นสตรีมข้อความ
seshoumara

1
@seshoumara any reasonable input format is allowedดังนั้นฉันจะพูดว่า "ทำไมไม่"
lolbas

คำตอบ:



9

Python 20 ไบต์

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

ลองออนไลน์!

รับอินพุต modulo 1 จากนั้นจัดการกับขอบเขตเคสโดยการแปลงเอาต์พุตเป็น 0 ถึง 1 สำหรับอินพุตบวก เอาต์พุตบูลจะบันทึกสองไบต์

lambda x:x%1or x>0

ฉันคิดว่า1orการเน้นคำเน้นข้อความผิดพลาด (ฉันถือว่ามันตีความว่าเป็น1 or)
12Me21

@ 12Me21 ใช่แล้วและฉันไม่เห็นปากกาเน้นข้อความใด ๆ ที่จัดการได้อย่างถูกต้อง
xnor


6

Brachylogขนาด14 11 ไบต์

ขอบคุณ Fatalize สำหรับการเล่นกอล์ฟ 3 ไบท์

∧≜:?+.≥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 สำหรับจำนวนเต็มบวกเมื่อฉันพยายามออนไลน์
Neil

1
@ นีลแก้ไขแล้วขอบคุณ ฉันไม่รู้ว่าทำไมฉันถึงพลาด
Leo

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

ลดซ้ำ / เพิ่มค่าซ้ำ 1 จนกว่าผลลัพธ์จะอยู่ใน [0,1]


ยินดีต้อนรับสู่ PPCG และคำตอบที่ดี!
ETHproductions

2

Japtet , 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...

คำนวณx % 1ซึ่งถูกต้องสำหรับทุกกรณียกเว้นจำนวนเต็มบวก

.../. 0/;...

แทนที่ศูนย์ในนิพจน์ก่อนหน้าถ้า ...

...#>0...

... อินพุตเป็นบวก ...

...->1...

1กับ


2

PHP, 37 ไบต์

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

echo <number> | php -R '<code>'ทำงานด้วย

มีหลายวิธีในการทำเช่นนี้ ... ควรเป็นหนึ่งในสั้นที่สุดใน PHP

fmodผลเป็นลบลอยเชิงลบและ0สำหรับจำนวนเต็มบวก การปรับความต้องการเหล่านั้น: !!$mเป็นจริงสำหรับโฟลต, xoring ที่มี$n>0ผลลัพธ์เป็นเท็จสำหรับโฟลตที่เป็นบวกและเชิงลบ int, ที่แท้จริงสำหรับโฟลตเชิงลบและบวกเชิงบวก +ปลดเปลื้องที่1หรือ0- ทำ


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?
Kritixi Lithos

@KritixiLithos ฉันไม่คุ้นเคยกับสัญกรณ์นั้น แต่ดูเหมือนว่าจะทำงาน
Abel Tom

คุณต้องโทรทุกอย่างfหรือไม่😂ฉันก็ไม่คิดว่า(f<0)จำเป็นต้องใส่วงเล็บ
kennytm

ที่สามารถทำให้ง่ายขึ้นฉันคิดว่าจะไม่ทำซ้ำการลบ แต่ไม่ว่าด้วยวิธีใดf(1)(ซึ่งควรคืนค่า 1)
pinkfloydx33

@ pinkfloydx33 ขอบคุณมากสำหรับการชี้ให้เห็นว่ารหัสนั้นยังทำไม่เสร็จ :) แก้ไขได้แล้วควรจะทำงานได้ดีตอนนี้!
Abel Tom


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))คำนวณ


มีการเตรียมการอื่น ๆ อีกหลายอย่างนี้ แต่ฉันยังไม่พบหนึ่งที่สั้นกว่า ...
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

|0แตกต่างจากfloor()สำหรับจำนวนลบ
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 คุณสามารถปล่อยs6 ไบต์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.