Bir Tepegöz numarası mı? "Kimse bilmiyor!


66

Görev:

Bir tamsayı girişi verildiğinde, bunun bir Tepegöz Numarası olup olmadığını anlayın.

Bir Tepegöz numarası nedir, sorabilirsiniz? Eh, bu ikili temsili sadece 0merkezinde bir tane olan bir sayı !

Test Durumları:

Input | Output | Binary  | Explanation
--------------------------------------
0     | truthy | 0       | only one zero at "center"
1     | falsy  | 1       | contains no zeroes
5     | truthy | 101     | only one zero at center
9     | falsy  | 1001    | contains two zeroes (even though both are at the center)
10    | falsy  | 1010    | contains two zeroes
27    | truthy | 11011   | only one zero at center
85    | falsy  | 1010101 | contains three zeroes
101   | falsy  | 1100101 | contains three zeroes
111   | falsy  | 1101111 | only one zero, not at center
119   | truthy | 1110111 | only one zero at center

Giriş:

  • Bir tam sayı veya eşdeğeri tür. ( int, long, decimalVs.)

  • Girdiyi değerlendirmenin bir tamsayı taşması veya diğer istenmeyen sorunlarla sonuçlanması durumunda, o girişin değerlendirilmesi gerekmediğini varsayalım.

Çıktı:

  • Gerçek veya sahte.

  • Truthy / falsy çıktısı, kullanılan dilin truthy / falsy şartnamesini karşılamalıdır. (örneğin, C 0kadar yanlış, sıfır kadar sıfır değil)

Mücadele Kuralları:

  • 0'dan küçük olan girdilerin sahte olduğu varsayılır ve bu nedenle değerlendirilmeleri gerekmez.

  • Sayının ikili gösteriminin uzunluğu eşitse, sayı bir Tepegöz sayısı olamaz.

Genel kurallar:


Bu benim ilk Programlama Bulmacaları ve Kod Golf yarışması, bu yüzden nasıl geliştirmem gerektiğine dair herhangi bir geri bildirim çok takdir edilecektir!


25
Not: Bu A129868
TSH

35
Başlığında 2800 yıl geç pop kültür referansı için +1
Sanchises

test edilecek maksimum sayı nedir?
Serverfrog

@Serverfrog bir sınır belirtmediğimden beri, herhangi bir pozitif tamsayının test edilebileceğini varsayalım.
Tau

İkili girişe izin verilir mi?
Qwertiy

Yanıtlar:


11

Japt, 8 bayt

1¥¢q0 äè

Çevrimiçi çalıştır

Açıklama:

1¥¢q0 äè   
                                                              119
  ¢          // Convert the input into a binary string        "1110111"
   q0        // Split the string on "0"                       ["111","111"]
      ä      // Reduce each item by:                            a     b
       è     //   Seeing how many times a is found in b       [1]
 1¥          // == 1; See if the result equals 1              True                                         

Buradaki fikir 0, sadece bir tane varsa iki öğe verecek olan ikili dizgeyi bölmektir 0. Ardından, palindromik olduğundan emin olmak için ilk öğenin ikinciyle eşleşip eşleşmediğini görürüz. İkili dize birden çok 0s içeriyorsa , azaltma çok öğeli bir dizi döndürür ve bu ==1koşul başarısız olur . İkili dize birini içeren yaparsa 0, ancak palindromik değildir, äèdönecektir 0çünkü biçerdiği 0Karşılaşmalar a.


1
Burada ne olduğunu görmek için önceden kafeinli beynimi birkaç saniye sürdü! Güzel bitti. ayrıca çalışması gerekir.
Shaggy

1
Japt'u tanımıyorum, fakat doğru anlarsam şunları yapar: ¤= binary; q0= 0'lara bölünmüş; äèTamamen emin değilim ..; bayrak -Nlisteleri dönüştürür NaNfakat yaprakları bırakır 0ve 1aynıdır. İçin äèparçası Bunu görebiliyorum 119olan [111,111]bölünmüş, sonra äèdönüşür 1; ve 85bir [1,1,1,1]bölme, sonra äèdönüşür [1,1,1]. Nasıl .ä("è")çalıştığını açıklayabilir misiniz ?
Kevin Cruijssen

2
@KevinCruijssen Bir açıklama ekledim. Umarım bu yardımcı olur.
Oliver

1
NaNJapt içinde Falsey? Ayrıca (bir koşulu olarak yapar idam olur? "Truthy truthy / falsy için kullanılan dilin özellikleri karşılamalıdır falsy çıktı /" if-else bununla gerçekleştirirseniz yani) 2verim 2şüphe olduğunu Falsey (ama eğer olabilir Japt 05AB1E gibidir).
Jonathan Allan,

1
JS, herhangi bir tamsayı 0gerçeği olarak kabul edilir varsayalım ... ancak, eğer 2gerçek olarak geri 2dönüyorsa, bu gönderimin yeniden yapılması gerekebilir.
Tau

21

Python 2,30 bayt

lambda n:(2*n^2*n+3)**2==8*n+9

Çevrimiçi deneyin!

Bunun 2*n^2*n+3bitsel xor olduğuna 2*nve 2*n+3çünkü Python'un işlecinin önceliği olduğuna dikkat edin.


1
Döngü sayıları için lambda n:(2*n^2*n+3)**2-8*n-9dönüş değeri ile geri dönmek kabul edilebilir mi 0?
Eric Duminil

2
Bu verir TRUEiçinn = -1
user2390246

3
@ user2390246 bu problem açıkça negatifler için tasarlanmamıştır - eğer öyleyse, kabul eden tüm çözümlerin negatif olması gerekir (ve
python'un

3
@SolomonUcko negatif sayıları tipik olarak iki ayrı tamamlayıcı temsilinde saklanır. İlk sabit boyutlu tamsayıları göz önünde bulundurun (örneğin 32 bit). Diğer özelliklerin yanı sıra, TCR, MSB'nin negatif sayılarla 1 ve pozitif olarak 0 olmasını gerektirir. Bu hemen tüm pozitif çıktıların yanlış olmasını gerektirir. Python'da yine de bir problemimiz var. Negatif sayılar dolaylı olarak en anlamlı yönde 1s'lik sonsuz bir diziye sahiptir. Bunun ortasını bulmaya çalışırken iyi şanslar
DreamConspiracy

2
@ user2390246 Sorun, kodumuzun negatifler için çalışması gerekmediğini açıklığa kavuşturmak için düzenlendi. Ekleyerek 2 bayt için kullanılabilir >1.
xnor

18

x86 Makine Kodu, 17 bayt

8D 47 01 31 F8 89 C2 F7 D2 0F AF C2 8D 44 78 02 C3

Yukarıdaki baytlar, 32-bit bir tamsayı giriş değerini kabul eden bir fonksiyon tanımlar ( EDIbu örnekte, ortak bir System V arama kuralını izleyerek kayıt defterinde, ancak elde edilen sonuçların boyutunu etkilemeden istediğiniz herhangi bir giriş kaydını hemen hemen seçebilirsiniz. kodu) ve EAXgiriş değerinin Tepegöz sayısı olup olmadığını belirten bir sonuç ( kayıt defterinde) döndürür .

Girişte işaretsiz bir tamsayı olduğu varsayılmaktadır, çünkü zorluk kuralları negatif değerleri görmezden gelebileceğimizi belirtmektedir.

Karar mantığı Neil'in cevabından ödünç alınmıştır : bir Cyclops numarası , kontrol etmek için bir dizi bit bükme işlemi kullanabiliriz. giriş.n=(2k+1)(2k11)

Not: Dönüş değeri truthy / falsy'dir, ancak semantics ters çevrilir, böylece fonksiyon Cyclops numarası için falsy döndürür. Bunun yasal olduğunu iddia ediyorum, çünkü makine kodu, “gereklilik / yanlışlık için spesifikasyonlar” içermiyor; (Bunun aldatma olduğunu düşünüyorsanız alternatif bir sürüm için aşağıya bakın.)

Assembly dili anımsatıcılarında:

; EDI = input value
; EAX = output value (0 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 02        lea    eax, [eax + edi*2 + 2]  ; EAX  = (EAX + (EDI * 2) + 2)
C3                 ret                            ; return, with EAX == 0 for Cyclops number

Çevrimiçi deneyin!


Söz verildiği gibi, gerçek bir standart veya konvansiyonun olmadığı makine kodunda bile gerçeğin / yanlışlığın anlamını tersine çevirmenin hile yaptığını düşünüyorsanız, toplam 21 bayt için üç bayt daha ekleyin :

; EDI = input value
; AL  = output value (1 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 01        lea    eax, [eax + edi*2 + 1]  ; EAX  = (EAX + (EDI * 2) + 1)
40                 inc    eax                     ; EAX += 1
0F 94 C0           setz   al                      ; AL = ((EAX == 0) ? 1 : 0)
C3                 ret                            ; return, with AL == 1 for Cyclops number

Bu kodun ilk yarısı orjinali ile aynıdır ( imultalimatlara göre). leaHemen hemen aynıdır, ancak bunun yerine sabit bir 2 ekleyerek, sadece aşağıdaki çünkü var sabit 1. ekler inctalimat değerini artırır EAXbayrakları ayarlamak için 1 ile kayıt. "Sıfır" bayrağı ayarlanmışsa, setztalimat AL1 olarak ayarlanacaktır ; aksi takdirde, AL0 olarak ayarlanacaktır. Bu, bir C derleyicisinin a döndürmek için makine kodu üretmesinin standart yoludur bool.

leaTalimatta eklenen sabitin değiştirilmesi açıkça kod boyutunu değiştirmez ve inctalimat çok küçüktür (sadece 1 bayt), ancak setztalimat oldukça çarpıcı bir 3 bayttır. Ne yazık ki, daha kısa bir yazma yolu düşünemiyorum.


4
Bu o kadar hızlı ki, tüm sayıları büyük bir değere kadar test ederek gösterilmeyi hak ettiğini düşünüyorum: Çevrimiçi deneyin!
Deadcode

Aslında daha hızlı olmalı, @Deadcode. :-) Satır içi derleme ile göstermek, bazı ek yükler ekliyor, ancak eski bir bayt dizisine atlamak gibi bir numaram (örneğin, bu cevaba bakınız ) TIO'nun derleyicisiyle çalışmayı bıraktı ve sonuçları doğrudan montajda yazdırmak için kod yazmak çok fazla uğraşmak için çalışmak. Bu, sıra dışı durumlardan biridir, ancak boyut için optimizasyonun hız için optimizasyona bağlı olmadığı durumlar. Bu, boyut aşımı hızını artırıyor olsaydı, kodu asm olarak yazma yönteminizdir.
Cody Gray

Mutabakata göre, bir durum bildirimini bir asm gönderim kodunda döndürmek kabul edilemez. Codegolf.stackexchange.com/a/165020/84624 ve stackoverflow.com/questions/48381234/… . Eğer öyleyse, yapabilirsin - 3 ikinci cevabından.
640KB

9

Regex (ECMAScript), 60 58 57 60 58 bayt

girişi , s dizgisinin uzunluğu kadar tekdüzedir .nx

SPOILER UYARI : Karekök için, bu regex, açık olmayan ve kendi başınıza çalışmanız için ödüllendirici bir bulmaca olabilecek, genelleştirilmiş çarpma algoritmasının bir çeşidini kullanır. Daha fazla bilgi için, Bulunacak bir Rocco numarası bölümündeki algoritmanın bu formu için bir açıklamaya bakın .

-2 bayt arayışında geriye izin vererekz -1 bayt Güvenlik çok kötü sayesinde arayarak, yerine tersi en küçükten en büyüğe doğru sıfır işlemek için +3 bayt lookahead dışında karekök yakalama taşıyarak -2 baytz
z

Bu , olan mükemmel bir kare güç olan bulunmasıyla çalışır . Yalnızca 2'yi aşmayan en büyük mükemmel kare gücü bunu karşılayabilir, ancak golf optimizasyonu nedeniyle, regex hepsini en küçükten başlayarak dener. Her biri bir döngüsel sayıya karşılık geldiğinden, yalnızca en büyüğü bir eşleşmeyle sonuçlanabilir.zn=2(nz)+z+1n

^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$

Çevrimiçi deneyin!

^                 # N = tail
(x*)              # tail = Z, with the smallest value that satisfies the following
                  # assertions (which is no different from the largest value that
                  # would satisfy them, since no more than one value can do so);
                  # \1 = N - Z

(?!(x(xx)+)\2*$)  # Assert Z is a power of 2

# Assert Z is a perfect square, and take its square root
(x(x*))           # \4 = square root of Z; \5 = \4 - 1; tail = N - \1 - \4
(?=(\4*)\5+$)     # iff \4*\4 == Z, then the first match here must result in \6==0
(?=\4*$\6)        # test for divisibility by \4 and for \6==0 simultaneously

# Assert that N == \1*2 + \4 + 1. If this fails, then due to a golf optimization,
# the regex engine will backtrack into the capturing of \4, and try all smaller
# values to see if they are the square root of Z; all of these smaller values will
# fail, because the \4*\4==Z multiplication test only matches for one unique value
# of \4.
x\1$

|^$               # Match N==0, because the above algorithm does not

OP, 0'ın kaba olması gerektiğini netleştirdi, bu yüzden şu anda bu zorluğu çözemiyor.
Grimy

1
^(1*)0\1$Yeterince basit değil mi?
Cehalet

4
@EmbodimentofIgnorance Yalnızca giriş ikili ise. Bu, birçok zorluğu önemsiz kılacaktır; Sürekli uygulanabilir olduğunda unary girişi kullanmak çok daha ilginçtir.
Deadcode

9

JavaScript (Node.js) , 20 bayt

p=>~p==(p^=p+1)*~p/2

Çevrimiçi deneyin!

Belki bu doğrudur, belki de.

Teşekkürler Grimy, 1 bayt kaydedildi.


JavaScript (Node.js) , 32 bayt

f=(p,q)=>p&1?f(p/2,q+q|2):!(p^q)

Çevrimiçi deneyin!


JavaScript (Node.js) , 34 bayt

p=>/^(1*)0\1$/.test(p.toString(2))

Çevrimiçi deneyin!



Test, eşleşmiyor
edc65

1
@ edc65 Başarısız bir test çantası buldunuz mu?
tsh

2
@tsh .testnot.match
ASCII-sadece

@ ASCII-sadece Vay, makul ses ... Bunu nasıl okuyabilirsin?
tsh



7

Mathematica (Wolfram dili), 32 31 bayt

J42161217 sayesinde 1 bayt kurtarıldı!

OddQ@Log2[#+Floor@Sqrt[#/2]+2]&

Çevrimiçi deneyin!

Girdi olarak bir tamsayı alarak ve dönen Trueveya döndüren saf işlev False. Gerçeğine dayanarak (eğlenceli kanıtlamak için!) Bir sayı olduğunu nyalnızca ve eğer Tepegöz olduğunu nkarekökü artı n/2artı 22. garip bir güce aşağı mermi (Tek yerini alabilir Floorya tarafından Ceilingveya Roundsürece bir de değiştirir olarak +2tarafından +1.) TrueGirdiyi döndürür 0.


1
kullanarak 1 bayt kaydedebilirsinizLog2[#+Floor@Sqrt...
J42161217 20.09.2016

ve 1 daha fazlası √()yerineSqrt[]
attinat

Bayt sayısı doğru mu? TIO mevcut program için 32 bayt verir.
mbomb007

@ mbomb007 aha, TIO, J42161217'nin 1-bayt tasarrufunu kullanmadı. Sabit.
Greg Martin,

Attinat'ın önerdiği şeyi kullanmamanın bir nedeni var mıydı?
mbomb007


5

Japt, 8 bayt

¢ðT ¥¢Êz

Gönderimi düzelttiği için Luis felipe de Jesus Munoz'a teşekkürler!

Çevrimiçi Deneyin!

Eski regex tabanlı çözüm, 15 bayt

¤f/^(1*)0\1$/ l

True için 1, false için 0 döndürür.

Çevrimiçi Deneyin!


İyi oynadım, bazen düzenli ifadeler öğrenmeliyim. :) +1
Quintec

1
@ Quintec Regex müthiş :)
Ignorance uygulaması

Güncelleme: kısa yol bulundu :)
Quintec


1
@ LouisfelipeDejesusMunoz Teşekkürler, bu ==operatörün gerçekten hoş bir kullanımı !
Cehalet

4

Jöle ,  8  7 bayt

-1 Outgolfer Erik sayesinde ( ŒḂyerine isPalindrome'u kullanın ⁼Ṛ$)

B¬ŒḂ⁼SƊ

1(Doğruluk) veya 0( falsey) veren bir tamsayıyı kabul eden bir monadik Bağlantı .

Çevrimiçi deneyin!

Nasıl?

B¬ŒḂ⁼SƊ - Link: integer             e.g. 1    9          13         119
B       - to base 2                      [1]  [1,0,0,1]  [1,1,0,1]  [1,1,1,0,1,1,1]
 ¬      - logical NOT (vectorises)       [0]  [0,1,1,0]  [0,0,1,0]  [0,0,0,1,0,0,0]
      Ɗ - last three links as a monad:
  ŒḂ    -   is a palindrome?             1    1          0          1
     S  -   sum                          0    2          1          1
    ⁼   -   equal?                       0    0          0          1

Aslında benden önce zekice bir fikrin var gibi gözüküyor, ancak zekası belli değil ( Bċ0⁼1ȧŒḂayrıca 8 bayt) -1 ile ⁼Ṛ$aynı ŒḂ. Ayrıca, negatif sayılarla işlem yapmanıza gerek yoktur.
Outgolfer Erik

Teşekkürler Erik, bu palindrome yerleşik bir nedenden dolayı fikrimi kaybetti!
Jonathan Allan,

Aslında, ṚƑbugünlerde onun yerine de kullanabilirsiniz , bu yüzden onu hatırlamak isteyebilirsiniz (en önemlisi Ƒ).
Outgolfer Erik



4

Brachylog , 8 bayt

ḃD↔Dḍ×ᵐ≠

Bu, girişinin Cyclops numarası olması durumunda başarılı olur ve girişi Cyclops numarası değilse başarısız olur. Başarı / başarısızlık, Brachylog'daki en temel truthy / falsey konseptidir.

Çevrimiçi deneyin! Veya 10000'e kadar tüm gerçek çıkışları bulun .

açıklama

          Input is an integer
ḃ         Get its binary representation, a list of 1's and 0's
 D        Call that list D
  ↔       When reversed...
   D      It's the same value D
    ḍ     Dichotomize: break the list into two halves
          One of these halves should be all 1's; the other should contain the 0
     ×ᵐ   Get the product of each half
       ≠  Verify that the two products are not equal

Bu sadece bir Tepegöz numarası verildiğinde başarılı olur, çünkü:

  • İkili gösterim bir palindrom değilse D↔D, başarısız olur; takip eden bölümde bunun bir palindrom olduğunu varsayabiliriz.
  • Birden fazla sıfır varsa, her iki yarıda en az bir sıfır içerecektir. Böylece ürünler hem sıfır olacak, hem de ×ᵐ≠başarısız olacak.
  • Sıfır yoksa, her iki yarıda da sadece bir tane bulunur. Bu yüzden ürünler hem bir olacak, hem ×ᵐ≠de başarısız olacak.
  • Bu, tam olarak bir sıfır olduğu durumdan çıkar; Zaten bir palindromumuz olduğunu bildiğimizden, bu merkezî bit olmalı. Bir yarıda görünecek ve bu yarının ürününün sıfır olmasına neden olacak; diğer yarısı da hepsini içerecek, bu yüzden ürünü bir olacak. Öyleyse 1 ≠ 0 değerine sahibiz, ×ᵐ≠başarılı ve bütün belirteç başarılı.

3

Ruby , 27 24 bayt

İkili dosyaya dönüştürün ve bir regex ile kontrol edin. İade 0, eğer doğruysa nilyanlış ise.

GB sayesinde -3 bayt .

->n{"%b"%n=~/^(1*)0\1$/}

Çevrimiçi deneyin!

İki byte daha fazlası için, Python çözümünün doğrudan bir bağlantı noktası var:

->n{(2*n^2*n+3)**2==8*n+9}

@ GB Çok teşekkür ederim!
Eric Duminil

3

05AB1E , 8 (veya 9) bayt

bD0¢sÂQ*

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

İade 1truthy eğer; 0veya 1falsey dışındaki herhangi bir pozitif tamsayı . 05AB1E'de sadece 1truthy ve diğer her şey yanlıştır, ancak bunun izin verilen bir çıktı olup olmadığından veya çıkışın iki tutarlı ve benzersiz değer olup olmadığından emin değilim. Eğer ikinci, bir arka Θdaha çok tüm çıkışlar diğer ilave edilebilir 1hale 0:

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

b     # Convert the (implicit) input-integer to a binary-string
 D    # Duplicate it
  0¢  # Count the amount of 0s
 s    # Swap to get the binary again
  ÂQ  # Check if it's a palindrome
 *    # Multiply both (and output implicitly)

  Θ   # Optionally: check if this is truthy (==1),
      # resulting in truthy (1) or falsey (0)

Bir aritmetik yaklaşım 10 bayt olacaktır:

LoD<s·>*Iå

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

a(n)=(2n1)(22n+1)

L        # Create a list in the range [1, (implicit) input-integer]
 o       # For each integer in the list, take 2 to the power this integer
  D<     # Create a copy, and decrease each value by 1
  s·     # Get the copied list again, and double each value
    >    # Then increase each value by 1
  *      # Multiply the numbers at the same indices in both lists
     Iå  # Check if the input-integer is in this list
         # (and output the result implicitly)

Sahip 1diğer diller (örneğin C ve TI-TEMEL) içindeki truthy / falsy tanımları (her ikisi için 0 / sıfır olmayan) sahip olduğundan olarak truthy ve falsy olarak bütün diğer sayılar, bu sorun için kabul edilebilir. Ne truthy veya falsy olarak kabul edilirse, dilin şartnamelerine uyduğu sürece, o zaman adil bir oyundur.
Tau

3

Excel, 97 63 Bayt

=A1=2*4^(ROUND(LOG(A1,4),0))-2^(ROUND(LOG(A1,4),0))-1

2 sayıyı hesaplar:

En yakın 4 katı gücün iki katı
>Num|Binary|2*Power4|Binary
> 1| 1| 2* 1= 2| 10
> 2| 10| 2* 4= 8| 1000
> 4| 100| 2* 4= 8| 1000
> 20| 10100| 2*16=32|100000

 

1 Artı 4'e yakın Gücün karekökü
>Num|Binary|1+√Power4|Binary
> 1| 1|1+ √1= 2| 10
> 2| 10|1+ √4= 3| 11
> 4| 100|1+ √4= 3| 11
> 20| 10100|1+ √16= 5| 101

Sonra ikinci numarayı ilk olandan çıkarın:

>Num|Binary|2*Power4|Binary|1+√Power4|Binary|a-b|Binary
> 1| 1| 2* 1= 2| 10|1+ √1= 2| 10| 0| 0
> 2| 10| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 4| 100| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 20| 10100| 2*16=32|100000|1+ √16= 5| 101| 27| 11011

Ve bu sonucu orijinal numara ile karşılaştırın

Eski yöntem

=DEC2BIN(A1)=REPLACE(REPT("1",1+2*INT(IFERROR(LOG(A1,2),0)/2)),1+IFERROR(LOG(A1,2),0)/2,1,"0")

A1 Log-base-2 ile başlayın ve en yakın çift sayıya yuvarlayın, sonra 1 ekleyin.

Daha sonra, bu kadar çok "1"s'den oluşan bir dize oluşturun ve orta karakterini a ile değiştirin "0", her zaman tuhaf olan ve A1'in ikili uzunluğundan 1 ile aynı veya 1'den az olan bir Cyclops numarası oluşturun.

Ardından, A1'in İkili gösterimi ile karşılaştırın.


3

R , 3733 bayt

(x=scan())%in%(2*4^(n=0:x)-2^n-1)

Çevrimiçi deneyin!

R'nin ikiliye dönüştürmek için yerleşik bir özelliği yoktur, bu yüzden diziden bir terimler listesi hesaplamak için OEIS'den gelen formüllerden birini kullandım.

n<-0:xcömert bir başlangıç ​​değerleri listesi oluşturur. 2*4^(n<-0:x^2)-2^n-1)OEIS'in formülüdür ve ardından girişin kullanarak bu sırada görünüp görünmediğini kontrol eder %in%.

Negatif girişlerle uğraşmak zorunda kalmayarak -2 bayt. Degisebilirim hatırlayarak -2 bayt <-için =.


3

C (gcc), 26 bayt

f(n){n=~n==(n^=-~n)*~n/2;}

Çevrimiçi deneyin!

Neil Limanı'nın cevabı . Uygulama tarafından tanımlanan işlemlerin sıralanmasına güvenir.

C ++ (clang), 38 bayt

int f(int n){return~n==(n^=-~n)*~n/2;}

Çevrimiçi deneyin!

C ++ türlerini ihmal edemiyorum, clang cinsinden getirisini ihmal edemezsiniz, aksi halde aynıdır.


1
C ++ cevaplarının return, kırılgan ve platforma bağlı örtülü akümülatör geri dönüş değeri istisnası yerine C yanıtlarından farklılaştırılmasını tercih ederim .
Deadcode

2
Ayrıca kuralların standartlara uygunluğunu gerektirmesini de isterdim, ama öyle değil, bu yüzden bunu kullanmamak sadece kötü golf olurdu. C ++ (clang) bu 38 baytı yaparak geri dönmeyi gerektirir.
Grimy

Daha sonra bu sorunun cevabını C (gcc) ve C ++ (gcc) yerine C (gcc) ve C ++ (clang) yaparak çözebilirsiniz. Bunu şimdi yaptım.
Deadcode


3

J , 22 19 17 15 14 bayt

BolceBussiere sayesinde -3 bayt!

Ngn sayesinde -4 bayt!

Traws sayesinde -1 bayt!

J , 14 bayt

1=1#.(*:|.)@#:

Çevrimiçi deneyin!


1
#=1++/­­­­­­­
ngn

1
(#=1++/)@(*|.)@#:
ngn

1
1=1#.1-(*|.)@#:
ngn

1
kullanmak için yeterince j bilmiyorum ama kısaltmaya çalışarak başkalarının kodundan öğrenmek eğlenceli
ngn

1
-1 bayt1=1#.(*:|.)@#:
15


2

Ataşesi , 22 bayt

{Flip@_=_∧1=0~_}@Bin

Çevrimiçi deneyin!

Alternatifler

27 bayt: {BitXor[2*_,2*_+3]^2=8*_+9}

27 bayt: {BitXor@@(2*_+0'3)^2=8*_+9}

27 bayt: {Palindromic@_∧1=0~_}@Bin

28 bayt: {BitXor[...2*_+0'3]^2=8*_+9}

28 bayt: {BitXor[…2*_+0'3]^2=8*_+9}

28 bayt: {Same@@Bisect@_∧1=0~_}@Bin

29 bayt: {_[#_/2|Floor]=0∧1=0~_}@Bin

30 bayt: Same@Bin@{_+2^Floor[Log2@_/2]}

30 bayt: {_[#_/2|Floor]=0and 1=0~_}@Bin


2

Retina 0.8.2 , 38 37 bayt

.+
$*
+`^(1+)\1
$+0
10
1
^((1+)0\2)?$

Çevrimiçi deneyin! Link, test durumlarını içerir. Düzenleme: Açıklamadan sonra, önceki çözüm sıfırı doğru işlememiş. Açıklama:

.+
$*

Ondalıktan unary'ye dönüştür.

+`^(1+)\1
$+0
10
1

Retina wiki'deki yöntemi kullanarak unary'den binary'e dönüştürün.

^((1+)0\2)?$

Boş bir dizgeden 1önce ve sonra aynı sayıda s olup olmadığını kontrol edin 0(yukarıdaki dönüşümün nasıl işleyeceği).


1

Toplu, 39 37 bayt

@cmd/cset/a"m=%1^-~%1,!(m/2*(m+2)-%1)

n=(2k+1)(2k11)m=2k1n=m2(m+2)n


1

Excel, 101 107 bayt

-Chronocidal sayesinde -6 bayt.

=AND(ISEVEN(LOG(A1,2)),MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0",LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1)

3 kontrol yapar:

  • Tek uzunluk
ISEVEN(LOG(A1,2))
  • Orta karakter 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • Bir tek var 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
Değiştirerek 6 bayt kaydet ISODD(LEN(DEC2BIN(A1)))içinISEVEN(LOG(A1,2))
Chronocidal

1

Regex (ECMAScript), 65 59 57 58 bayt

0 doğru işlemek için +1 bayt

^((((x*)xx)\3)x)?(?=(\1*)\2*(?=\4$)((x*)(?=\7$)x)*$)\1*$\5

Çevrimiçi deneyin!

(2k1)(2k+1+1)


1

VBA, 41 36 Bayt

x=2^Int([Log(A1,4)]):?[A1]=2*x^2-x-1

Anlık pencerede, Açık Bildirge kapalı durumdayken çalıştırın. Giriş, A1aktif sayfanın hücresidir . Geçerli pencereye Doğru / Yanlış çıktısı verir.

Benim aynı mantık kullanır Excel Yanıt (çift sayıda varsa! Ya 1 biraz daha kısa) bitten aynı sayıda Cyclops sayısını bulmak için ve sonra girişli olduğunu karşılaştırır.

Formlarına azaltarak Kiklop numaraları hesaplanarak bir bayt kaydeder y = 2x^2 - x - 1( x = n-1için inci Kiklop numarası veya x = 2^Int(Log([A1])/Log(4))bir değişken x bitlik bir eşit daha az ya da sayı ile en Kiklop sayısını bulmak için) ve saklama

(-5 Taylor Scott sayesinde bayt !)


1
Kütük tabanını kütük bölme kullanarak dönüştürmek yerine [...][(Log(A1,4)]
Taylor Scott

1

PHP , 74 bayt

function($x){return($c=strlen($a=decbin($x)))&1&&trim($a,1)===$a[$c/2|0];}

Çevrimiçi deneyin!

Tamamen saf olmayan matematiksel yaklaşım, sadece dizeler.

function cyclops( $x ) {
    $b = decbin( $x );     // convert to binary string (non-zero left padded)
    $l = strlen( $b );     // length of binary string
    $t = trim( $b, 1 );    // remove all 1's on either side
    $m = $b[ $l / 2 |0 ];  // get the middle "bit" of the binary string
    return 
        $l & 1 &&          // is binary string an odd length?
        $t === $m;         // is the middle char of the binary string the same as
                           // the string with left and right 1's removed? (can only be '0')
}

Veya yukarıdaki @ Chronocidal algoritmasına göre 60 bayt .

function($x){return decbin($x)==str_pad(0,log($x,2)|1,1,2);}

Çevrimiçi deneyin!


1

Haskell, 82 bayt

import Text.Printf
(`all`[(==)<*>reverse,("0"==).filter(<'1')]).flip($).printf"%b"

Ve xnor'ın Python çözümünün bir limanı:

Haskell, 47 bayt

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
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.