Hesapla n% 12


27

Bir imzasız 32 bit tam sayı için nmodulo hesaplayın 12.

Kurallar:

  • n0 ile 23 arasındaki herkes için çalışması gerekir . Diğer numaralar isteğe bağlı.
  • Sadece operatörlerin herhangi birini kullanmak gerekir +-*, ~&^|ya da <<, >>yaygın 32 bit uints üzerinde tanımlanan.
  • Rasgele sayıdaki sabit uint'leri kullanabilir.
  • ifÜçlü operatörler veya "büyüktür" operatörleri gibi ifadelerden derlenenler dahil, diziler veya herhangi bir ifade gibi herhangi bir işaretçi şeklini kullanamazsınız .

Puanlama:

  • Operatörler + -ve bitsel operatörleri ~ & ^ | << >>(AND, XOR, OR, biraz kaymalar) bir puan verin 1, *bir puan verir 2.
  • En düşük toplam puan kazanır.

6
Operatörleri C / Java dışındaki dillerin kullanıcıları için tanımlamak isteyebilirsiniz. Anladığım kadarıyla +-*toplama, çıkarma, çarpma; ~&^|bitsel değildir, VE, XOR, VEYA; ve << >>bitshifts.
Seviye River St

@steveverrill - teşekkürler. Gerçekten de niyet bu.
nbubis

Ben kullanabilir miyim for i in x:y:z, .dostuff?
haziran

Bir ifadede kullanılacak değere eşit bir değişken ayarlayabilir miyim?
xnor

4
Çoğu derleyici n % 12bilgisayar korsanının zevkine benzer bir çarpma ve kayma için en iyi duruma getirecektir, bu nedenle önemsizdir, sadece
düzene

Yanıtlar:


29

4

(Dil konu dışı)

n-((48&(11-n))>>2)

Woo! 4'e gittim.

11-n tüm yüksek sıra bitlerinin n> = 12 ise ve sonunda ayarlanmış olmasını sağlar.

48&(11-n) == n> 11 ve sonra 48 başka 0

(48&(11-n))>>2 == n> 11 ve 12 diğer 0

n-((48&(11-n))>>2) cevap


1
Aww shucks, bu yaklaşıma beni yendin! Görevden sadece birkaç dakika uzaktaydım n - (((11 - n) & 0xC0000000) >> 28). Aferin, dörtten az sürede yapılabileceğini sanmıyorum.
Runer112

1
@ Runner112 Evet, gönderdiğim sırada kimsenin beni dövmeyeceğini umuyordum. Kendin için bulmaya aferin, yine de
isaacg

1
Başar :) 4 gerçekten bir başarıdır.
nbubis

11

4

Arama tablosuna sahip bir çözüm (bakar i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

İşte 4 işlemle birlikte başka bir çözüm:

i - ((0xffff >> (i - 12)) & 12)

Bit değişimlerinin sayım işlenişinin dolaylı olarak mod 32 olarak alındığı, yani x >> -1aynı olduğu varsayılmaktadır x >> 31.

5

Arama tablosu kullanan başka bir yaklaşım:

i - (16773120 >> i & 1) * 12

7

bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

Örneğin

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
İşaretçiler kullandığından bu geçerli değil.
curiousdannii

@curiousdannii Hangi işaretçilerden bahsediyorsun? stdinVe stdoutakarsular? Elbette, dahili olarak, onlar işaretçilerdir, ancak daha sonra Java'yı diskalifiye edebiliriz, çünkü Integersınıfı dahili olarak birçok şey için kullanır .
Cole Johnson,

$ () Etkin bir işaretçi eşdeğer değil mi?
curiousdannii

@curiousdannii - awk belgelendirme, yerleşik değişken olduklarını söylüyor.

5

C, küçük endian - 2

Bu muhtemelen aldatma ama bence kuralları yerine getiriyor ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

O nasıl çalışır?
nbubis

1
Sorta hile yapmak = 0 yerine kullanmak yerine & 0x02 ek işlem olarak saymanız gerekir. Ama yaratıcılık için +1 :)
nbubis

4

PHP - 0 puan

Benden önce kimsenin bununla gelmemesinin nasıl mümkün olduğunu merak ediyorum !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Güzel. Diziler izin vermediği için bir sorun olabileceğini düşünüyorum. Yine de gerçekten güzel.
AJMansfield

@ AJMansfield Biri bunun dizilerin olmadığını ancak dizelerin olmadığını (evet, düşük seviyedeki dizgelerin byte dizileri olduğunu) söyleyebilir. :)
seequ

1
@seequ Biri, RAM'in kullanılmasından dolayı bu geçersiz olduğunu iddia edebilir (evet, düşük seviyede, ram teknik olarak indekslenmiş bir dizidir) ¯_ (ツ) _ / ¯
Stan Strum

2

C, skor 5

23’e kadar çalışır, üzerinde garanti edilmez.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4n> = 12 için 4 döndürür. N'ye ekleyin ve en az 4 bitte doğru cevabı elde edin, ardından diğer bitleri kesin.


Aferin!! Bakalım birileri 4'e
girebilir mi

2

hangi dilde olursa olsun: 5

kazanmayacağım, ama katılacağım çünkü eğlenceli ve belki başkalarından sonra anlamak daha kolay:

n - ((n+20)>>5)*12

bu eşdeğerdir

n - (n>11)*12

bu eşdeğerdir çünkü 20 ila 12 eklediğinizde 32 elde edersiniz, böylece 5. bit 1 olur. Bu sadece n> 1 olarak 32, 5. bitin 1 olduğu en küçük sayı olduğunda olur.

Ayrıca, yapabileceğiniz gibi daha yüksek bir aralık için kolayca genişletilebilir

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

35'e kadar bir menzile ulaşmak


1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

=bir operatör?

Bu durumda puan 6'dır.

j-12*(j*357913942>>32)

BTW @steveverrill'in çözümü Python'da da doğrudan kullanılabilir.

0 aralığında çalışır. 23

Yani, ne oluyor ? 357913942 ile çarpın ve 2 ^ 32 ile bölün (veya sağa kaydırma 32)


Sadece bir kere çarpmak için bir işlevi nasıl kullandığınızı seviyorum. ancak imho, çarpımın adını m (,) olarak değiştirdiniz, bu benim için iki kere kullandığınız anlamına geliyor.
Pinna_be

kuralların nasıl yorumlandığına bağlıdır, ancak geçerli bir noktaya sahipsiniz
Willem

1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Bu ya sorunun bir parçası olmalı ya da sadece başka bir cevabı içermeli. İkincisini öneririm.
Jwosty

@Jwosty - değiştirildi.
nbubis

0

Kobra - 2 (veya 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Bu , kuralları biraz büküyor olabilir , ancak sordum ve kullanmam için izin verildi.

Aynı zamanda herhangi bir sayı için çalışır.


0

Kona - 5

Belki geçersiz olabilir, çünkü kat operatörüne izin verilip verilmediğinden emin değilim, fakat iki *eksi var:

mod:{x-(_0.08333*x)*12}

Hangi herhangi bir tamsayı için çalışması gerekir.


Zemin operasyonundan emin değilim, ama kesinlikle ilk çarpmanın 32-bit tamsayılardan başka bir şey üzerinde çalıştığından eminim.
Runer112

@ Runer112: OP, girişin 32 bit olması gerektiğini ve işleçlerin tanımlandığı gibi olduklarını söylüyor; Koddaki tamsayı olmayan değerler hakkında hiçbir şey söylemez.
Kyle Kanos

Bir şeyi yanlış anlamadığım sürece, 0.08333 * x, 32 bit kullanıcılarda tanımlandığı gibi çarpma gibi görünmüyor, çünkü 0.08333, 32 bit kullanıcı birimi değil.
Runer112

1
"Rasgele sayıdaki sürekli uint kullanabilir." - yani, isteğe bağlı değişkenler kullanamazsınız.
nbubis

1
@ nBubis: Bu satır aslında yüzerlere bir sınırlama getirmiyor.
Kyle Kanos
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.