Bitflip และลบล้าง


42

กำหนดจำนวนเต็มทำนิพจน์ที่สร้างจากการ0ใช้การปฏิเสธแบบไม่รวม-และส่วนประกอบ bitwise ~( ~n= -n-1) โดยใช้ตัวดำเนินการจากขวาไปซ้าย

...
-3  = ~-~-~0
-2  = ~-~0
-1  = ~0
 0  = 0
 1  = -~0
 2  = -~-~0
 3  = -~-~-~0
...

การแสดงออกของคุณจะต้องสั้นที่สุดเท่าที่เป็นไปได้ซึ่งหมายความว่าไม่มีชิ้นส่วนที่ซ้ำซ้อน~~, --, หรือ-0 00เอาต์พุตหรือพิมพ์นิพจน์เป็นสตริงหรือลำดับของอักขระ


11
ดังนั้น ... คุณต้องการให้เราวางของลงและพลิกมันหรือไม่
จอร์แดน

1
ช่องว่างระหว่าง ~ และ 0 อนุญาตหรือไม่
อดัม

ไม่ส่งออกสตริงอย่างแน่นอน
xnor

2
บังคับxkcd.com/153
Jared สมิ ธ

คำตอบ:


17

Python ขนาด 32 ไบต์

lambda x:("-~"*abs(x))[x<0:]+"0"

ฟังก์ชั่นแลมบ์ดานิรนาม กำหนดจำนวนเต็ม x เขียน "- ~" abs (x) ครั้งและลบอักขระตัวแรกถ้า x เป็นค่าลบศูนย์จะถูกเพิ่มไปยังจุดสิ้นสุด


อ๊ะเอาชนะข้าไปเลย
mbomb007

ฉันเขียนเดียวกันด้วย - กับnในสถานที่xและ'ในสถานที่ของ":)
โจนาธานอัลลัน

2
@JanathanAllan จากนั้นคุณสามารถพิจารณามันได้อย่างปลอดภัยล่อลวง
Erik the Outgolfer

16

JavaScript (ES6), 33 31 ไบต์

f=x=>x<0?"~"+f(~x):x&&"-"+f(-x)

การเรียกซ้ำ <built-ins <ลูป (อย่างน้อยในกรณีนี้) โดยทั่วไปจะประเมินค่าอินพุต:

  • ถ้ามันน้อยกว่า 0 ให้พลิกมันและเพิ่ม a ~เข้าไปในสตริง;
  • ถ้ามันมากกว่า 0 ลบล้างมันและเพิ่ม a -เข้ากับสตริง;
  • ถ้ามันคือ 0 ทั้งหมดคืน 0

ใช้ประโยชน์จากรูปแบบนี้:

 0         = 0
-1 = ~( 0) = ~0
+1 = -(-1) = -~0
-2 = ~(+1) = ~-~0
+2 = -(-2) = -~-~0
-3 = ~(+2) = ~-~-~0
+3 = -(-3) = -~-~-~0
etc.

11

Pyth, 14 13 12 ไบต์

_<>0Q+0sm"~-

-2 ไบต์ขอบคุณ @StevenH

ชุดทดสอบ

ตัดสินใจลองใช้ Pyth ดังนั้นฉันจึงแปลคำตอบของหลามออกมา ยินดีต้อนรับความช่วยเหลือใด ๆ !

คำอธิบาย:

_<>0Q+0sm"~-     
        m"~-     # Map "~-" onto the input (= a list of n times "~-").
       s         # Join the list to a string.
     +0          # Add "0" in front. 
 <>0Q            # Slice off the last char if the input is negative.
_                # Reverse the whole thing.

ใช้อินพุตโดยปริยายในตอนท้ายเพื่อบันทึกหนึ่งไบต์: >0แทนที่จะเป็น<Q0
Steven H.

@StevenH ขอขอบคุณ! ตอนนี้เรากำลังผูกกับคำตอบที่สั้นที่สุด!
KarlKastor

2
วิธีการแก้ปัญหาที่แตกต่างกันมาก (น่าเสียดายที่ไม่มีการบันทึกไบต์ใด ๆ ):tW>0Q_+0sm"~-
Steven H.

2
@StevenH นำวิธีการแก้ปัญหาของคุณไปใช้กับ 12: _<>0Q+0sm"~-ฉันหวังว่าคุณโอเคกับฉันเพิ่มสิ่งนี้ลงในโซลูชันของฉัน
KarlKastor

8

C, 46 ไบต์

m(x){putchar(x?x<0?126:45:48);x&&m(-x-(x<0));}

ต่างจากคำตอบอื่น ๆ ส่วนใหญ่ (ทั้งหมด?) อันนี้ส่งเอาต์พุตตัวดำเนินการ~และ-ทีละตัว



7

เรติน่า, 19 17 ไบต์

แทนที่หมายเลขด้วย unary ด้วยเลขศูนย์ที่จุดสิ้นสุด แทนที่แต่ละกับ1 -~ลบการลบสองครั้งหากมี

\d+
$*10
1
-~
--

ลองออนไลน์

กรณีทดสอบทั้งหมดในครั้งเดียว (โปรแกรมแก้ไขเล็กน้อยเพื่อรองรับกรณีทดสอบหลายรายการ)



7

Perl 38 35 33 (23 + 1 สำหรับ -p) 24

s/\d+/"-~"x$&.0/e;s;--;

-13 ขอบคุณ Dada


คุณอาจมีความหมายแทน-p -rนอกจากนี้คุณยังสามารถกำจัดวงเล็บและเซมิโคลอนสุดท้ายเหล่านั้นได้if$h<0ก็เพียงพอแล้ว
Dada

ฉันขอบคุณ ฉันเขียนคำตอบมากมายจนเกินไปฉันเดาว่า
Riley

อาจจะใช่ (กำจัดวงเล็บ 2 ตัวสุดท้ายด้วย)
Dada

นอกจากนี้คุณยังสามารถบันทึก 2 ไบต์โดยทำแทน$h<0&&s;.; s/.// if $h<0( -pเพิ่ม;ในตอนท้ายของรหัสจึงไม่จำเป็นสำหรับที่ผ่านมาไม่มี;ของs;.;;และ. a if bเป็นประมาณเทียบเท่ากับb && aแต่ในกรณีนี้มันช่วยให้คุณประหยัดหนึ่งไบต์เพราะคุณสามารถเอาพื้นที่)
Dada

ขอบคุณฉันไม่ทราบ -p เพิ่ม;เกินไป
Riley

6

Dyalog APL ขนาด 18 ไบต์

'0',⍨0∘>↓'-~'⍴⍨2×|

'0',⍨ อักขระศูนย์ผนวกเข้ากับ

0∘> การปฏิเสธ (เช่น 1 สำหรับตัวเลขที่ต่ำกว่า 0; 0 สำหรับศูนย์ขึ้นไป)

ลดลงจาก

'-~'⍴⍨ สตริง "~ -" เปลี่ยนรูปแบบวนตามความยาว

สองครั้ง

| ค่าสัมบูรณ์

+ บวก

0∘< ความเป็นบวก (เช่น 1 สำหรับตัวเลขที่มากกว่า 0)

ลองใช้ออนไลน์!


6

Haskell, 41 ไบต์

f n=['-'|n>0]++(tail$[1..abs n]>>"-~")++"0"

f n|n<0=tail$f(-n)|x<-[1..n]>>"-~"=x++"0"

ขอบคุณ nimi สำหรับ 3 ไบต์


tailn=0ล้มเหลว คุณสามารถใช้drop 1แทน
nimi

@nimi ขอบคุณ; ฉันไม่รู้เลยว่าฉันพลาดไปได้ยังไง
BlackCap

1
อย่าเสียยามอย่างอื่น : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 ไบต์เพื่อบันทึก: ...|n<0=tail$f(-n)|....
nimi

5

V , 21 ไบต์

/ä
é
D@"ña-~ñá0kgJó--

ลองออนไลน์!

วีได้มากจำกัด จำนวนการสนับสนุนและเป็นจริงมีแนวคิดของตัวเลขติดลบไม่ ซึ่งหมายความว่าเพื่อสนับสนุนเชิงลบ (หรือแม้แต่ 0) เราต้องใช้วิธีแก้ปัญหาแฮ็กบางอย่าง

คำอธิบาย:

/ä                  "Move forward to the first digit
é                   "And enter a newline
D                   "Delete this number, into register '"'
 @"                 "That number times:
   ñ   ñ            "Repeat the following:
    a               "  Append the string:
     -~             "  '-~'
        á0          "Append a 0
          k         "Move up a line
           gJ       "And join these two lines together
             ó--    "Remove the text '--', if it exists


5

เยลลี่ 10 ไบต์

A⁾-~ẋḊẋ¡N0

นี่เป็นโปรแกรมเต็ม ลองออนไลน์!

มันทำงานอย่างไร

A⁾-~ẋḊẋ¡N0  Main link. Argument: n

A           Take the absolute value of n.
 ⁾-~ẋ       Repeat the string "-~" that many times. Result: s
       ¡    Conditional application:
     Ḋ        Dequeue; remove the first element of s...
      ẋ N     if s, repeated -n times, is non-empty.
         0  Print the previous return value. Set the return value to 0.
            (implicit) Print the final return value.

5

Java 7, 95 79 ไบต์

79 ไบต์:

String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}

Ungolfed:

String s(int x) {
    String t = x<0 ? "~" : "";
    while((x<0 ? ++x : x--) != 0)
        t += "-~";
    return t+0;
}

รุ่นเก่า (95 ไบต์):

String s(int x){return new String(new char[x<0?-x:x]).replace("\0","-~").substring(x<0?1:0)+0;}

การใช้งาน:

class A {
    public static void main(String[]a) {
        System.out.println(s(-3));
        System.out.println(s(-2));
        System.out.println(s(-1));
        System.out.println(s(0));
        System.out.println(s(1));
        System.out.println(s(2));
        System.out.println(s(3));
    }
    static String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}
}

ลองที่นี่!

เอาท์พุท:

~-~-~0
~-~0
~0
0
-~0
-~-~0
-~-~-~0

สวัสดีและยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

ยินดีต้อนรับสู่ PPCG! อืมมันเป็นคำตอบที่สั้นกว่าของฉันดังนั้นฉันจะลบคำตอบของฉันและโหวตให้คุณแทน :)
Kevin Cruijssen


3

EXCEL: 55 33 ไบต์

=REPT("-~",IF(A1>0,A1,ABS(A1)-1))&"0"

อินพุตอยู่ในรูปแบบของการใส่ตัวเลขในเซลล์ A1 สูตรสามารถไปได้ทุกที่ยกเว้น A1


ฉันไม่คิดว่ามันใช้งานได้กับจำนวนลบ ...
pajonk

3

T-SQL, 87 ไบต์

select substring(replicate('-~',abs(x)),case when x<0then 2 else 1 end,x*x+1)+'0'from #

x*x+1เงื่อนไขในการย่อยก็เพียงพอเนื่องจากทั้งหมดx^2+1>=2*abs(x)x

ตามปกติใน SQL อินพุตจะถูกเก็บไว้ในตาราง:

create table # (x int)

insert into # values (0)
insert into # values (1)
insert into # values (-1)
insert into # values (2)
insert into # values (-2)

3

CJam , 18 14 ไบต์

รับแรงบันดาลใจจากคำตอบของ Emignaเพื่อประหยัด 4 ไบต์

li_z"-~"*\0<>0

ลองออนไลน์! (ในฐานะชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

li      e# Read input and convert to integer N.
_z      e# Duplicate and get |N|.
"-~"*   e# Repeat this string |N| times.
\0<     e# Use the other copy of N to check if it's negative.
>       e# If so, discard the first '-'.
0       e# Put a 0 at the end.

3

Vim - 31 การกดแป้น

ครั้งแรกที่กลุ่มกอล์ฟพลาดอะไรมากมาย

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`

ยินดีต้อนรับสู่สโมสร! :) คุณสามารถทำ:s/^-แทน:s/-\~/\~-และDแทนที่จะเป็นd$
DJMcMayhem

ตอนนี้ที่ฉันคิดเกี่ยวกับมันฉันไม่คิดว่าสิ่งนี้จะจัดการกับ 0 คุณสามารถได้รับสิ่งนี้โดยการเพิ่มขึ้นก่อนที่จะลบด้วย<C-a>แล้วลบตัวละครสองตัวออกจากท้าย
DJMcMayhem

@DJMcMayhem โอ้0iไม่ทำงานเหรอ?
Maltysen

ไม่น่าเสียดายไม่ใช่ 0เลื่อนเคอร์เซอร์ไปที่อักขระตัวแรกในแถวปัจจุบัน คุณสามารถ sorta ใช้ 0 เป็นจำนวนใน V แม้ว่า
DJMcMayhem



2

Perl 6 , 25 ไบต์

{substr '-~'x.abs~0,0>$_}

คำอธิบาย:

{
  substr
    # string repeat 「-~」 by the absolute value of the input
    '-~' x .abs

    # concatenate 0 to that
    ~ 0

    ,

    # ignore the first character of the string if it is negative
    0 > $_
}

2

เยลลี่, 14 12 ไบต์

-2 ไบต์ขอบคุณ @Dennis (ส่งคืน 0 แทนที่จะเชื่อมต่อ "0" ทำให้เป็นโปรแกรมแบบเต็มเท่านั้น)

0>‘
A⁾-~ẋṫÇ0

ทดสอบที่TryItOnline

อย่างไร?

0>‘      - link 1 takes an argument, the input
0>       - greater than 0? 1 if true 0 if false
  ‘      - increment

A⁾-~ẋṫÇ0 - main link takes an argument, the input
      Ç  - y = result of previous link as a monad
A        - x = absolute value of input
 ⁾-~     - the string "-~"
    ẋ    - repeat the sting x times
     ṫ   - tail repeatedString[y:] (y will be 1 or 2, Jelly lists are 1-based)
       0 - implicit print then return 0

2

> <>, 18 + 3 = 22 ไบต์

:?!n0$-:0):1go-
-~

ลองออนไลน์! +3 ไบต์สำหรับ​ -vแฟล็กเพื่อเริ่มต้นสแต็กด้วยอินพุต ถ้าสมมติว่า STDIN นั้นว่างเปล่าก็โอเคแล้วต่อไปนี้จะเป็นไบต์ที่สั้นกว่า:

:?!ni*:0):1go-
-~

โปรแกรมจะพลิกอินพุตnตามที่จำเป็นจนกว่าจะถึง 0 หลังจากนั้นจะเกิดข้อผิดพลาดขึ้น

[Loop]
:?!n      If n is 0, output it as a num. If this happens then the stack is now
          empty, and the next subtraction fails
0$-       Subtract n from 0
:0)       Push (n > 0)
:1go      Output the char at (n>0, 1) which is a char from the second line
-         Subtract, overall updating n -> -n-(n>0)

2

อ็อกเทฟ 51 ไบต์

x=input('');[("-~"'*[1:abs(x)>0])((x<0)+1:end),'0']

ในตอนแรกการลอกเลียนแบบวิธี Matlab อย่างโจ่งแจ้งโดย @pajonk จากนั้นแก้ไขรายละเอียดบางอย่างเขียนใหม่เป็น "ผลิตภัณฑ์ด้านนอก" ระหว่างเวกเตอร์ของตัวอักษรกับตัวละคร "- ~" และการใช้ดัชนีที่ไม่เหมาะสม เรียกว่า) ช่วยให้เราประหยัดไบต์ ยังคงเจ็บปวดเล็กน้อยที่ฉันไม่สามารถรับนิพจน์ดัชนีเพื่อใช้ไบต์น้อยลง

อ็อกเทฟอนุญาตให้ (i1) (i2) หรือแม้กระทั่ง (... ) (i1) (i2) สำหรับการทำดัชนีที่ Matlab ต้องการให้เราเก็บตัวแปรไว้ระหว่างการทำดัชนี

((x<0)+1:end)

ยาวเกินไปที่จะอธิบาย "ข้ามก่อนถ้า" จะต้องมีวิธีที่ดีกว่า


2

PseudoD , 688 579 521 bytes

utilizar mate.pseudo
utilizar entsal.pseudo
adquirir n
adquirir a
adquirir r
adquirir i
fijar n a llamar LeerPalabra finargs
si son iguales n y CERO
escribir {0}
salir
fin
fijar a a llamar ValorAbsoluto n finargs
fijar i a CERO
si comparar Importar.Ent.Comparar n < CERO
fijar r a {~}
sino
fijar r a {-}
fin
mientras comparar Importar.Ent.Comparar i < a
escribir r finargs
si son iguales r y {~}
fijar r a {-}
Importar.Ent.Sumar i UNO i
sino
fijar r a {~}
fin
finbucle
si son iguales r y {~}
escribir {~}
fin
escribir {0}

อธิบาย:

Read a number from STDIN;
If the number is zero (0); Then:
    Writes 0 to STDOUT and exits;
End If;
If the number is less than zero (0); Then:
    Set the fill character to "~";
Else:
    Set the fill character to "-";
End If;
For i = 0; While i is less than abs(number); do:
    Write the fill character to STDOUT;
    If the fill character is "~":
        Set the fill character to "-"
        Increment i by one
    Else:
        Set the fill character to "~"
    End if;
End for;
If the fill character is "~"; Then:
    Write "~" to STDOUT;
End If;
Write "0" to STDOUT

1
ยินดีต้อนรับสู่ PPCG! มันเล็กไปไหม ฉันเห็นตัวบ่งชี้ยาว ๆ ที่คุณอาจสั้นลง ("relleno" ถึง "r", menos relleno: P) ฉันคิดว่าคุณสามารถวางการนำเข้าสำหรับ lib มาตรฐานหากเป็นเพียงข้อมูลโค้ดหรือฟังก์ชันเท่านั้น มันไม่ได้ขอให้ขึ้นบรรทัดใหม่ของเอาท์พุทดังนั้นบางทีคุณสามารถเปลี่ยน EscribirLinea ล่าสุดเป็น Escribir ได้ คุณสามารถกำหนดฟังก์ชั่นให้กับชื่อที่สั้นกว่า ( adquirir e``fijar p a Escribir) ได้ไหม?
fede s



1

เขาวงกต 25 ไบต์

`?+#~.
.  ; 6
54_"#2
  @!

ลองออนไลน์!

คำอธิบาย

ฉันชอบกระแสการควบคุมในอันนี้ IP ทำงานในรูปที่ 8 (หรือที่จริงแล้วคือ∞ฉันเดา) ผ่านรหัสเพื่อลดอินพุตให้ช้าลง0ในขณะที่พิมพ์อักขระที่เกี่ยวข้อง

รหัสเริ่มต้นที่มุมบนซ้ายไปทางขวา ตอน`นี้ไม่ได้ทำอะไรเลย ?อ่านอินพุตและ+เพิ่มลงในศูนย์โดยนัยด้านล่าง แน่นอนว่าไม่ได้ทำอะไรอย่างใดอย่างหนึ่ง แต่เมื่อเราเรียกใช้รหัสนี้อีกครั้ง?จะผลักศูนย์ (เพราะเราอยู่ที่ EOF) +แล้วจะกำจัดศูนย์นั้น

ถัดไป#จะเพิ่มความลึกของสแต็กเพียงเพื่อให้แน่ใจว่ามีค่าเป็นบวกบนสแต็กเพื่อให้ IP เลี้ยวไปทางใต้และ;ทิ้งอีกครั้ง

the "no-op และทำหน้าที่เป็นสาขาหลักของรหัส มีสามกรณีที่จะแยกแยะ:

  • หากค่าปัจจุบันเป็นบวก IP จะเลี้ยวขวา (ตะวันตก) และทำหนึ่งรอบของลูปด้านซ้ายให้เสร็จสมบูรณ์:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • หากค่าปัจจุบันเป็นลบ IP จะเลี้ยวซ้าย (ตะวันออก) และใช้รหัสต่อไปนี้:

    #26.~
    #        Push stack depth, 1.
     26      Turn it into a 126.
       .     Print as character '~'.
        ~    Bitwise NOT of the current value (applying the ~).
    

    โปรดทราบว่าทั้งสองจะสลับกัน (เนื่องจากทั้งคู่เปลี่ยนเครื่องหมายของอินพุต) จนกว่าค่าอินพุตจะลดลงเป็นศูนย์ ณ จุดนั้น ...

  • เมื่อค่าปัจจุบันเป็นศูนย์ IP เพียงแค่ช่วยให้การเคลื่อนย้ายใต้และดำเนินการและจากนั้นก็หันไปทางทิศตะวันตกบน! พิมพ์และยกเลิกโปรแกรม@!0@

1

GolfScript ,30 24 20 ไบต์

  • บันทึก 6 ไบต์ขอบคุณ xnor
  • บันทึกแล้ว 4 ไบต์ขอบคุณเดนนิส

~."-~"\abs*\0<{(;}*0

การป้อนข้อมูล: -5

เอาท์พุท: -5 = ~-~-~-~-~0

คำอธิบาย

~.     # Input to integer and duplicate
"-~"   # We shall output a repetition of this string
\abs   # Move the input onto the stack and computes abs
*      # Multiply "-~" for abs(input) times
\      # Copy onto the stack the input
0<     # Is it less than 0?
{(;}*  # Yes: remove first '-' from the output
0      # Push 0

ลองออนไลน์!


1
คุณจะได้ไม่ต้องพิมพ์เพียง2 = -~-~0
xnor

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