Bitflip ve olumsuzla


42

Bir tamsayı verildiğinde , operatörleri sağdan sola uygulayarak, 0unary olumsuzlama -ve bitsel tamamlayıcı ~( ~n= -n-1) kullanmaktan üreten bir ifade verin .

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

Sizin ifade hiçbir gereksiz parçalar demektir mümkün olduğunca kısa olarak olmalıdır ~~, --, -0, veya 00. İfadeyi bir dizge veya karakter dizisi olarak çıktılayın veya yazdırın.



1
~ ile 0 arasındaki boşluk bırakılsın mı?
Adám

Hayır, tam olarak dizeleri çıkar.
xnor

Yanıtlar:


17

Python, 32 bayt

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

Anonim lambda işlevi. Bir tamsayı verildiğinde x, "- ~" abs (x) kez yazıyor ve x negatifse ilk karakteri kaldırıyor, ardından sonuna bir sıfır ekleniyor.


Aw, beni döv.
mbomb007

Ben de aynısını yazdım - nyerine xve 'yerine ":) ile
Jonathan Allan

2
@JonathanAllan O zaman güvenle bir dupe olarak düşünebilirsiniz.
Outgolfer Erik

16

JavaScript (ES6), 33 31 bayt

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

Özyineleme <yerleşikler <döngüler (en azından bu durumda). Temel olarak girişi değerlendirir:

  • 0'dan küçükse, onu çevirin ve ~dizeye bir a ekleyin ;
  • 0'dan büyükse, onu yok sayın ve -dizeye bir a ekleyin ;
  • tam olarak 0 ise, 0 döndür.

Bu düzenden yararlanır:

 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 Bayt

_<>0Q+0sm"~-

@ StevenH sayesinde 2 bayt.

test odası

Pyth'i denemeye karar verdim , bu yüzden python cevabımı ona çevirdim . Herhangi bir yardım hoş geldiniz!

Açıklama:

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

Bir bayt kaydetmek için sonunda gizli girişi kullanın: >0yerine<Q0
Steven H.

@StevenH. Teşekkür ederim! Şimdi en kısa cevabı veren bir beraberiz!
KarlKastor

2
Çok farklı bir çözüm (ne yazık ki herhangi bir bayt kurtarmaz):tW>0Q_+0sm"~-
Steven H.

2
@StevenH. Çözümünüzü 12'ye düşürdüm: _<>0Q+0sm"~-Umarım bunu benim çözüme eklememe izin verirsiniz.
KarlKastor

8

C, 46 bayt

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

Diğer (çoğu?) Diğer cevapların aksine, bu durum operatörleri ~ve -birer birer çıktılar .


7

05AB1E , 14 13 bayt

Ä„-~×¹0‹i¦}0J

açıklama

 „-~           # the string "-~"
Ä   ×          # repeated abs(input) times
     ¹0‹i¦}    # if input is negative, remove the first char
           0J  # join with 0

Çevrimiçi deneyin!



7

Perl 38 35 33 (-p için 23 + 1) 24

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

-13 Dada'ya teşekkürler


Muhtemelen -pyerine demek istedin -r. Ayrıca son parantez ve noktalı virgüllerden kurtulabilirsiniz: if$h<0Yeterli.
Dada

Yaptım, teşekkürler. Sanırım sed'de çok fazla cevap yazdım.
Riley,

Muhtemelen, evet. (Son 2 parantezden de kurtulun)
Dada

Ayrıca $h<0&&s;.;yerine 2 bayt kaydedebilirsiniz s/.// if $h<0. ( -pBir ekler ;son gerek yüzden, kodun sonuna ;ait s;.;;Ve. a if bEşdeğerdir b && aancak bu durumda size boşluğu kaldırabilirsiniz çünkü bir bayt kaydeder)
Dada

Teşekkürler, bilmiyordum -p de ekledi ;.
Riley,

6

Dyalog APL , 18 bayt

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

'0',⍨ eklenen karakter sıfır

0∘> olumsuzluk (yani, 0'ın altındaki sayılar için 1; sıfır ve üstü için 0)

düştü

'-~'⍴⍨ "~ -" dizgisi periyodik olarak uzunluğa göre yeniden şekillendirilir

iki kere

| mutlak değer

+ artı

0∘< pozitiflik (yani 0'dan büyük sayılar için 1)

TryAPL çevrimiçi!


6

Haskell, 41 bayt

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

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

3 bayt için nimi sayesinde


tailiçin başarısız n=0. Bunun drop 1yerine kullanabilirsiniz .
nimi

@ nimi Teşekkürler; Bunu nasıl kaçırdığımı bilmiyorum ..
BlackCap

1
Aksi nöbet israf etmeyin : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 kurtarmaya bayt: ...|n<0=tail$f(-n)|....
nimi

5

V , 21 bayt

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

Çevrimiçi deneyin!

V etti çok sayıda sınırlı destek ve aslında negatif sayılar kavramı yok. Bu, negatifleri (veya hatta 0'ı) desteklemek için bazı kötü geçici çözümler kullanmamız gerektiği anlamına gelir.

Açıklama:

/ä                  "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 bayt

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

@Neil sayesinde 2 bayt kaydedildi


5

Jöle , 10 bayt

A⁾-~ẋḊẋ¡N0

Bu tam bir programdır. Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

79 bayt:

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

Eski versiyon (95 bayt):

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

Kullanımı:

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

Burada dene!

Çıktı:

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

Merhaba ve PPCG'ye hoş geldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ

PPCG'ye Hoşgeldiniz! Hmm, bu benimkinden daha kısa bir çözüm, bu yüzden cevabımı silip yerine sizinkileri oylayacağım. :)
Kevin Cruijssen


3

EXCEL: 55 33 bayt

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

Giriş, A1 hücresine bir sayı koyma şeklindedir. Formül A1 hariç herhangi bir yere gidebilir.


Ancak ... negatif sayılar için çalıştığını sanmıyorum
Pajonk

3

T-SQL, 87 bayt

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

x*x+1Alt dize koşul beri, yeterli x^2+1>=2*abs(x)herkes için x.

Genellikle SQL'de olduğu gibi giriş bir tabloda saklanır:

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 bayt

4 bayt kurtarmak için Emigna'nın cevabından ilham aldı .

li_z"-~"*\0<>0

Çevrimiçi deneyin! (Satır ayrılmış bir test takımı olarak.)

açıklama

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 tuş vuruşları

İlk vim golf, bir sürü şeyi kaçırdı.

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

Güzel, kulübe hoşgeldin! :) Sen yapabileceğini :s/^-yerine :s/-\~/\~-ve Dyerined$
DJMcMayhem

Şimdi bunu düşündüğüme göre, bunun 0 işlediğini sanmıyorum <C-a>. Sonunda iki karakteri silmeden önce ve sonra silerek bu işlemi başarabilirsiniz .
DJMcMayhem

@DJMcMayhem oh, 0içalışmıyor?
Maltysen

Hayır, maalesef hayır. 0imleci geçerli satırdaki ilk karaktere taşır. 0'da V de sayım olarak kullanabilirsiniz.
DJMcMayhem

2

Matlab, 61 bayt

x=input('');A=repmat('-~',1,abs(x));disp([A((x<0)+1:end) 48])



2

Jöle, 14 12 bayt

@Dennis sayesinde -2 bayt ("0" birleştirmek yerine 0 döndür, bunu sadece tam program yapar.)

0>‘
A⁾-~ẋṫÇ0

TryItOnline'da test edin

Nasıl?

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 bayt

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

Çevrimiçi deneyin! ​ -vBayrağın yığını girişle başlatması için +3 bayt . STDIN’in boş olduğunu varsayarsak, aşağıdakiler bir bayt daha kısadır:

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

Program, n0'a ulaşana kadar girişi gerektiği gibi çevirmeye devam ediyor , ardından hata veriyor.

[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

Octave, 51 bayt

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

Önce, Matlab yaklaşımını pajonk tarafından açıkça kopyalamak ve sonra bazı detayları değiştirmek, bir vektör ile karakterleri "- ~" arasında "dış ürün" olarak yeniden yazmak ve anında indekslemeyi kötüye kullanmak (ya da ne olabilir Çağrılan) bazı baytları kaydetmemize izin verir. Daha az bayt almak için dizin ifadesini alamadığım için hala biraz acı veriyor.

Oktav, Matlab'ın indeksler arasında değişkenleri saklamamızı isteyeceği indeksleme için bir (i1) (i2) veya hatta (...) (i1) (i2) 'ye izin verir.

((x<0)+1:end)

"önce atla" yı tanımlamak için çok uzun. Daha iyi bir yol olmalı.


2

Sözde , 688 579 521 bayt

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}

Açıklamak:

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'ye Hoşgeldiniz! Bu olabildiğince küçük mü? Muhtemelen kısaltabileceğiniz bazı uzun tanımlayıcılar görüyorum ("relleno" - "r", menos relleno: P). Sanırım sadece bir işlev veya kod parçası ise, standart lib için içe aktarmayı bırakabilirsiniz. Çıktıda yeni bir satır izlemiyor, bu yüzden belki de son EscribirLinea'yı Escribir olarak değiştirebilirsiniz. İşlevleri daha kısa isimlere ( adquirir e``fijar p a Escribir) atayabilir misiniz ?
fede s.


1

PHP, 58 bayt

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

1

Labirent , 25 bayt

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

Çevrimiçi deneyin!

açıklama

Buradaki kontrol akışını gerçekten seviyorum. IP 0, ilgili karakterleri yazdırırken girişi yavaşça azaltmak için kod boyunca bir şekil 8'de (veya aslında bir ∞, sanırım) çalışır .

Kod sol üst köşede sağa doğru ilerleyerek başlar. Şu `anda hiçbir şey yapmıyor. ?girişi okur ve +aşağıdaki örtük sıfıra ekler. Tabii ki bu da bir şey yapmıyor, ancak bu kodu tekrar ?denediğimizde, sıfırı zorlayacağız (çünkü biz EOF'dayız) ve +o zaman sıfırdan kurtulacak.

Daha sonra #, IP'yi güneye döndürmek için yığında pozitif bir değer olduğundan emin olmak için yığın derinliğini iter ve ;tekrar atar.

"No-op ve kodun temel dalı olarak görür. Ayırt etmek için üç durum var:

  • Mevcut değer pozitif ise, IP sağa döner (batı) ve soldaki döngünün bir turunu tamamlar:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Geçerli değer negatifse, IP sola döner (doğu) ve aşağıdaki kod çalıştırılır:

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

    Girdi değeri sıfıra düşene kadar bu ikisinin de değişeceğini (her ikisi de girişin işaretini değiştirir) unutmayın. Bu noktada...

  • Mevcut değer sıfır olduğunda, IP basitçe güneye doğru ilerlemeye devam eder !ve ardından ilerledikçe batıya döner @. programı !yazdırır 0ve @sonlandırır.

1

GolfScript ,30 24 20 bayt

  • Xnor sayesinde 6 bayt kurtardı.
  • Dennis sayesinde 4 byte kurtarıldı.

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

Giriş: -5

Çıktı: -5 = ~-~-~-~-~0

açıklama

~.     # 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

Çevrimiçi deneyin!


1
Basmak zorunda değilsin 2 = , sadece -~-~0.
xnor

1
Sen kullanabilirsiniz {(;}*0yerine {(;}{}if 0.
Dennis,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.