Ters ve kare


19

Bu meydan okumada meraklı bir diziden sayıları hesaplayacaksınız.

Girişiniz tek bir ondalık sayı negatif olmayan bir tam sayıdır. Bu tamsayıdaki bitleri ters çevirin ve ardından gerekli çıktıyı almak için sayının karesini alın.

Bitleri ters çevirirken, girişte baştaki sıfırları kullanmamalısınız. Örneğin:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

Bu dizinin ilk 25 girişi / çıkışı:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

Çözümünüz keyfi olarak boyutlandırılmış tamsayılar için çalışmalıdır. Dilinizde bunları kullanmak için uygun bir yerleşik yöntem yoksa, yanıtınızı sanki olduğu gibi uygulayın. Cevabınız çok sayıda olursa kırılır. Ancak, yalnızca sınırlı bir alan için (arama tablosu gibi) çalışan hileler / sınırlar kullanmayın.


Puanınız kaynak kodun bayt sayısıdır.

Eğer sayıyı hiçbir zaman ikiliye dönüştürmezseniz,% -50 bonus. Bu, yerleşikler ile sınırlı değildir, eğer sayıları birer birer döngüye sokarsanız (kaydırma veya maskeleme veya başka bir yöntemle), dönüşüm olarak da sayılır. Bunun gerçekten mümkün olup olmadığını bilmiyorum, ancak dizideki bir deseni tespit etmek için bir teşvik veriyor.

En küçük puan kazanır.



1
Kod, bitleri temsil eden bir karakter dizesiyle sonuçlanan bir yöntemi çağırırsa, bu bonus için uygun mudur?
Brad Gilbert b2gills

2
@ BradGilbertb2gills No.
orlp

Ben bitleri ayıklamak için matematik kullanarak da ikili dönüşüm sayılır sanırım?
lirtosiast

Yanıtlar:


5

Par , 5 bayt

✶Σ⌐Σ²

Bu okuma-ikili-ters-ikili-kare.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Bu bayt sayacı UTF-8'i varsayar. Mauris'in baytlarını saymak için UTF-8 olmayan bazı kodlamalar kullandığına inanıyorum, ancak bu kodlamayı belirtmedi.
orlp

Par kendi garip kodlamasını kullanır. Standart gösterimi, <256 Unicode karakterin belirli bir alt kümesidir. Bir adı olup olmadığından emin değilim; @Ypnypn chime gelmesini beklemeliyim.
Lynn

Ah anlıyorum. @orlp
Conor O'Brien

Muhtemelen kendi SBCS'si var mı?
HyperNeutrino

19

Mathematica, 42 21 bayt

Puanı yarıya indirdiği için alephalpha'ya teşekkürler.

#~IntegerReverse~2^2&

Mathematica'da bunu yapmamın asıl nedeni, bir arsaya bakmak istediğimden ... şüphesiz komik görünüyor:

resim açıklamasını buraya girin


11
Ama skoru beğendim! XD
Conor O'Brien

1
neden bu cevabın en az baytlı cevabından daha fazla oyu var? o_O
Seadrus

27
@Seadrus Ne dediklerini biliyorsun. Bir resim 7 byte değerinde.
Martin Ender

5
yani puanınız 42 + 7 = 49 bayt: P
Seadrus

3
Üzgünüz, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender

8

Minkolang 0.14 , 43 bayt

İlham verdiği için Mego'ya teşekkürler.

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

Kodu burada test edin ve buradaki tüm test senaryolarını kontrol edin .

açıklama

Bu, yineleme ilişkisini kullanır:

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

Eğer ngiriş, daha sonra a(n)da ikili dizi çevrilmiş sonra elde edilen bir sayıdır. 0 ve 1 açıktır. İçin a(2n) = a(n), göz önüne x0(burada xçevrilmiş ikili basamak dizisidir.CONTROL) 0xile aynı olan, x. Çünkü a(2n+1)akıl yürütme biraz daha karmaşıktır. x1ters çevrilir, bazıları için 1xeşittir . Bu basamak sayısı birden fazla olan, . Tam formül aşağıdaki gibidir, ancak biraz değiştirilmiştir. Bu aslında kod:x + 2^kkkxfloor(log_2(n))+1

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Mego ve ben sohbette çalıştıkça floor(n/2) = (n - n%2)/2. Böylece log_2(floor(n/2))+1 = log_2(n - n%2),. Ayrıca, (n%2)tek ve çift parçaları tek bir ifadeye daraltır.

Son olarak, daha fazla uzatmadan, işte kod açıklandı.

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.

1
Bence nüksetme sadece bireysel bitler üzerinde yinelemenin yeniden düzenlenmesi.
Martin Ender

3
Korkarım bu sayılmaz. Gördüğünüzde 2nve 2n+1bir nüks ilişkisinde, bunu hemen bitler üzerinde döngü olarak düşünmelisiniz.
orlp

1
@orlp: Bu bir serseri. Şimdi ikramiyenizin imkansız olduğuna ikna oldum.
El'endia Starman

@ El'endiaStarman Neredeyse anladım sanırım.
Conor O'Brien

8

Japt , 29 28 11 7 bayt

(Programı 7 baytlık IEC_8859-1 kodlu bir dosya olarak kaydedip yorumlayıcıya yükleyebilirsiniz .)

Japt JavaScript tarafından yapılan kısaltılır ETHproductions .

¢w n2 ²

Çevrimiçi deneyin!

Açıklama:

  1. ¢kısayol olduğu Us2hangi derlemesinin, U.s(2). bir sayı tarafından çağrılan Ugiriş (örtük).s(2).toString(2) ( dönüştürür, dize olarak ayrıştırır).

  2. wderler .w()dize tersine çevirir, hangi ( .split('').reverse().join('')).

  3. n2olarak çalışır parseInt(<number>,2), yani ikiliyi ondalığa dönüştürür.

  4. ²çağırır Math.pow(<number>,2), yani sayıyı kareler.


1
Sayı için bir dize işlevi var n, bunu yapabilirsiniz Us2 a w a n2 p2. İyi iş olsa!
ETHproductions

1
Ayrıca, wdizelerde olduğu gibi dizilerde de aynı şekilde çalışır, bu yüzden iki as'ye ihtiyacınız yoktur :)
ETHproductions 29:15

1
Son bir şey: Us2 = ¢, ve p2= ², 7 bayta ¢w n2 ²
düşürür

3
Online tercüman şimdi IEC_8859-1 kodlanmış dosyalarını kabul eder. (UTF-8 ve UTF-16'nın nasıl yapılacağından emin
olmasam

2
@ETHproductions - şimdi bunu + 1'leyebilirim :)
Digital Trauma

5

Python, 32 bayt

lambda x:int(bin(x)[:1:-1],2)**2

Çevrimiçi deneyin.

Kod oldukça basittir: bin(6)örneğin, 0b1106'nın ikili gösterimini verir . [:1:-1]Dizeyi tersine çevirir ve kaldırır 0b. intdizeyi binary'den bir tam sayıya dönüştürür ve **2kareler.


5

Jolf , 7 bayt

Sadece çalıştırın. Sayfadaki giriş çalışmıyor.

^C_Bj22

açıklama

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

QBu 6 bayt yapan komutu ekledim :QC_Bj2


4
7 dışarı Çapraz hala 7. benziyor
bir Spaghetto

2
@quartata Çarpı işareti kadar kötü değil 4.
orlp


4

Ciddi , 8 7 bayt

2;,¡R¿ª

Bu gibi zorluklar Cidden için mükemmel :)

Çevrimiçi deneyin

Açıklama:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it

İyi iş Jolf ile eşleşen!
Conor O'Brien

Tercümanınızın CP437 kodlamasını (veya en azından onaltılık temsilini) kabul etmesi için +1
Digital Trauma

4

J, 10 9 bayt

2^~|.&.#:

Bu örtük, monadik bir fiildir. Çevrimiçi deneyin!

1 byte golf için @randomra'ya teşekkürler!

Nasıl çalışır

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.

Bağlantı çalışmıyor, "İstenen URL /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html bu sunucuda bulunamadı." Yazan bir Google sayfasında 404 hatası alıyorum.
Bijan


2

JavaScript, 64 63 56 53 bayt

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

Çok uzun olduğumu fark ettim, ama hey, yapabilirim: P

gösteri


yerine parseInt(şunları yapabilirsiniz+("0b"+
Downgoat

@Downgoat hm, doğru sonuçlar vermiyor gibi görünüyor.
nicael

[...n.toString(2)]ve.join``
Conor O'Brien

1
/ ES7 (49 bayt) ağırlık da daha kısa: n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Henüz hiçbir tarayıcıda çalışmıyor
Downgoat

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Teşekkürler, bu biraz bayt tasarrufu sağlar.
nicael



2

Kabuk, 25

dc -e2o?p|rev|dc -e2i?d*p

STDIN / STDOUT üzerinden giriş / çıkış:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 


1

Pyth, 9 bayt

^i_.BQ2 2

Bu Python'a benzer çok basit bir pyth tabanlı cevaptır


1

𝔼𝕊𝕄𝕚𝕟, 12 karakter / 21 bayt

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

Rekabetçi olmayan cevap, 9 karakter / 18 bayt

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
Via Bu bayt sayacı, 15 bayt (başka bir kodlama kullanır) verir.
nicael

UTF-8 kullanarak notları işleyebilirim (Mines kodlamasını çalışana kadar).
Mama Fun Roll

Dilin adı ... kutular mı?
corsiKa

İki kere ESMin. Unicode karakterleri tam olarak desteklenmez.
Mama Fun Roll


1

TI-Basic (TI-84 Plus CE), 42 bayt

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
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.