Бітфліп і заперечення


42

Враховуючи ціле число, зробіть вираз, який виробляє його з 0використанням одинарного заперечення -і побітового доповнення ~( ~n= -n-1), при цьому оператори застосовуються праворуч ліворуч.

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

Ваше вираз має бути якомога коротше, що означає відсутність надлишкових частин ~~, --, -0або 00. Виведіть або роздрукуйте вираз у вигляді рядка або послідовності символів.



1
пробіл між ~ та 0 дозволений?
Адам

Ні, точно виведіть рядки.
xnor

2
Обов’язковий xkcd.com/153
Джаред Сміт

Відповіді:


17

Пітон, 32 байти

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

Функція анонімної лямбда. З огляду на ціле число x пише "- ~" абс (х) разів і видаляє перше знако, якщо х від'ємне, то до кінця додається нуль.


Ой, побий мене до цього.
mbomb007

Я також теж написав те саме - nна місці xі 'на місці ":)
Джонатан Аллан

2
@JonathanAllan Тоді ви можете сміливо вважати це дуром.
Erik the Outgolfer

16

JavaScript (ES6), 33 31 байт

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

Рекурсія <вбудовані <петлі (принаймні в цьому випадку). В основному не оцінює вхід:

  • якщо менше 0, переверніть його та додайте ~до рядка;
  • якщо його більше 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

Піта, 14 13 12 байт

_<>0Q+0sm"~-

-2 байти завдяки @StevenH.

тестовий набір

Вирішив спробувати Pyth, тому я переклав на нього свою відповідь python . Будь-яка допомога ласкаво просимо!

Пояснення:

_<>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
Стівен Х.

@StevenH. Дякую! Тепер ми в краватці з найкоротшою відповіддю!
КарлКастор

2
Дуже інше рішення (яке, на жаль, не економить жодних байт):tW>0Q_+0sm"~-
Стівен Х.

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 байт

Замініть число на одинакове, на нулі - нуль. Замініть кожен 1на -~. Видаліть подвійний мінус, якщо такий є.

\d+
$*10
1
-~
--

Спробуйте в Інтернеті

Усі тестові справи одразу (трохи змінена програма для підтримки декількох тестових випадків)



7

Perl 38 35 33 (23 + 1 для -p) 24

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

-13 завдяки Даді


Ви, мабуть, мали на увазі -pзамість цього -r. Також можна позбутися тих останніх дужок і крапки з комою: if$h<0достатньо.
Дада

Я зробив, спасибі. Думаю, я писав занадто багато відповідей в sed.
Райлі

Можливо, так. (Позбудьтеся і останніх двох дужок)
Дада,

Ви також можете зберегти 2 байти, виконуючи $h<0&&s;.;замість цього s/.// if $h<0. ( -pдодає в ;кінці коду, тому немає потреби в останньому ;з s;.;;. І a if bприблизно еквівалентно b && a, але в цьому випадку це заощадить вам один байт, оскільки ви можете видалити пробіл)
Dada

Дякую, я не знав -p додав ;теж.
Райлі

6

Діалог APL , 18 байт

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

'0',⍨ нуль символів, доданих до

0∘> негативність (тобто 1 для чисел під 0; 0 для нуля і вище)

випав із

'-~'⍴⍨ рядок "~ -" циклічно переробити на довжину

два рази

| абсолютне значення

+ плюс

0∘< позитивність (тобто 1 для чисел понад 0)

СпробуйтеAPL онлайн!


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 байти


tailне вдається для n=0. Ви можете використовувати drop 1замість цього.
німі

@nimi Спасибі; Я поняття не маю, як це я пропустив ..
BlackCap

1
Не витрачайте інакше караул : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
німі

1
2 байта для збереження: ...|n<0=tail$f(-n)|....
німі

5

V , 21 байт

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

Спробуйте в Інтернеті!

V має дуже обмежену підтримку числа, і це на самому справі не має ніякого поняття негативних чисел. Це означає, що для підтримки негативів (або навіть 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

JavaScript (ES6), 39 37 байт

x=>"-~".repeat(x<0?-x:x).slice(x<0)+0

Збережено 2 байти завдяки @Neil


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;}

Безголівки:

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! Гм, це коротше рішення, ніж моє, тому я видалю свою відповідь і замість вас виправдаю вашу. :)
Кевін Кройсейсен


3

EXCEL: 55 33 байт

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

Введення здійснюється у вигляді введення числа в комірку А1. Формула може йти куди завгодно, крім 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 байт

Вибрали натхнення у відповіді Еміньї, щоб зберегти 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 натискання клавіш

Перший vim golf, пролі пропустив тонну речей.

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

Приємно, ласкаво просимо в клуб! :) Ви можете зробити :s/^-замість :s/-\~/\~-і Dзамістьd$
DJMcMayhem

Тепер, коли я замислююся над цим, я не думаю, що це справляється з 0. Ви можете це обійти, збільшуючи, перед тим як видалити, <C-a>а потім видалити два символи з кінця.
DJMcMayhem

@DJMcMayhem о, 0iне працює?
Мальтісен

Ні, на жаль, ні. 0переміщує курсор до першого символу в поточному рядку. Ви можете сортувати використовувати 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, а потім модифікуючи деякі деталі, переписуючи як "зовнішній продукт" між вектором одиниць та символами "- ~" та зловживаючи індексацією на ходу (або що це може бути називається) дозволяє нам зберегти кілька байт. Це все ще мене злегка болить, що я не можу отримати індексний вираз взяти менше байтів.

Octave дозволяє (i1) (i2) або навіть (...) (i1) (i2) для індексації, де Matlab хотів би, щоб ми зберігали змінні між індексаціями.

((x<0)+1:end)

занадто довго, щоб описати "пропустити перший, якщо". Має бути кращий спосіб.


2

ПсевдоД , 688 579 521 байт

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)?
федерація.



1

Лабіринт , 25 байт

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

Спробуйте в Інтернеті!

Пояснення

Мені дуже подобається контрольний потік у цьому. IP працює на рисунку 8 (або, власне, ∞, я думаю) через код, щоб повільно зменшити введення під 0час друку відповідних символів.

Код починається у верхньому лівому куті, йдучи праворуч. Зараз `нічого не роблять. ?зчитує вхід і +додає його до неявного нуля нижче. Звичайно, це теж нічого не робить, але коли ми знову переберемо цей код, ?натисне нуль (тому що ми на EOF), а +потім позбудемося цього нуля.

Далі #натискає на глибину стека, просто переконайтесь, що на стеку є позитивне значення, щоб змусити IP повернути на південь та ;відкинути його знову.

Оператор "не працює і виступає основною гілкою коду. Виділити три випадки:

  • Якщо поточне значення позитивне, 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.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.