Bit-bilge bir ikili dizgeyi ters çevirmek için en kısa kod


79

Bana, yeni başlayanların deneyebileceği, yeterince kolay soru olmadığını düşünüyor!

Zorluk: 1 ve 0 gibi rastgele bir girdi dizgesi verilir:

10101110101010010100010001010110101001010

Bit-wise tersini veren en kısa kodu şöyle yaz:

01010001010101101011101110101001010110101

Yanıtlar:


88

J, 5 bayt

Giriş dizesinin değişken olduğunu varsayar b.

b='0'

Bu, çoğu dilde yapacağı şeyi yapmaz ...

J karşılaştırma operatörü adildir =( =:ve =.sırasıyla global ve yerel görevlendirmedir). Bununla birlikte, =normal ==operatör gibi çalışmaz : öğeden parça karşılaştırır. Bir dizi böyle oluşur Unutmayın: 0 2 3 2 3 1 2 3 4. örneğin 2 = 0 2 3 2 3 1 2 3 4verir 0 1 0 1 0 0 1 0 0. Bu bir dize için benzerdir 'a'='abcadcadda'sadece dönmez 0döndürür, 1 0 0 1 0 0 1 0 0 1(Bu demek çıkarım olabilir 0ile */temelde, yani all, ancak bu durumda.) Biz birler ve sıfırlar dizisi istiyorum çünkü bu davranış, mükemmel, ya True ve Sahte'nin. J's bools olduklarından 1 ve 0bu bir dizi 1s ile sonuçlanır ve0's (Dizeler değiller ve bu diziyle 1sonuçlanacak diğer karakterlerin hepsi de değildir 0.) Bunun yazdırılması gerekmez: J otomatik olarak bir ifadenin sonucunu yazdırır. Umarım bu yeterli açıklamadı, olmasa da, yorumlarda henüz net olmayan bir şey isteyin. Bu cevap da olabilirdi '0'&=(veya =&'0'), ama bunun b='0'daha açık olduğunu hissettim .


1
J'i denedim. Aklımı buna veremiyorum. Sanırım iyi dokümanlar bulamadım. Burada, deli olduğun için + 1 al.
seequ

1
Bu yüzden asla J kullanmayacağım
Qix

2
@Qix J olduğu gibi okunamıyor, bu gerçekten bana mantıklı geliyor ve LHS vektörü ve skalar bir RHS vektörü alan operatörleri olan diğer diller de aynı şekilde davranıyor.
hvd

1
Ne? Doğru sonucu döndürmez, değil mi? ... Sonuç (boşluksuz) bir metin dizesi olması gerekirdi, ama J sınırlı bilgi ile, bu 0 1 0 1 0 bir ekran formu ile bir boolean listesini döndürür düşünüyorum
Adam

4
Buna izin verilmez, çünkü girişin belirli bir değişkende saklandığını varsayamazsınız. =&'0'aynı sayıda bayt için çalışır.
Esolanging Fruit

43

GolfScript , 5 bayt

{1^}%

Çevrimiçi deneyin.

Nasıl çalışır

  • GolfScript, girişin tamamını STDIN'den okur ve yığına dizge olarak yerleştirir.

  • {}% dizedeki tüm karakterleri inceler ve hepsi için kod bloğunu çalıştırır.

  • 1^ ASCII kodunun özel OR'sini 1 ile hesaplar. “0”, ASCII koduna 48, “1” - ASCII koduna 49 karşılık gelir.

    Bu yana , bu 0'ları 1'lere 48 ^ 1 = 49ve 49 ^ 1 = 481'leri 0'lara dönüştürüyor.

  • Bittiğinde, GolfScript değiştirilen dizeyi yazdırır.


6
Bekle, golf yazısı ?
ToonAlfrink

Sorunu yanlış yorumlamıştım. Şimdi düzeltildi.
Dennis,

1
@tolos: Cevabımı düzenledim.
Dennis

5
@ToonAlfrink GolfScript gibi Golfing dilleri, belirli zorluklar için tasarlanmadıkları anlamına gelen 'genel amaçlı' oldukları sürece tüm zorluklarda kabul edilir.
kitcar2000

4
@ kitcar2000 Bir kod golf sorusunda GolfScript kullanmaya cesaret eden birinin şoku yerine böyle bir dilin var olduğuna daha çok şaşırdığını düşünüyorum;)
Chris Cirefice


30

DOS'ta x86 makine kodu - 14 13 11 bayt

Yine kısaldı! İlgisiz bir meydan okuma için bir çözüm yazdıktan sonra , aynı hilenin burada bile uygulanabileceğini fark ettim. İşte başlıyoruz:

00000000  b4 08 cd 21 35 01 0a 86  c2 eb f7                 |...!5......|
0000000b

Yorum yapılan montaj:

    org 100h

section .text

start:
    mov ah,8        ; start with "read character with no echo"
lop:
    ; this loop runs twice per character read; first with ah=8,
    ; so "read character with no echo", then with ah=2, so
    ; "write character"; the switch is performed by the xor below
    int 21h         ; perform syscall
    ; ah is the syscall number; xor with 0x0a changes 8 to 2 and
    ; viceversa (so, switch read <=> write)
    ; al is the read character (when we did read); xor the low
    ; bit to change 0 to 1 and reverse
    xor ax,0x0a01
    mov dl,al       ; put the read (and inverted character) in dl,
                    ; where syscall 2 looks for the character to print
    jmp lop         ; loop

Önceki çözüm - 13 bayt

Sanırım bundan daha kısa sürmüyor.Aslında oldu! @Ninjalj'a bir bayt daha tıraş ettiğin için teşekkürler.

00000000  b4 08 cd 21 34 01 92 b4  02 cd 21 eb f3           |...!4.....!..|
0000000d

Bu sürüm gelişmiş etkileşime sahiptir ™ - komut satırından çalıştırdıktan sonra, giriş basamaklarını yazdığınız sürece (ters çevrilmiş) "ters çevrilmiş" karakterleri dağıtır; çıkmak için, sadece bir Ctrl-C yapın.

Önceki çözümden farklı olarak, DosBox'ta çalışan bazı sorunlar var - DosBox doğru bir şekilde Ctrl-C'yi desteklemediğinden , çıkmak istiyorsanız DosBox penceresini kapatmak zorunda kalırsınız. DOS 6.0'lı bir VM'de bunun yerine amaçlandığı şekilde çalışır.

NASM kaynağı:

org 100h

section .text

start:
    mov ah,8
    int 21h
    xor al,1
    xchg dx,ax
    mov ah,2
    int 21h
    jmp start

Eski çözüm - 27 25 22 bayt

Bu, komut satırından girişini kabul etti; DosBox'ta bir .COM dosyası olarak sorunsuz çalışır.

00000000  bb 01 00 b4 02 8a 97 81  00 80 f2 01 cd 21 43 3a  |.............!C:|
00000010  1e 80 00 7c f0 c3                                 |...|..|

NASM girişi:

    org 100h

section .text

start:
    mov bx, 1
    mov ah, 2
loop:
    mov dl, byte[bx+81h]
    xor dl, 1
    int 21h
    inc bx
    cmp bl, byte[80h]
    jl loop
exit:
    ret

2
Kod için +1 muhtemelen pek anlamadı.
Knerd

1
xchg dx,ax1'den bayt kısadırmov dl,al
ninjalj

@ ninjalj: woa, teşekkür ederim! Bu etmedi sonuçta daha kısa olsun!
Matteo Italia

26

Bash + coreutils, 8 bayt

tr 01 10

STDIN'den girdi alır.


Veya

sed, 8 bayt

y/01/10/

2
Geçenlerde Bash github.com/professorfish/bash-shelf için belirlenmiş bir golf kütüphanesi / takma adı oluşturdum . Bununla bir char tıraş olabilir:y 01 10

1
BASH burada nerede yer almaktadır? BASH'e özgü nedir? Her kabuk arayabilir tr...
yeti

1
@Yeti Her kabuk bash veya zsh gibi komutları çağırmaz. Bazı kabuklarda bu kod tek başına bir sözdizimi hatasıdır
mniip

5
Burada "kabuk" un "POSIX uyumlu kabuk" anlamına geldiğini varsaymak güvenlidir ...
FireFly

@professorfish bir char'ı tıraş edersiniz, ancak fonksiyonu dahil ederek 48 ekleyin. Bu nasıl bir kazanç?
Steven Penny

20

CJam , 4 bayt

:~:!

Orijinal dizenin zaten yığında olduğunu varsayalım. Değiştirilen dizeyi yazdırır.

Aşağıdaki Kodu yapıştırarak çevrimiçi deneyin :

"10101110101010010100010001010110101001010":~:!

Nasıl çalışır

  • :~dizenin her karakterini değerlendirir, yani 0 karakterini 0 tamsayısıyla değiştirir .

  • :!Her bir tamsayının mantıksal DEĞİL değerini hesaplar. Bu 0'ları 1'lere ve 1'leri 0'lara dönüştürür.


19

Brainfuck ( 70 71)

>,[>,]<[<]>[<+++++++[>-------<-]<+>>[++<]<[>]++++++++[>++++++<-]>.[-]>]

Açıklama:

>,[>,]                       Read characters until there are none left.
<[<]                         Return to start
>[<                          Loop as long as there are characters to invert
  +++++++[>-------<-]        Subtract 49 (ASCII value of 1)
  >[++<]                     If not 0, add 2
  +++[<++++>-]<[>>++++<<-]>> Add 48
  .                          Print
  [-]                        Set current cell to 0
>]                           Loop

1
++++++++ [<++++++> - - neden 48 için bu değil? 8 * 6 vs. 4 * 4 * 3
Cruncher

@Cruncher Eklendi.
kitcar2000

Neden daha uzun sürdü? "Hata düzeltme" nedeniyle mi?
Cruncher

1
Evet @Cruncher, ben çıkış alacaktı bir hatayı düzeltmek zorunda aiçin 11.
kitcar2000

16

PHP - 19 bayt

<?=strtr($s,[1,0]);

Evet, gerçekten orijinal değil sanırım!


11

Krep Yığını , 532 bayt

Put this tasty pancake on top!
[]
Put this delicious pancake on top!
[#]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
Put this supercalifragilisticexpialidociouseventhoughtheso pancake on top!
Flip the pancakes on top!
Take from the top pancakes!
Flip the pancakes on top!
Take from the top pancakes!
Put this supercalifragilisticexpialidociouseventhoughthes pancake on top!
Put the top pancakes together!
Show me a pancake!
If the pancake is tasty, go over to "".

Girişin boş bir karakterle sonlandırıldığını varsayar. Strateji aşağıdaki gibidir:

  • Girdi karakterini al
  • Bunun ascii değerini çıkarın 1.
  • Şunu çıkarın 0( 1eğer varsa 0, ya da sahip 0olsak 1).
  • Ascii değerini 0ona ekle
  • Char yazdırın.
  • Tekrar et

10

C: 29

i(char*s){*s^=*s?i(s+1),1:0;}

Burada çevrimiçi deneyin .

XOR numarasına dikkat çektiğin için teşekkürler, Dennis.


8
Daha basit ve daha kısa:i(char*s){while(*s)*s++^=1;}
edc65

1
Teşekkürler, @ edc65! Yinelemeli bir çözümden ziyade yinelemeli bir çözüm olduğundan, bunu kullanmayacağım. Bunun için kredi almak istemem. Bu sizin değiştirilmesi dikkati çekiyor whilebir ile for28 karakter uzunluğunda hala sonuçlarına.
millinon

6
Tercih ettiğiniz gibi. Özyinelemeli bir çözüm talep edilmez ve bence, ne zaman mümkün olursa, yinelemeli bir özyinelemeyi özyinelemeden daha iyidir. Bu özyinelemeli aramayı 10k dizeye uygulayarak eğlenin.
edc65

1
Sonuncusu dışındaki her çağrı, özyinelemeli özyinelemeli çağrı olduğundan, bir derleyicinin yığın çerçevesini yeniden kullanmak için onu bir döngüye dönüştüreceğini iddia edeceğim.
millinon

1
@millinon Kanıtı!
sen02392

9

Python 2.7 - 34 *

Oh, bu ilk ne kadar berbat. Oldukça çirkin, bu bir. 63 karakter.

print''.join([bin(~0)[3:] if x == '0' else bin(~1)[4:] for x in ''])

Bu biraz daha iyi ama yine de o kadar da süslü değil. 44 karakter.

print''.join([str(int(not(int(x)))) for x in ''])

O zamanlar 0 değilse ve yanlış ise int(x) and 1döner int(x). Çözelti ayrıca 36 karaktere düşürülebilir.

print''.join([str(1-int(x)) for x in ''])

Bu yana join()bir jeneratör alır parantez çıkarılabilir. 32 karakter.

print''.join(str(1-int(x))for x in'')

Ve backticks yerine kullanılabilir str()

print''.join(`1-int(x)`for x in'')

@TheRare'in işaretçileri sayesinde 34'ten 44'e düşürüldü

Birinin tamamlayıcısını bulmak python için zordur, çünkü bin(-int)-0bxxx döndürür, bu yüzden yukarıdakileri döndürür.


2
Ya, bilirsin, (int(x) and 1) == int(x)
14'te

@TheRare Yapmadım, bunun için teşekkürler :)
Bassem

1
Kayıt için: sıfır yanlış ve sıfır olmayan doğru. Herhangi bir sekans türü için (list, string ...) aynı kural geçerlidir ancak sekansın uzunluğundan kontrol edilir. Böylece '' == Falseve'hi' == True
seequ

1
Bazı boşlukları özlemiş gibisin. Ayrıca, repr () yerine backticks kullanılabilir. ''.join(`1-int(x)`for x in'')
seequ

1
Fyi, repr(x)x <maxlnt eşittirstr(x)
seequ

7

Perl, 9 karakter

'y/10/01/'

9. karakter “p” bayrağıdır.

Kullanımı:

$ echo '10101001' | perl -pe 'y/10/01/'

2
Ayrıca, bir baş komut dosyası olarak da çalışır, y/10/01/ancak bir karakter daha kısadır, çünkü herhangi bir bayrak gerekmez

4
Burada tek bir alıntıya ihtiyacınız yok.
Konrad Borowski

7

Javascript ( ES6 ) 36

alert(prompt().replace(/./g,x=>x^1))

İçerisinde giriş varsayarak s, s.replace(/./g,x=>x^1)22 karakter vardır.
Oriol

2
Aslında çıktı ve giriş yapmayı seviyorum.
nderscore

@nderscore 2 karakter kazanın:p=prompt(p().replace(/./g,x=>x^1))
Gaurang Tandon

@ GaurangTandon olması gerekecek (p=prompt)(p().replace(/./g,x=>x^1))ve bu aynı uzunluk.
nderscore

@nderscore Ben de öyle düşündüm ama parantezsiz de işe yaramaz.
Gaurang,

7

Labirent , 6 bayt

(Labirent, bu mücadeleden daha yeni, bu yüzden bu cevap rekabet etmiyor - yine de kazanıyor değil ...)

1,
.$@

Bu kod STDIN’in yalnızca içerdiğini varsayar rakamları (özellikle yeni satır yok).

Talimat işaretçisi (IP), sol üst köşede sağa doğru ilerleyerek başlar. Okumak için rakamlar varken, soldaki 2x2 bloğun içinden geçen sıkı bir döngüde dönecektir: 11'e basın, ,bir rakam okuyun $, son parçayı değiştirmek için 1 ile XOR'a .basın, sonucu yazdırın. IP bu döngüyü alır çünkü yığının üstü XOR'dan sonra pozitif olur, öyle ki sağa döner. EOF'ye bastığımızda, bunun yerine ,geri döner -1. Sonra XOR üretecek -2ve bu negatif değerle IP sola dönüşe geçecek @ve program sona erecektir.

Bu çözüm, Labirent için ideal olmalıdır: ihtiyacınız olan ,ve .bir G / Ç döngüsü için ve @programı sonlandırmak için. Son biti değiştirmek için en az iki karakter (burada 1ve $) gerekir. Ve sonlandırılabilen bir döngü için en az bir yeni hatta ihtiyacınız var.

STDERR'yi yok sayarsak, yani bir hata ile sonlandırmaya izin vermezsek, onu kaydedebiliriz @ve ayrıca iki yol arasında geçiş yapmak için herhangi bir yola ihtiyacımız yoktur. Yanlışlıkla negatif bir değer ( -2) basmaya çalışıncaya kadar okumaya ve yazdırmaya devam ediyoruz . Bu, en az iki adet 5 baytlık çözüm sağlar:

1,
.$
,_1$.



4

Python 2.x - 44 bayt

print''.join(`1-int(x)`for x in raw_input())

Neden onu karmaşık yapıyor veya bazı hileli değişkenleri kullanıyorsunuz?


Olası böyle bazı ekstra karakter kaydetmek için: print''.join('1-int(x)'for x in'input()'). Yorum kodundaki geri tepmeleri alamadım, bu yüzden 'ile değiştirdik.
Willem

@willem Gelecekte başvurmak için, bir ters eğik çizgi ile onlardan kaçabilirsiniz: `a\`b`-> a`b.
nyuszika7h

@ willem 0 ile başlayan giriş veya maxint'den büyük giriş için çalışmaz (base10'da).
seequ

Thanks @ nyuszika7h ve bu davalar hakkında düşünmedim TheRare bu yüzden çözümünüz iyi
Willem

@willem Böyle şeyleri unutmak çok kolay. :)
seequ

4

R, 27 karakter

chartr("01","10",scan(,""))

Kullanımı:

> chartr("01","10",scan(,""))
1: 10101110101010010100010001010110101001010
2: 
Read 1 item
[1] "01010001010101101011101110101001010110101"



3

TI-BASIC, 7 bayt

Bu, Ansgirdi olarak (içinden ) bir ikili dize alan ve çıktıyı belirtildiği gibi ters çevrilmiş (ters değil) bir dize olarak döndüren bir işlevdir . Daha fazla yardım için liste uygulamasını not(TI-BASIC wiki sayfasından okuyabilirsiniz . Derlenmiş sürümü kullanıyorum çünkü daha küçük:

»*r>Õ¸r

Onaltılı olarak:

BB 2A 72 3E D5 B8 72

açıklama

»*r - Fonksiyon girişini string olarak alın ve listeye dönüştürün

> - Sonraki operatörlere verilen boru listesi

Õ¸r - Listenin tersini döndür


sonunda boşlukların tümü »*r>Õ¸r nedir?
kitcar2000

@ kitcar2000 Hata! Bundan sonra HEX'e sahiptim. Ama taşıdıktan sonra, boşlukları kaldırmayı unuttum ... Şimdi yaptım.
Timtech

Şunlara dikkat etmek yararlı olacaktır: 1. Hesap makinesinde bu expr(Ans:Returnnot(Ans; 2. Dize virgüllerle ayrılmadığından ve a ile başlamadığından {, 1000010011 gibi bir tamsayı olarak değerlendirilir; 3. ReturnYazdığınız şekilde çalışmaz; 4. Bu bir dize değil, bir liste olarak çıktı verir.
lirtosiast

3

Haskell, 22 bayt

map(\c->"10"!!read[c])

Haskell'in bu zorluğa yönelik çözümlerinin bulunmamasından şaşırdım, işte bir tane. Bir dize alan ve tersini döndüren bir işlevi değerlendirir.

açıklama

Burada süslü bir şey yok.

map(\c->             )  -- For each character c in the input string:
                  [c]   -- wrap c into a string,
              read      -- convert to integer,
        "10"!!          -- and index the string "10" with it.

3

Befunge 93, 25 bayt

0>~1+:#v_$>:#,_@
 ^   -1<

Boş yığının ve EOF'nin ikisinin de -1 okuduğunu varsayarsak.

0 boş bir sonlandırıcı olarak bir \ 0 iter

>~1+:#v_ bir giriş döngüsü, ascii okur, 1 ekler, EOF + 1 = 0 olup olmadığını kontrol eder,

^ -1< başka 1 çıkarır ve itti ascii değerini yığında bırakır.

$>:#,_@ sıfıra ek kopyayı yığının üstüne bırakır, sonra ikili dizeyi yukarıdan aşağıya yazdırır

Boş yığın 0 ise, 2 bayt ile kaydet

>~:1+#v_$>:#,_@
^   -1<

EOF = 0 ise, aynı algoritmayı kullanarak 15 baytlık bir sürüm mümkündür, ancak test etmek için kullanışlı bir uygulamaya sahip değilim.


3

Javascript ES6, 26 karakter

s=>s.replace(/\d/g,x=>x^1)

3
Neden / \ d / g değil /./g
l4m2


2

Python3, 39

Metinler Python bunun için en iyi dil değil. :)

for i in input():print(1-int(i),end='')

Çıktıdan sonra yeni bir satıra sahip olmayı düşünüyorsanız, işte 43 karakterlik bir alternatif:

print(''.join("01"[i<"1"]for i in input()))

Kod end=''sadece bir ,vasiyetname olmadan çalışacaktır :) - boşluk olmadığına dikkat etmediğiniz sürece
Harry Beadle

@BritishColour, hayır, bu Python2. Python3'ün printişlevi end, her baskının sonunda yeni bir satırı bastırmak için parametrenin ince ayarını gerektirir . Ayrıca, OP'nin şartnamesine göre, boşluk olmadığı umurumda. :) Yine de yorumunuz için teşekkürler!
DLosc

Aww, harika, bunu bilmiyordum! Ben çoğunlukla 2.7 'de çalışıyorum: /
Harry Beadle

2

J - 11 karakter

J'deki Boolean değerleri tamsayılar olarak temsil edilir 0ve 1bunlar elbette diziler için geçerli indislerdir (bu durumda, 2 karakter dizisi '01')

'01'{~'0'&=

Bence bu cevap teknik olarak bir dizge yerine bir boolean dizisi çıkaran en üstteki J cevabından daha doğru.
gar

Ben aslında gönderdiğimde en üst düzey J çözümünü fark etmedim (nasıl özlediğimi bilmiyorum ama yaptım). Bu çözüm için dürüst olmak gerekirse, açıkça “diğer çözümlerin yaptığı şeyi yapmaz” diyor. BTW, bu (değişmeyen çıktı) çözümünü 11 karakterde ifade etmenin bir başka yolu [:, ": @ = & '' 0 ''.
Dan Bron

Merhaba, başka bir kod için teşekkürler! Sizlerden daha fazla J öğreneceğim. Bu ifade hakkında, eşit işarete atıfta bulunduğunu, atama yerine her maddeyi karşılaştırdığını düşünüyorum.
gar

2

C #, 131 bayt

Partiye biraz geç kaldım, ama işte benim. :)

using System;class R{static void Main(string[]a){foreach(var v in a[0].ToCharArray()){Console.Write(int.Parse(v.ToString())^1);}}}

2

MATLAB, 13 bayt

@(x)[97-x '']

Yukarıdakileri çalıştırdıktan sonra, ters çevrilmiş dizgeyi almak için işlevi giriş dizginizle çağırmanız yeterlidir. Örneğin çalışan:

ans('10101110101010010100010001010110101001010')

baskılar:

01010001010101101011101110101001010110101

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.