ビットフリップとネゲート


42

整数を指定し、演算子を右から左に適用して、0単項否定-とビット単位の補数~~n= -n-1)を使用して生成する式を作成します。

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

あなたの表現は冗長な部分を意味しており、できるだけ短くなければなりません~~---0、または00。式を文字列または文字シーケンスとして出力または印刷します。


11
だから...あなたは私たちに置き、それを裏返し、それを逆にして欲しいですか?
ヨルダン

1
〜と0の間の空白は許可されますか?
アダム

いいえ、文字列を正確に出力します。
-xnor

回答:


17

Python、32バイト

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

匿名のラムダ関数。整数xが "-〜" abs(x)回書き込み、xが負の場合、最初の文字を削除すると、最後にゼロが追加されます。


ああ、私を打ちました。
mbomb007

私はあまりにも同じ書いた-とnの代わりに、x'の代わりに":)
ジョナサン・アラン

2
@JonathanAllanそれから、あなたはそれをだましと安全に考えることができます。
エリックアウトゴルファー16

16

JavaScript(ES6)、33 31バイト

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

再帰<組み込み<ループ(少なくともこの場合)。基本的に入力を評価しません:

  • 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"~-

-StevenHのおかげで2バイト。

テストスイート

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.

1つのバイトを保存するために最後に、暗黙的な入力を使用します。>0代わりに<Q0
スティーブンH.

@stevenH。ありがとうございました!今、私たちは最短の答えと結びついています!
カールカストール

2
非常に異なるソリューション(残念ながら、バイトを保存しない):tW>0Q_+0sm"~-
スティーブンH.

2
@stevenH。ソリューションを12にまで減らしました_<>0Q+0sm"~-。これをソリューションに追加してもらえれば幸いです。
カールカストール

8

C、46バイト

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

他のほとんどの(すべて?)他の回答とは異なり、これは演算子~-1つずつ出力します。




7

Perl 38 35 33(-pの場合は23 + 1)24

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

-13ダダに感謝


おそらくの-p代わりに-r。また、これらの最後の括弧とセミコロンを取り除くことができます:if$h<0で十分です。
ダダ

やった、ありがとう。私はsedであまりにも多くの答えを書いています。
ライリー

たぶん。(最後の2つの括弧も取り除きます)
ダダ

また、の$h<0&&s;.;代わりに行うことで2バイトを節約できますs/.// if $h<0。(-p追加;最後の必要がないので、コードの末尾;s;.;;と。a if bとほぼ同等であるb && aが、この場合には、それはあなたがスペースを削除することができますので、1つのバイトが保存されます)
ダダ

おかげで、-pが追加されたこと;も知りませんでした。
ライリー

6

Dyalog APL、18 バイト

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

'0',⍨ 文字ゼロが追加されます

0∘> マイナス(0未満の数値の場合は1、ゼロ以上の場合は0)

から落ちた

'-~'⍴⍨ ストリング「〜-」は長さに周期的に再形成されます

二度

| 絶対値

+ プラス

0∘< ポジティブ(つまり、0を超える数値の場合は1)

TryAPLオンライン!


6

Haskell、41バイト

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

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

3バイトのnimiに感謝


tail失敗しn=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ó--

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

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

@Neilのおかげで2バイト節約


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へようこそ!うーん、それは私のものよりも短い解決策ですので、代わりに私の答えを削除し、あなたに賛成票を投じます。:)
ケビンクルイッセン16


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 #

all の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

CJam18 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ゴルフ、prollyは大量のものを逃しました。

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

ナイス、クラブへようこそ!:)の:s/^-代わりに:s/-\~/\~-D代わりにd$
DJMcMayhem

考えてみると、これで0が処理されるとは思いません。削除する前にインクリメントしてから<C-a>2文字を削除することで、これを回避できます。
DJMcMayhem

@DJMcMayhemああ、0i動作しませんか?
マルティセン16

残念ながら、そうではありません。0カーソルを現在の行の最初の文字に移動します。ただし、Vのカウントとして0を使用できます。
DJMcMayhem




2

ゼリー、14 12バイト

@Dennisのおかげで-2バイト(「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-
-~

オンラインでお試しください!​ -v入力でスタックを初期化するフラグ用の+3バイト。STDINが空であると仮定しても問題ない場合、以下は1バイト短くなります。

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

プログラムは、n0に達するまで必要に応じて入力を反転し続け、その後エラーになります。

[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']

最初に@pajonkによるMatlabアプローチを露骨にコピーしてから、一部の詳細を変更し、1のベクトルと文字「-〜」の間の「外積」として書き直し、オンザフライインデックス作成を乱用します(またはその可能性)ます。呼ばれます)いくつかのバイトを保存できます。インデックス式のバイト数を減らすことができないのは、まだ少し苦痛です。

Octaveでは、Matlabがインデックス付けの間に変数を保存する場合、インデックス付けにa(i1)(i2)または(...)(i1)(i2)を使用できます。

((x<0)+1:end)

「スキップする場合」を説明するには長すぎます。より良い方法がなければなりません。


2

PseudoD688 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)が表示されます。関数またはコードスニペットでもある場合は、標準ライブラリのインポートを削除できると思います。出力の末尾の改行を要求しないため、最後のEscribirLineaをEscribirに変更できます。関数を短い名前(adquirir e``fijar p a Escribir)に割り当てることはできますか?
フェデ。


1

PHP、58バイト

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);

1

ラビリンス、25バイト

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

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

説明

私はこれの制御フローが本当に好きです。IPは0、対応する文字の印刷中にゆっくりと入力を減らすために、コード全体で図8(または実際には∞)で実行されます。

コードは、左上隅から右に向かって始まります。`今何もしません。?入力を読み取り、+以下の暗黙的なゼロに追加します。もちろん、それでも何もしませんが、このコードをもう一度実行する?と、ゼロがプッシュされます(EOFにいるため)。+そのゼロが取り除かれます。

次に#、単にスタックの深さをプッシュし、単にIPを南に向けるスタックに正の値があることを確認し、;再び破棄します。

これ"はノーオペレーションであり、コードのメインブランチとして機能します。区別する3つのケースがあります。

  • 現在の値が正の場合、IPは右(西)に変わり、左ループの1ラウンドを完了します。

    _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 ~).
    

    入力値がゼロになるまで、これら2つが交互に入力されることに注意してください(どちらも入力の符号を変更するため)。その時点で...

  • 現在の値がゼロの場合、IPは単に南に移動し続け、それを実行して!から西に向きを変え@ます。プログラムを!出力し0@終了します。

1

GolfScript30 24 20バイト

  • xnorのおかげで6バイト節約されました。
  • デニスのおかげで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.