*, /, +, -,% operatörleri kullanmadan bir sayıyı 3'e bölün


48

SO'dan bu soruyu alıntılamak (Spoiler uyarısı!):

Bu soru bir Oracle röportajında ​​soruldu.

*, /, +, -,%, operatörleri kullanmadan bir sayıyı 3'e nasıl bölerdiniz?

Numara imzalanmış veya imzasız olabilir.

Görev çözülebilir, ancak en kısa kodu yazıp yazamayacağınıza bakın.

Kurallar:

  • Gerekli tamsayı bölümünü ( /3) gerçekleştirin
  • Olmayan metin tabanlı operatörler kullanmayın *, /, +, -, veya %(veya eşdeğerleri gibi __div__ya add()). Bu aynı zamanda i++veya gibi operatörleri artırmak ve azaltmak için de geçerlidir i--. String birleştirme ve biçimlendirme için işleçlerin kullanımı tamam. Bu karakterleri, -negatif sayılar için unary operatörü gibi farklı operatörler için veya *C'de bir göstericiyi temsil etmek için kullanmak da iyidir.
  • Girdi değeri keyfi olarak büyük olabilir (sisteminiz ne işleyebilirse), hem pozitif hem de negatif
  • Giriş STDIN veya ARGV'de olabilir veya herhangi bir şekilde girilebilir
  • Yukarıdakileri yapabildiğiniz en kısa kodu oluşturun.

1
Olumlu olduğunda sonuç nasıl yuvarlanmalıdır? Ne zaman olumsuz?
dfeuer

Yanıtlar:


15

J, 45 44 10 karakter

".,&'r3'":

Negatiflerle çalışır:

".,&'r3'": 15
5
   ".,&'r3'": _9
_3
   ".,&'r3'": 3e99
1e99

": - metin olarak biçimlendir

,&'r3'- ekleme r3ucuna

". - dizeyi yürütünüz, örneğin 15r3


1
Yaparsanız çalışır 3 3 3 #: 9. Üçlü numaranızın ne kadar süreceğini bilmeniz gerekiyor gibi görünüyor. _3]\i.aynı zamanda bir şey için olası bir başlangıç ​​noktasıdır, ancak buradaki çözümünüzden daha kısa olup olmayacağını bilmiyorum. #_3]\i.Olduğu gibi bir sorun da her zaman aşağı yerine yuvarlar olmasıdır.
Gareth,

1
Belki ##~3=_3#\i.11 karakter için?
Gareth,

1
Aslında, sizinkini 10 karaktere kadar küçültebilirsiniz ##~0 0 1$~.
Gareth,

1
Bunu bir kanca kullanarak küçültebilirsiniz, 3#.}:(#:~$&3)ancak daha uzun sürer ve negatif sayı sorununu çözmez.
Gareth,

1
Evet, güç işlevini ^: veya Gündemi @. bir değiştirme ifveya if...elsedeğiştirme için kullanabilirsiniz. Bu durumda @., bir koşulu temel alarak birini veya diğerini seçmek için bir '`' karakteriyle (J-konuşan'da bir mermi) bağlı iki fiil kullanabilirsiniz .
Gareth

56

C, 167503724710

İşte soruna benim çözümüm. Sıkı bir kod golf yarışması kazanmanın mümkün olmadığını kabul ediyorum, ancak dolaylı olarak yerleşik bölme işlevini çağırmak için herhangi bir püf noktası kullanmıyor, taşınabilir C (orijinal Yığın Taşması sorusunun sorduğu gibi) yazıyor, mükemmel çalışıyor Negatif sayılar için ve kod son derece açık ve net.

Programım şu betiğin çıktısı :

#!/usr/bin/env python3
import sys

# 71
sys.stdout.write('''#include <stdint.h>
#include <stdio.h>
int32_t div_by_3(int32_t input){''')

# 39 * 2**32
for i in range(-2**31, 2**31):
    # 18 + 11 + 10 = 39
    sys.stdout.write('if(input==%11d)return%10d;' % (i, i / 3))

# 95
sys.stdout.write(r'''return 7;}int main(int c,char**v){int32_t n=atoi(a[1]);printf("%d / 3 = %d\n",n, div_by_3(n));}''')

Karakter sayısı: 71 + 39 * 2 ** 32 + 95 = 167503724710

Deneyler

Bunun ne kadar süreceği ve ne kadar bellek kullanacağı soruldu, işte bazı kriterler:

  • Komut dosyası yürütme süresi - ./test.py | pv --buffer-size=1M --average-rate > /dev/nullYaklaşık 30 saniye çalıştırmak , yaklaşık 14,8 MB / sn'lik bir hız verir. Çıktı oranının kabaca sabit olduğu varsayılabilir, bu nedenle bitirme işleminin yaklaşık 167503724710 B / (14.8 x 1048576 B / s) - 10794 s olması gerekir.
  • Derleme süresi - TCC derleyicisinin , C kodunun 29.6 MB / sn'de derlendiğini iddia eden, 167503724710 B / (29.6 x 1048576 B / sn)) 5397 sn. (Tabii ki bu senaryo ile bir boru hattında çalışabilir.)
  • Derlenmiş kodun büyüklüğü - Kullanmayı tahmin etmeye çalıştım ./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null, ancak tcckaynak dosyanın tamamını okuyana kadar hiçbir şey çıkmadı gibi görünüyor .
  • Çalıştırılacak bellek kullanımı - Algoritma doğrusal olduğundan (ve tcc satırlar boyunca optimizasyon yapmıyorsa), bellek ek yükü yalnızca birkaç kilobayt olmalıdır (kodun kendisinden ayrı olarak).

22
Bu, kodlamanın özüdür. +++++++++++
Joe Z.

4
Onlara, 160 GB'lık bir kaynak dosyası verdiniz ve derlemelerini ve test etmelerini istediniz, size delirmiş gibi bakıyorlardı eminim.
Joe Z.

16
Patronum benden üçe bölünmeden hesap yapmamı isterse - + / *% onun deli olduğunu düşünürdüm.
Mikaël Mayer

Yine de, a[b]ilaveyi yapan sözdizimsel bir şeker *(a + b).
Konrad Borowski

12
@ NicoBarbulesco Stack Exchange cevaplarında bir boyut sınırlaması var.
Timtech

38

Yakut 28

b=->n{n.to_s(3).chop.to_i 3}

3'e bölmek için, sadece 3 tabanındaki sondaki sıfırı kaldırmamız gerekir: 120 -> 11110 -> 1111 -> 40

Negatiflerle çalışır:

ice distantstar:~/virt/golf [349:1]% ruby ./div3.rb
666
222
ice distantstar:~/virt/golf [349]% ruby ./div3.rb
-15        
-5

Ruby, 60 45

Alternatif olarak, baz dönüşüm kullanarak w / o:

d = -> n {x = n.abs; r = (0..1.0 / 0) .step (3) .take (x) .index x; n> 0? r: -r}

d=->n{(r=1.step(n.abs,3).to_a.size);n>0?r:-r}

1
Baz dönüşüm olmadan alternatif yasakladı /nerede operatörü Float::INFINITYoldu 1.0/0. Ruby 2.1, bir mayıs golf ile (0..1.0/0).step(3)içine 0.step(p,3)kaldırarak /. Büyük sorun olduğunu -rkullanır -olumsuzlamak. Değiştirmek 5 karaktere mal -roluyor ~r.pred, Integer # kötüye , çıkarma işleci olmadan 1'i çıkarmak için kullanılıyor.
kernigh

26

Mathematica, 13 karakter

Mean@{#,0,0}&

Bu çok kötü: DI sanırım &düz bir değişkeni kaydedebilir ve kullanabilirsiniz (diğerleri de bunu yapar).
Yves Klett

3
@ YvesKlett: Ortalama doğası gereği kötü.
GuitarPicker 7:16

18

JavaScript, 56

alert(Array(-~prompt()).join().replace(/,,,/g,1).length)

Uzunluğunda bir dizi yapar ntekrarı ,S ve yerine geçer ,,,ile 1. Sonra dizginin sonuç uzunluğunu ölçer. (Umarım birliğe -izin verilir!)


+1 ama negatif değerlerle çalışmıyor
Francesco Casula

Ah, soru ... bu nasıl sayılır? -Olumsuzlama işleci kullanır .
Patrick Roberts

Eğer isterseniz, yerine - @Patrick Hiçbir çıkarma anlamında şartname aldı -~ileparseInt()
Casey Chu

@CaseyChu tarafından döndürülen değer -~prompt()büyük bir değerdir parseInt(prompt()). Bununla nasıl baş edeceğinden emin değilim.
Patrick Roberts,

alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
Casey Chu,

16

Python, 41 38

print"-"[x:]+`len(xrange(2,abs(x),3))`

xrange Neredeyse anında büyük sayılarla başa çıkabiliyor gibi görünüyor (bence sınırın C'deki uzun süre ile aynı olduğunu düşünüyorum).

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602

2
10/3eşittir 3, 4 değil.
Joel Cornett

Yapma print" -"[x<0]+len (aralık (2, abs (x), 3)) `` 39 karaktere
indirecek

golfexchange'in yorum biçimlendirmesi işi mahvetti. Yukarıdakiler len()için kısa devre yapmak için backticks kullandımrepr()
Joel Cornett

Güncelledim. Kullanamıyorum range, çünkü aslında liste oluşturacak. xrangeSadece numara yapar, bu yüzden zaman / hafızayı boşa harcamadan büyük sayıları idare edebilir.
grc

2
Bu Python 3 gibi davran;) Tek char dilimleme btw'yi severim.
Joel Cornett

11

Haskell, 90 106

d n=snd.head.dropWhile((/=n).fst)$zip([0..]>>=ν)([0..]>>=replicate 3>>=ν);ν q=[negate q,q]

Sonsuz (tembel) bir arama listesi oluşturur [(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...], eşleşmeyen tüm öğeleri keser n( /=Haskell'de eşitsizlik vardır) ve ilkini döndürür.

Negatif sayılar yoksa bu çok daha basitleşir:

25 27

(([0..]>>=replicate 3)!!)

sadece nlistenin th elemanını döndürür [0,0,0,1,1,1,2, ...].


3
o O ikinci çözümü hiç düşünmedim. Buna benzer bir şeyi python
acolyte

8

C #, 232 bayt

İlk golf kodlarım ... Ve C # olmadığından ve burada denenmemiş farklı bir yöntem denemek istediğim için, bir şans vereceğimi düşündüm. Buradaki bazı diğerleri gibi, sadece negatif olmayan sayılar.

class l:System.Collections.Generic.List<int>{}class p{static void Main(string[] g){int n=int.Parse(g[0]);l b,a=new l();b=new l();while(a.Count<n)a.Add(1);while(a.Count>2){a.RemoveRange(0,3);b.Add(1);}System.Console.Write(b.Count);}}

Ungolfed

class l : System.Collections.Generic.List<int>
{ }
class p
{
    static void Main(string[] g)
    {
        int n = int.Parse(g[0]);
        l b, a = new l();
        b = new l();
        while (a.Count < n) a.Add(1);
        while (a.Count > 2)
        {
            a.RemoveRange(0, 3);
            b.Add(1);
        }
        System.Console.Write(b.Count);
    }
}

2
5 Hakkında yıl sonra .. Sen gelen boşluk kaldırarak 1 byte kaydedebilirsiniz string[] gdönüştürerek,string[]g
Metoniem

"Metin tabanlı olmayan operatörleri *, /, +, -, veya% kullanmayın (veya div veya add () gibi eşdeğerlerini)" - eşdeğer bir - .Add?
Jonathan Frech

@JonathanFrech Bu toplama yöntemi iki sayı üzerinde çalışmaz, sadece bir koleksiyona değer katar
Ignorance'ın

7

Perl (26 22)

$_=3x pop;say s|333||g

Bu sürüm (ab) Perl'in regex motorunu kullanıyor. Son komut satırı argümanı ( pop) olarak bir sayı okur ve 3bu uzunluktaki bir s dizesini ( "3" x $number) oluşturur. Regex ikame operatörü ( s///burada yapbozun kuralları ve global bayrağı nedeniyle farklı sınırlayıcılarla yazılmıştır ) boş dizgenin üç karakterini kullanır ve giriş sayısının tam sayıya üçe bölündüğü ikame sayısını döndürür. Olmadan bile yazılabilir 3, ancak yukarıdaki sürüm daha komik görünüyor.

$ perl -E '$_=3x pop;say s|333||g' 42
14

2
Hey @ memowe, iyi iş! Yaparak birkaç karakterden (4) tasarruf edebilirsiniz $_=3x pop;say s|333||g.
Dom Hastings

2
Giriş 0, 1 veya 2 olduğunda, boş bir dize yazdırır. Durum 0 yazdırmak gerekiyorsa, o zaman 3 daha fazla karakter (25 toplam) ihtiyacı vardır: '$_=3x pop;say s|333||g||0. 99999999 gibi büyük sayılarla yavaşlayın ve negatif sayılarla çalışmaz.
04'te kernigh

1
-pKomut satırında kullanın ve şunları yapabilirsiniz: $_=3x$_;$_=0|s|...||g0, 1 veya 2 girişin kapsamı dahil toplam 22.
Xcali

6

C, 160 karakter

Temel 10 karakter dizisi ve tamsayılar arasında dönüştürme yapmak için arama tablolarını kullanarak karakter dizisi uzunluğundaki karakter dizilimi, yani atoi () veya printf () dizgisi olmadan.

Çıktı bazen çekiciliğinin başında gelen bir sıfır içerecektir.

main(int n,char**a){
char*s=a[1],*x=0;
if(*s==45)s=&s[1];
for(;*s;s=&s[1])n=&x[*s&15],x="036"[(int)x],*s=&x["000111222333"[n]&3],x="012012012012"[n]&3;
puts(a[1]);
}

Not:

  • ekleme işlemini uygulamak için dizi erişimini kötüye kullanır.
  • clang 4.0 ile derlenirse, diğer derleyiciler çubuk olabilir.

Test yapmak:

./a.out -6            -2
./a.out -5            -1
./a.out -4            -1
./a.out -3            -1
./a.out -2            -0
./a.out -1            -0
./a.out 0             0
./a.out 1             0
./a.out 2             0
./a.out 3             1
./a.out 4             1
./a.out 5             1
./a.out 6             2
./a.out 42            14
./a.out 2011          0670

6

Python 42

int(' -'[x<0]+str(len(range(2,abs(x),3))))

Buraya gönderilen her bir çözümü kestiğim için, burada ondalık sayıları kısaltır.

Python 50 51

int(' -'[x<0]+str(len(range([2,0][x<0],abs(x),3))))

Python kat bölme yaptığı için, işte bunu yapan benim çözümüm.

Giriş tamsayı x değişkeninde.

Python 2.7'de test edildi ancak 3'te de çalıştığından şüpheleniyorum.


+1 Olumsuz değer durumuna her iki alternatifi sunmak için. Zaten bu kadar çok cevap olduğundan, şahsen -3doğru cevabın bu olduğuna katılıyorum -10/3.
Gaffi


ikinci çözümünüzde çarpma ve çıkarma işleminde neler var?
15

@ boothby İkinci çözüm kat bölünmesini uygular. Negatif sayılar için aralık (0, abs (x), 3) ve pozitif sayılar için aralık (2, abs (x), 3) yapmak istedim. Bunu yapabilmek için (2 ... sonra x negatif olduğunda 2 çıkardım. X <0 ise x negatif olduğunda Doğru, (True) * 2 == 2
Mat

Zemin bölümü ve kesikli ondalık sayıları arasındaki farkı anlamıyorum. Olumsuz bölünme ile zorunda mı?
Joel Cornett

6

JavaScript, 55

alert(parseInt((~~prompt()).toString(3).slice(0,-1),3))

Eğer biri kullanamazsa -1, işte onunla değiştirilmiş bir versiyon ~0(teşekkürler Peter Taylor!).

alert(parseInt((~~prompt()).toString(3).slice(0,~0),3))

1
@ArtemIce One ~, işlenenin bitlerini tersine çeviren (önce sayıya dönüştüren) bir Bitwise işlecidir . Bu, bir dizgiyi sayıya dönüştürmenin en kısa yoludur (bildiğim kadarıyla).
Inkbug

1
Dize ayrıştırma / dönüştürme işleminin hile yapmak gibi bir şey olduğunu düşünüyorum, çünkü a) bitsel işlemlerle karşılaştırıldığında çok karmaşık ve pahalı bir işlem, b) içeride yasaklanan operatörleri kullanır ve c) bir ana sayfa çözümünden daha fazla karakter alır. Bir tür hızlı bağlantı noktası uygulamanız istendiğinde yerleşik olanları kullanırken insanların nasıl huysuz davrandıklarına benzer.
Wug

1
@Sam Ayrıca, ~~aksine bir tamsayıya dönüştürür +.
Inkbug

1
@Wug Kod kodludur, bu nedenle görevde belirtilmediği sürece verimlilik ile ilgili değildir.
Ağustos'ta

3
Farklı tabanlardan yararlanmak için +1. En sevdiğim JavaScript golf tekniklerinden biri.
DocMax

6

C 83 karakter

Bölünecek sayı stdin içinden geçirilir ve çıkış kodunu döndürür main()(CMD'de% ERRORLEVEL%). Bu kod, MinGW’nin bazı sürümlerini, optimizasyonlar açık olmadığında, son atama değerini bir return ifadesi olarak gördüğü için kötüye kullanır. Muhtemelen biraz azaltılabilir. Sığabilecek tüm numaraları destekler.int

Unary Negate (-) 'ye izin verilmiyorsa: (129)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:I(~a);for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?I(~c):c;}

Unary Negate IS izin verilirse: (123)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?-c:c;}

EDIT: ugoren bana şunu gösterdi - ~ bir artış ...

83 Bireysel olumsuzluğa izin verilirse karakterler: D

main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=-~-~-~a)c=-~c;b=b<0?-c:c;}

Tek terimli inkâr izin veriliyorsa, x+3ise -~-~-~x.
ugoren

Bunun için teşekkür ederim. Bunun neden hiç başıma geldiğini bilmiyorum. Sanırım biricik hebi toparlayabileceğinin farkında değildim.
Kaslai

5

C, 139 karakter

t;A(a,b){return a?A((a&b)<<1,a^b):b;}main(int n,char**a){n=atoi(a[1]);for(n=A(n,n<0?2:1);n&~3;t=A(n>>2,t),n=A(n>>2,n&3));printf("%d\n",t);}

Sayı ile komut satırı argümanı olarak çalıştır

  • Hem negatif hem de pozitif sayıları ele alır

Test yapmak:

 ./a.out -6            -2
 ./a.out -5            -1
 ./a.out -4            -1
 ./a.out -3            -1
 ./a.out -2            0
 ./a.out -1            0
 ./a.out 0             0
 ./a.out 1             0
 ./a.out 2             0
 ./a.out 3             1
 ./a.out 4             1
 ./a.out 5             1
 ./a.out 6             2
 ./a.out 42            14
 ./a.out 2011          670

Düzenlemeler:

  • Yerel değişkenleri kaldırmak için ek (A) ekleyerek 10 karakter kaydetti.

1
Güzel bitti. Biraz twiddling yaparken elimden gelenin en iyisini yaptım ve 239'a gittim. Kafamı senin etrafında doyamıyorum A, fonksiyonum sadece n numarasındaki biti kontrol ediyor. C standardı tip bildirimlerinin ihmal edilmesine izin veriyor mu yoksa bu derleyici bir şey mi?
shiona

1
Belirtilmemişse, C int alacaktır.
Wug

5

ZSH - 31 20/21

echo {2..x..3}|wc -w

Negatif sayılar için:

echo {-2..x..3}|wc -w

Negatif sayılarla (ZSH + bc) -62 61

Muhtemelen cevabım olarak iki program vermemeliyim, işte herhangi bir sayı işareti için işe yarayanlardan biri:

echo 'obase=10;ibase=3;'`echo 'obase=3;x'|bc|sed 's/.$//'`|bc

Bu, Artem Ice'ın cevabı ile aynı temel dönüşüm hilesini kullanır .


5

C, 81 73 karakter

Yalnızca negatif olmayan sayıları destekler.

char*x,*i;
main(){
    for(scanf("%d",&x);x>2;x=&x[~2])i=&i[1];
    printf("%d",i);
}

Fikir işaretçi aritmetik kullanmaktır. Sayı, xhiçbir yere işaret etmeyen işaretçiye okunur . &x[~2]= &x[-3]= x-33 çıkarmak için kullanılır. Bu sayı 2'nin üzerinde olduğu sürece tekrarlanır. Bunun yapılmasının sayısını isayar ( &i[1]= i+1).


Kodu anlamaya çalışırken, birileri bir miktar ışık tutacak mı? Teşekkürler
Cong Hui

@ Chai, açıklama eklendi.
ugoren

@ anlayabildiğim kadarıyla, printf ("% d") Hex içinde tuttuğum hafıza adres göstergesini yazdırmamalı mıydı? neden bir tamsayı basıyor? veya char * i varsayılan olarak bellek adresini 0 işaret edecek şekilde başlatıldı? Teşekkürler
Cong Hui

5

Java 86 79

Tamsayının y içinde olduğunu varsayalım:

Temel 3'te bir dizgeye dönüştürür, son karakteri kaldırır (taban 3'te sağa kaydırma ">>"), sonra tamsayıya geri dönüştürür.

Negatif sayılar için çalışır.

Eğer sayı, y <3 veya> -3 ise, o zaman 0 verir.

System.out.print(~2<y&y<3?0:Long.valueOf(Long.toString(y,3).split(".$")[0],3));

Golf kodunu ilk kez gönderme. =) Yani henüz yorum yapamam.

İpuçları için Thx Kevin Cruijssen.


Ben daha iki yıl öncesine göre geçtiğini biliyorum ama golf birkaç kısmı yapabilirsiniz: &&için &ve 2x Integeriçin Long. (Ayrıca, neden ~2sadece yerine kullanıyorsunuz -3? Aynı byte-
count'lar

1
@KevinCruijssen Çok uzun zaman sonra ilk yazımı düzenlemek için nostaljik. O zamanlar neden ~ 2'nin daha iyi olduğunu düşündüğümden emin değildim.
Vectorized

2
@KevinCruijssen, zorluk, kullanmanıza izin verilmediğini söylüyor -, ancak bunun olağandışı bir olumsuzlama için geçerli olup olmadığını bilmiyorum.
FlipTack

@FlipTack Ah tamamen haklısın. Bu durumda unut gitsin dedim. :)
Kevin Cruijssen

4

Python2,6 ( 29 ) ( 71 ) ( 57 ) ( 52 ) (43)

z=len(range(2,abs(x),3))
print (z,-z)[x<0]

print len(range(2,input(),3))

Düzenleme - Sadece negatif tamsayılarla başa çıkmamız gerektiğinin farkına vardım. Bunu daha sonra düzeltir

Düzen2 - Sabit

Edit3 - Joel Cornett'in tavsiyesine uyarak 5 karakter kurtardı

Edit4 - Giriş mutlaka STDIN veya ARGV olmak zorunda olmadığından, stdin'den herhangi bir giriş yapmadan 9 karakter kaydetti


Devam edinabs()
defhlt

yapmak için daha kısaprint z if x==abs(x) else -z
Joel Cornett

daha iyisi,print (z,-z)[x<0]
Joel Cornett

@ArtemIce teşekkürler, sadece yukarıdaki cevabı okuduktan sonra kullanabileceğimi fark ettim.
elssar

@JoelCornett humm, bunu bilmiyordum, teşekkürler
elssar

4

Javascript, 47 29

evalDinamik olarak üretmek için kullanır /. +Ekleme için değil, yalnızca dizgi birleştirme için kullanır .

alert(eval(prompt()+"\57"+3))

EDIT: "\57"yerine kullanılırString.fromCharCode(47)


-1 için alert(eval(prompt()+"\573"))?
Shieru Asakoto

4

Yakut ( 43 22 17)

Sadece golf değil, aynı zamanda şıklık da :)

p Rational gets,3

Çıktı gibi olacak (41/1). Eğer tamsayı olması gerekiyorsa, o zaman .to_isonuç eklemek zorundayız ve o zaman değişirsek to_i, to_fo zaman da yüzdürme için çıktı alacağız.


1
rationalRuby 1.9.3'te zorunlu satır olmadan çalışır . Parantezleri atlamak bir tane daha karakter kazandırır .
steenslag

4

TI-Basic, 8 bayt

Kazanan? :)

int(mean({Ans,0,0

PS Negatif sayılar için sonsuzluğa yuvarlar ( neden için buraya bakınız ). Yuvarlak için, bunun yerine sıfır yerine int(birlikte iPart(hiçbir bayt değişim için.

Test durumları

-4:prgmDIVIDE
              -2
11:prgmDIVIDE
               3
109:prgmDIVIDE
              36

3

Python 2.x, 54 53 51

print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))

_Temettü nerede ve böyle girilir.

>>> x=-19
>>> print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
- 6

Not: Etkileşimli tercümana izin verilip verilmediğinden emin değil, ancak OP’ye göre: "Giriş STDIN veya ARGV’de olabilir veya başka bir şekilde girilebilir"

Düzenleme: Şimdi python 3 için (2.x'de çalışır, ancak bir tuple basar). Negatifler ile çalışır.


Python 3 de çalışır?
Mekanik salyangoz

Abone olmak zorunda değil; sahip __len__yeterlidir.
Mekanik salyangoz

len(range(100,1000))900linux üzerinde 3.2.3 verir .
Mekanik salyangoz,

Bu negatif sayılar için işe yaramaz. Ve len(xrange(0,_,3))yine de daha kısa ve çok daha hızlı.
grc

@Mekaniksnail: Alınan nokta. Katılıyorum 3 üzerinde çalışıyor.
Joel Cornett 11

3

C ++ 191

Main ve include ile birlikte, 246, main olmadan ve içerir, sadece 178'dir. Newlines 1 karakter olarak sayılır. Tüm numaraları imzasız olarak kabul eder. Ana oyunun imzasız bir int olduğu için uyarmıyorum, bu yüzden onun adil oyunu.

Benim ilk codegolf gönderim.

#include<iostream>
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U d(U i){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}U main(){U i;std::cin>>i,std::cout<<d(i);R 0;}

sayıyı 4'e art arda bölmek için vardiya kullanır ve toplamı (1/3'e yakınsayan)

pseudocode:

// typedefs and #defines for brevity

function a(x, y):
    magically add x and y using recursion and bitwise things
    return x+y.

function d(x):
    if x = 3:
        return 1.
    variable total, remainder
    until x is zero:
        remainder = x mod 4
        x = x / 4
        total = total + x
    if total and remainder both zero:
        return 0.
    else:
        return a(total, d(remainder)).

Bunun yanında, ana yöntemi d main olarak adlandırıp, onu char * alarak ve programları return değerini çıktı olarak kullanarak ortadan kaldırabilirim. Komut satırı argümanlarının sayısını üçe bölünerek yuvarlanır. Bu, reklamını 191’ye uzatıyor:

#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U main(U i,char**q){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}

3

Golfscript - 13 karakter

~3base);3base

negatif girdiyi ele almıyor gibi görünüyor
res

1
@res s/seem to //:(. Bunun hakkında bir düşünmem gerekecek
gnibbler

3

PowerShell 57 veya 46

%PowerShell foreach operatörü olarak kullanılan 57 karakterde , modulo değil. Bu çözüm pozitif veya negatif tamsayıları kabul edebilir.

(-join(1..(Read-Host)|%{1})-replace111,0-replace1).Length

46 karakterde *, dize tekrarlama operatörü olarak izin veriliyorsa, çarpmayın. Bu seçenek, giriş değerleri olarak pozitif tam sayılar gerektirir.

("1"*(Read-Host)-replace111,0-replace1).Length

Eğer geri dönersen, bir hata düzeltmesi gönderdim. Madeni silmemi ve değişikliği kendinize eklememi istiyorsan, bana haber ver.
Veskah

3

R,

Bunlar sadece pozitif tamsayılarla çalışır:

max(sapply(split(1:x,1:3), length))
# Gives a warning that should be ignored

Veya:

min(table(rep(1:3, x)[1:x]))

Veya:

length((1:x)[seq(3,x,3)])

Veya:

sum(rep(1,x)[seq(3,x,3)])

[[EDIT]] Ve çirkin bir tane:

trunc(sum(rep(0.3333333333, x)))

[[EDIT2]] Artı muhtemelen en iyisi - Elliot G'nin yukarıdaki kod kodundan esinlenerek:

length(seq(1,x,3))

wrong sign in 'by' argument
EDIT2'nizdeki ile

3

SmileBASIC, 58 51 36 bayt (matematiksel işlev yok!)

INPUT N
BGANIM.,4,-3,N
WAIT?BGROT(0)

Açıklama:

INPUT N           'get input
BGANIM 0,"R",-3,N 'smoothly rotate background layer 0 by N degrees over 3 frames
WAIT              'wait 1 frame
PRINT BGROT(0)    'display angle of layer 0

Program, arka plan katmanını 3 kare üzerinde düzgün bir şekilde hareket ettirir ve ardından toplam mesafenin 1 / 3'ünü geçtiğinde 1 kareden sonraki açıyı alır.

Float bölümü sürümü, 38 bayt:

INPUT N
BGANIM.,7,-3,N
WAIT?BGVAR(0,7)

Açıklama:

INPUT N           'input
BGANIM 0,"V",-3,N 'smoothly change layer 0's internal variable to N over 3 frames
WAIT              'wait 1 frame
PRINT BGVAR(0,7)  'display layer 0's internal variable

3

Haskell 41 39 karakter

Tüm pozitif ve negatif tamsayılarla çalışır

f n=sum[sum$1:[-2|n<0]|i<-[3,6..abs n]]

İlk önce 0'dan girişe kadar her üçüncü tamsayı için 1'in veya (-1) 'in (girişin işaretine bağlı olarak) bir liste oluşturur n. abs(n)dahil negatif sayılar için.

Örneğin n=8 -> [0,3,6]

Daha sonra bu listenin toplamını döndürür.


Negatif sayılarla çalışmaz (-3/3 -1 değil 1).
Cormac

Olumsuz sayılar üzerinde çalışmasını sağlamanıza rağmen, / / ​​özelliğini kullanamazsınız.
Cormac

Tanrım, beni iki kez aldın. Hepsi düzeltildi;)
Charl Kruger

Güzel! Btw Sen fn = toplamı ile 39 karakter alabilirsiniz [$ 1 Özetle: [- 2 | n <0] | i <- [3,6..abs n]]
Cormac

2

Clojure, 87; negatiflerle çalışır; tembellere dayanan

(defn d[n](def r(nth(apply interleave(repeat 3(range)))(Math/abs n)))(if(> n 0)r(- r)))

Ungolfed:

(defn d [n]
  (let [r (nth (->> (range) (repeat 3) (apply interleave))
               (Math/abs n))]
        (if (pos? n)
          r
          (- r))))

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.