Bir tamsayının +, - işlemleri kullanmadan 2 değeri olup olmadığını kontrol edin [kapalı]


30

Tamsayının 2 olup olmadığını kontrol eden bir program yazın.


Örnek giriş:

8

Örnek çıktı:

Yes

Örnek giriş:

10

Örnek çıktı:

No

Kurallar:

  • Kullanmayın +, -işlemler.

  • Numarayı almak için bir tür giriş akışı kullanın. Girişin başlangıçta bir değişkende saklanması gerekmiyor.

  • En kısa kod (bayt cinsinden) kazanır.

Herhangi bir truthy / falsy yanıtını kullanabilirsiniz (örneğin, true/ false). Giriş numarasının büyük olduğunu varsayabilirsiniz 0.


1
Ayrıca "evet" yerine "doğru" ve "hayır" yerine "yanlış" yazmasına izin verilir mi?
ProgramFOX

2
Evet, herhangi bir olumlu / olumsuz yanıtı kullanabilirsiniz. Soru güncellendi.
gthacoder

1
predFonksiyonu, bir tam sayıdır, n uygulanan döner N - 1. Bu gibi fonksiyonlardır, yasak operatör çevresinde ince maskeler olup, ayrıca yasak?
Wayne Conrad,

1
@Wayne aynı golfscript'in ), ya da çoğu c tabanlı dilin 'gibi --.
Doorknob

2
Gelecekte 3 yıl olduğumuzu biliyorum, ancak "+/- operatörleri" gözlemlenemez veya en azından zayıf bir şekilde tanımlandı.
ATaco

Yanıtlar:


13

GolfScript, 6 karakter, azalma yok

~.3/&!

İşte kullanmayan bir çözüm x & (x-1)yöntemi herhangi formda. Bunun x & (x/3)yerine kullanır . ;-) 0False 1ise çıktı, true ise.

Açıklama:

  • ~ sayıyı döndürmek için giriş dizesini değiştirir,
  • .kopyalar (sonrakiler için &),
  • 3/ üçe bölünür (kısaltılır),
  • & bölünmüş değerin bit cinsinden AND değerini orijinalle hesaplar; bu değer, yalnızca giriş sıfırsa veya ikinin gücü olduğunda (yani en fazla bir bit ayarlanmışsa) sıfır olur ve
  • ! Mantıksal olarak bunu reddeder, sıfıra bir ile diğer tüm değerleri sıfıra eşler.

Notlar:


Bence biraz saçma, golfscript, OP'nin aslında kuralları çiğnemeden dışlamak istediği kesin çözümü yazmasına izin veriyor.
Tim Seguine

1
@Tim: Tamam, işte o zaman azalması olmayan bir tane. ;)
Ilmari Karonen

bu nasıl çalışabilir? Örneğin 7/3 = 2 (0010), bu yüzden 7 & 2 = 0111 & 0010 = 0010hangi açıkça son biti 1 değil
phuclv

@ LưuVĩnhPhúc: Hayır, fakat ikinci bit. İkilik olarak 3'e kadar uzun bölümler yapmayı deneyin ve temettü birden fazla bit ayarladıysa bunun neden her zaman olduğu açıktır.
Ilmari Karonen

ah "
bölü

15

APL (7)

Evet, bu 7 bayttır . Şu an için Unicode yerine IBM codepage 907 kullandığımı ve sonra her karakterin bir bayt olduğunu varsayalım :)

0=1|2⍟⎕

yani 0 = mod(log(input(),2),1)


Sadece merak ediyorum, 0 ya da negatif bir sayı verirseniz ne olur?
aditsu

@ aditsu sonsuzluk mod 1'in ne olduğunu bilmiyorum, ama kesinlikle sıfır olmamalıdır .
Tim Seguine

1
@TimSeguine Mathematica, Indeterminatebunu denediğimde bana veriyor .
LegionMammal978

7

GolfScript, 11 (1 (doğru) ve 0 (yanlış))

.,{2\?}%?0>

Numarayı yığına koyun ve sonra çalıştırın.

GolfScript, 22 (Evet / Hayır için)

.,{2\?}%?0>'Yes''No'if

Dönüştürme nasıl Seviyorum 1/ 0için Yes/ Nomeydan kendisi kadar kod olarak alır: D

Uyarı: KESİNLİKLE verimsiz;) 10000'e kadar sayılar için iyi çalışıyor, ancak bir kez o kadar yükselirseniz hafif bir gecikme fark etmeye başlarsınız.

Açıklama:

  • .,: Dönüşler niçine n 0..n( .yinelenen, ,0..n aralık)
  • {2\?}: 2 gücüne
  • %: harita "2" nin gücü "0..n" yerine n [1 2 4 8 16 ...]
  • ?0>: dizinin sayı içerip içermediğini kontrol eder (0, indeksten büyüktür)

1
Evet / Hayır için 1 bayt daha kısa .,{2\?}%?0<'YesNo'3/=:; Ayrıca bence "Numarayı yığına koy" diyerek hile yapıyorsunuz, a ile başlamalısınız ~.
aditsu

1
1'de başarısız olur, ki bu 2 ^ 0
Joachim Isaksson

6

Mathematica 28

Numerator[Input[]~Log~2]==1

2 tamsayılı güçler için, 2 baz kütüğünün payı 1 olacaktır (kütüğün bir birim kesir olduğu anlamına gelir).

Burada varsayılan girişi görüntülemek için fonksiyonu biraz değiştiriyoruz. Biz kullanmak #yerine Input[]ve eklemek &saf fonksiyonunu tanımlamak için. Kullanıcı yukarıdaki fonksiyonda sayıyı girerse geri döndürülecek cevabı verir.

    Numerator[#~Log~2] == 1 &[1024]
    Numerator[#~Log~2] == 1 &[17]

Doğru
Yanlış

Bir seferde birkaç sayıyı test etmek.

    Numerator[#~Log~2] == 1 &&/@{64,8,7,0}

{Doğru, Doğru, Yanlış, Yanlış}


4

Perl 6 (17 karakter)

say get.log(2)%%1

Bu program, STDIN'den bir hattı alır get, fonksiyon o (ilgili taban 2 ile logaritma hesaplar log(2)(1 ile böler varsa) ve kontrol %%1, %%operatörün bölme olan). GolfScript çözümü kadar kısa değil, ama bunu kabul edilebilir buluyorum (GolfScript zaten her şeyi kazanıyor), ama çok daha hızlı (Perl 6'nın şu anda yavaş olduğunu düşünüyor olsa bile).

~ $ perl6 -e 'say get.log(2)%%1'
256
True
~ $ perl6 -e 'say get.log(2)%%1'
255
False

2
Bu zorluğun yasaklanmasının +ve -yasaklanmasının nedeni, eğer x & (x - 1)eşitse 0, o zaman x2'nin gücüdür.
ProgramFOX

@ProgramFOX: Anladım. İlginç numara.
Konrad Borowski

1
@ProgramFOX Ama x&~(~0*x)yine de çalışıyor. Bu sadece 2 karakter daha uzun.
orlp

4

Oktav ( 15 23)

EDIT: Kullanıcı girişi gereksinimi nedeniyle güncellendi;

~mod(log2(input('')),1)

Kullanıcının bir değer girmesine izin verir ve true için 1, false için 0 verir.

Octave'da test edilmiş, Matlab'da da çalışmalı.


Matlab'da da çalışır :)
jub0bs

4

R, 13 11

Perl çözümüne göre. FALSEVeya döndürür TRUE.

!log2(i)%%1

Parametre i, giriş değişkenini temsil eder.

Kullanıcı girişi olan alternatif bir versiyon:

!log2(scan())%%1

4

GolfScript, 5

Doğru için 1, yanlış için 0 çıktı. User3142747'nin fikrine dayanarak:

~.(&!

Not: (Azalmadır, umarım sayılmaz -:)
Olursa (ve OP'nin yorumları olabileceğini söylüyorsa), lütfen bunun yerine Ilmari Karonen'in çözümüne bakın .
Y / N çıktısı 'NY'1/=için sonuna ekleyin (7 bayt daha).


4

Python, 31

print 3>bin(input()).rfind('1')

31 yaparsanızbin(input()).rfind('1')<3
Blender

@ Blender İyi benekli. Ben de kullandım 2==çünkü pozitif olmayan numaralar için de işe yarayacağını düşündüm. Açıkça kurallarının gerektirdiği değil o yüzden ...
Boothby

1
+1. Ben göndermek için gidiyordu print bin(input()).count('1')<231 karakterden toplam en ama sizinkine çok benziyor.
Steven Rumbalski

4

C, 48

main(x){scanf("%i",&x);puts(x&~(x*~0)?"F":"T");}

Unary negatife izin verilirse daha kısa, negatif sabitlere izin verilmiyorsa daha uzun olabilir. İkisinin tamamlayıcısı kabul eder.
orlp

*İkili dosyalardan daha yüksek önceliğe sahiptir &, parene ihtiyacınız yoktur. Ve eğer iade değeri kabul edilirse (sadece sorulursa) exit(x&x*-1)çok daha kısa olur.
Kevin

Bir yoktur -: x*-1.
klingt.net

@ klingt.net evet, ancak bu sayısal bir sabitin parçası. Teknik olarak, şu anda ifade edildiği gibi, sadece operatör -yasaktır.
Kevin

1
@ klingt.net İşaret içermeyen bir sürümle değiştirildi.
orlp

4

Nüfus sayımına veya sayının yan toplamına (1-bit sayısı) dayanarak başka bir yaklaşım kullanmaya karar verdim . Fikir, ikisinin tüm güçlerinin tam olarak bir 1bitinin olduğu ve başka hiçbir sayının olmadığıdır. Bir JavaScript sürümü ekledim çünkü eğlenceli buldum, ancak kesinlikle herhangi bir golf yarışmasını kazanmayacak.

J, 14 15 karakter (0 veya 1 çıkış)

1=##~#:".1!:1]1

JavaScript, 76 karakter (çıktılar doğru veya yanlış)

alert((~~prompt()).toString(2).split("").map(Number).filter(Boolean).length)

Bu, meydan okuma tarafından engellenen bir toplama kullanır.
FUZxxl,

Huh. Bunu yazarken ne düşündüğümü bilmiyorum ... Şimdi düzelttim, böylece kurallara uyuyor.
FireFly

4

Klips , 9 8 7

!%lnxWO

Stdin'den bir sayı okur.

Açıklama:

Z= 0, W= 2Ve O= 1 ile başlamak . Bu, birbirinin içine Wve Oyanına yerleştirilmesine izin verirken, kullanıldığında 2ve 1aralarında boşluk bırakılmadan 21 sayısı olarak yorumlanmasını (istenmeyen bir ekstra karakter) sağlar. Klip'te, modulo işlevi ( %) tamsayı olmayanlar üzerinde çalışır, bu nedenle bazı değerlerin vbir tamsayı olup olmadığını kontrol etmek için, vmod 1 = 0 olup olmadığını kontrol edin . Clip sözdizimini kullanarak, bu şekilde yazılır =0%v1. Bununla birlikte, boolean'lar 1(veya başka bir şey) olarak saklandığı ve 0bir şeyin eşit olup olmadığını kontrol etmek 0sadece 'fark etmiyor'. Bunun için Clip !operatöre sahiptir. Benim kodunda, volduğu lnx2. xstdin'den bir girdidir,nBir dizgiyi sayıya dönüştürür velabgünlük nokta barasında a. Bu nedenle program (daha okunaklı) ile çevrilir 0 = ((log base 2 of parseInt(readLine)) mod 1).

Örnekler:

8

çıktılar

1

ve

10

çıktılar

0

Düzenleme 1: değiştirilir 0, 1ve 2ile Z, Ove W.

Düzenleme 2: değiştirilmiştir =Zile !.

Ayrıca:

Pyth , 5

Pyth, halihazırda değerlendirilmiş girdi için Q'ya ve sadece genel log (a, b) yerine log2 (a) fonksiyonuna sahip olduğundan, Clip versiyonunu daha da sıkıştırır.

!%lQ1

3

Javascript (37)

a=prompt();while(a>1)a/=2;alert(a==1)

Basitçe tekrar tekrar 2'ye bölen ve kalanı kontrol eden basit bir komut dosyası.


1
bir fordöngü ile aynı fikir (ayrıca 37 karakter)for(i=prompt();i>1;i/=2){}alert(i==1)
Matematik chiller

3

Mathematica (21)

IntegerQ@Log2@Input[]

Giriş olmadan biraz daha kısa

IntegerQ@Log2[8]

Doğru

IntegerQ@Log2[7]

Yanlış


⌊#⌋==#&@Log2@Input[]
alephalpha

1
@alephalpha UTF-8 karakterleri için 24 bayt kullanarak sona erer. Başka bir 21 baytlık program Log2@Input[]~Mod~1==0.
LegionMammal978

2

JavaScript, 41 40 karakter

l=Math.log;alert(l(prompt())/l(2)%1==0);

Bu nasıl çalışır: kullanarak üs 2'de logaritma alırsınız l(prompt()) / l(2) ve bu modulo 1 sıfıra eşitse, o zaman 2'nin gücü olur.

Örneğin: 8 logaritmasını baz alındıktan sonra 2elde edersiniz 3.3 modulo 10'a eşittir, bu doğru olur.

2 numaralı üssün 7 logaritmasını aldıktan sonra elde edersiniz 2.807354922057604. 2.807354922057604 modulo 1eşittir 0.807354922057604, bu yüzden yanlış döndürür.


Girişi sayıya çevirmenize gerek yoktur; Math.logbunu zaten yapacak : "Aşağıdaki Math nesne işlevlerinin her biri, ToNumber özet operatörünü bağımsız değişkenlerinin her birine uygular ..."
apsillers

Sayısal yanlışlıklardan muzdarip değil mi?
Mark Jeronimus

@ MarkJeronimus: Aslında bilmiyorum. Olabilir, ama henüz yanlış bir sonuçla karşılaşmadım.
ProgramFOX

2

JavaScript, 35

Bayt için çalışıyor.

alert((+prompt()).toString(2)%9==1)

46 karakter sürümü , 16 bit sayılar için çalışır.

x=(+prompt()).toString(2)%99;alert(x==1|x==10)

Hile en dinamik dillerde çalışır.

Açıklama: Sayıyı taban 2'ye dönüştürün, bu dizgiyi taban 10 olarak yorumlayın, 1 olması gereken sayı toplamını elde etmek için modulo 9 yapın.


Peki ya 0x2ff, üs 2'de hangisi 1111111111?
Peter Taylor,

@PeterTaylor Haklısın, düzeltildi
kopyala

Yaptığınız gerçek şey geri kalan kısmı olmadan modulo 10'u kontrol etmek, fakat kodunuzun bir karakterini tıraş etmek için 9 kullandınız +1!
Matematik chiller,

Bu biraz aldatma ama başka bir yöntem:alert(!(Number.MAX_VALUE%prompt()))
Pluto


2

python 3, 38

print(1==bin(int(input())).count('1'))

python, 32

However, the code doesn't work in every version.

print 1==bin(input()).count('1')

Notice that the solution works also for 0 (print False).


Upvoted because this was my solution as well.
Josh Caswell

1
What if you replace == with &?
SimonT

@SimonT This is not true. Replacing the '==' with '&' will print 1 for every number that has odd number of '1' in its binary representation. Check for example 7=111. There are 3=11 ones. It will return 11&1 = 1.
Gari BN

2

Ruby — 17 characters (fourth try)

p /.1/!~'%b'%gets

My current best is a fusion of @steenslag's answer with my own. Below are my previous attempts.

Ruby — 19 characters (third try)

p /10*1/!~'%b'%gets

Ruby — 22 characters (second try)

p !('%b'%gets)[/10*1/]

Ruby — 24 characters (first try)

p !!('%b'%gets=~/^10*$/)

there's still a "+" in your program
phuclv

I know. :-/ I've asked for clarification whether '+' and '-' are strictly forbidden, or whether they can be used in other contexts besides addition and subtraction. I'm in the process of rewriting regardless.
O-I

Great improvement. It seems like it's the best Ruby result so far. I updated the leaders table in the question text.
gthacoder

@gthacoder Just combined steenslag's regex with my binary formatting. Definitely can't take all the credit.
O-I

2

K/Kona (24 17)

d:{(+/(2_vs x))~1

Returns 1 if true and 0 if false. Any power of 2 has a single bit equal to 1:

2_vs'_(2^'(!10))
(,1
1 0
1 0 0
1 0 0 0
1 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0)

(this prints out all the powers of 2 (from 0 to 9) in binary)

So I sum up all the components of the binary expression of x and see if it's equal to 1; if yes then x=2^n, otherwise nope.

...knew I could make it smaller


@gthacoder: I made the code smaller, hope you can update you main post to reflect this!
Kyle Kanos

Doesn't this use addition? And doesn't the question, err, forbid that?
zgrep

2

C# (54 characters)

 Math.Log(int.Parse(Console.ReadLine()),2)%1==0?"Y":"N"

The task clearly states that input is not stored in a variable, it should be obtained from an input stream of some kind (like stdin), also, this is code-golf, try shortening your code a little, at least by removing whitespace
mniip

I think you just mean Int32, not ToInt32...
Chris

Ya ya. Thanks for pointing out Chris. Earlier it was Convert.ToInt32 and I wanted to change it to Int32.Parse to shorten it. :D
Merin Nakarmi

2
use int instead of Int32 for 2 fewer characters.
Rik

2

Rebmu (9 chars)

z?MOl2A 1

Test

>> rebmu/args [z?MOl2A 1] 7
== false

>> rebmu/args [z?MOl2A 1] 8 
== true

>> rebmu/args [z?MOl2A 1] 9 
== false

Rebmu is a constricted dialect of Rebol. The code is essentially:

z? mo l2 a 1  ; zero? mod log-2 input 1

Alternative

14 chars—Rebmu does not have a 'mushed' bitwise AND~

z?AND~aTIddA 3

In Rebol:

zero? a & to-integer a / 3


1

Python, 35

print bin(input()).strip('0')=='b1'

Doesn't use not only +/- operations, but any math operations aside from converting to binary form.

Other stuff (interesting, but not for competition):

I have also a regexp version (61):

import re;print re.match(r'^0b10+$',bin(input())) is not None

(Love the idea, but import and match function make it too long)

And nice, but boring bitwise operations version (31):

x=input();print x and not x&~-x

(yes, it's shorter, but it uses ~-x for decrement which comtains - operation)


boothby's answers uses the same idea as my first, but is shorter :(
Ivan Anishchuk

1

Python 2.7 (30 29 39 37)

EDIT: Updated due to user input requirement;

a=input()
while a>1:a/=2.
print a==1

Brute force, try to divide until =1 (success) or <1 (fail)


1
not a%2 can be written as a%2==0. Granted, this would be longer in many languages, but not Python.
Konrad Borowski

@xfix Thanks, tested and updated.
Joachim Isaksson

1
or even better, a%2<1.
boothby

you have a space after 2. Removing that would save a byte!
Keerthana Prabhakaran

1

Python (33)

print int(bin(input())[3:]or 0)<1

int(bin(input()*2)[3:])<1 also works from the python shell with only 25 chars.
gmatht


1

APL (12 for 0/1, 27 for yes/no)

≠/A=2*0,ιA←⍞ 

or, if we must output text:

3↑(3x≠/A=2*0,ιA←⍞)↓'YESNO '

Read in A. Form a vector 0..A, then a vector 20..2A (yes, that's way more than necessary), then a vector comparing A with each of those (resulting in a vector of 0's and at most one 1), then xor that (there's no xor operator in APL, but ≠ applied to booleans will act as one.) We now have 0 or 1.

To get YES or NO: multiply the 0 or 1 by 3, drop this number of characters from 'YESNO ', then take the first 3 characters of this.


1

C, 65 bytes

main(k){scanf("%i",&k);while(k&&!(k%2))k/=2;puts(k==1?"T":"F");}

You can cut off 5 chars by using main(k){..., relying on the implicit int typing. It might be UB, but this is code golf. NEVER use something like that in production, of course.
Kevin

1

Haskell (52 50)

k n=elem n$map(2^)[1..n]
main=interact$show.k.read
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.