Dallanmadan en fazla 3 sayı bulun


17

Hedefiniz bu kez dallanma veya döngüler kullanmadan maksimum 3 tamsayıyı (- 2 (2 ^ 31) ila ikili 2'nin tamamlayıcısı içinde 2 ^ 31 - 1) bulmaktır.

Sadece kullanma izniniz var

  • Eşitsizlik / Eşitlik ( ==, >, >=, <, <=, !=) gibi bu sayısı 2 jeton.

  • Aritmetik ( +, -, *, /)

  • Mantıksal İşleçler ( !değil &&, || veya)

  • Bit Operatörler ( ~değil, &ve |ya da, ^XOR, <<, >>, >>>aritmetik mantık sol ve sağ kaymalar)

  • Sabitler. 0 jeton

  • Değişken ataması. 0 jeton

3 değişkenini a, bve olarak girin c. Maksimum sayıyı çıktılar.

Standart atom kodu-golf kuralları geçerlidir. Herhangi bir sorunuz varsa lütfen yorumlarda bırakın. Bir belirteç, özel kurallarla yukarıdakilerden herhangi biridir.


Ekstra bir fonksiyon tanımlamaya ne dersiniz? Buna izin verilirse, kaç jeton sayılır?
afuous

@ voidpigeon Yalnızca 3 giriş ve çıkışı alan bir işleve sahip olmanıza izin verilir.
qwr

1
Düşündüm İlk bakışta, " biz. Önce bu yaşadım " ama karşılaştırıcılar 2 maliyet oyun biraz değiştirir düşünüyorum.
primo

@primo Özellikle 3 giriş sordum çünkü aslında bazı ilginç iyileştirmelere izin veriyor
qwr

2
Dahili fonksiyonları kullanabilir miyiz?
Kayıtlı Kullanıcı

Yanıtlar:


7

Javascript 10 simgeleri

Düzenle Yorumlarda belirtildiği gibi, bit ile uğraşmak yerine <ve * kullanarak, aralık işlemleri aralık sınırına yakın girdi için (30 bitin üzerinde) başarısız olabilir

function Max(x,y,z)
{
  var d=y-x;
  x=y-d*(d<0);
  d=x-z;
  return x-d*(d<0);
}

C 8 belirteçleri

Aslında agnostik dil, herhangi bir C benzeri dil yapacaktır. Seçici olmak için, standart C'de taşınabilir değildir, çünkü sağ kaydırma işareti genişletmeyebilir (ancak yaygın uygulamalarda).

C (ve C ++, C # ve bence Java'da), daha büyük geçici değerleri kullanarak taşma sorunlarını kolayca halledebiliriz:

int Max(int x, int y, int z)
{
    long long X = x;
    long long Y = y;
    long long Z = z;
    long long D = Y-X;
    X=Y-((D>>63)&D);
    D=X-Z;
    return (int) (X-((D>>63)&D));
}

1
Ben seçici olmak, ama C ints kullanarak kodunuzu x = 2147483647, y = -2, z = 0 için çalışmıyor. Değiştirmek isterseniz seçiminiz
qwr

10

JavaScript

6 jeton

function maxOf3(a, b, c) {
    (b>a) && (a=b);
    (c>a) && (a=c);
    return a;
}

6
+1 Kısayol değerlendirmesini bir tür dallanma olarak görüyorum, ancak kurallarda yasak değil
edc65

11
Bunu dallanma olarak
görürdüm

2
@ edc65 Öyle. İzin vermek &&ve ||büyük olasılıkla sömürülmek yerine, belirtilmesi gereken bir gözetimdi.
primo

@primo Bu ilginç bir sorundu. Bazı CISC mimarilerinin koşullu ifadeler içeren talimatlara sahip olduğuna inanıyorum, bu yüzden bunların nasıl sayılacağından emin değilim.
qwr

2
Sanırım 4 jeton olmalı &&, yani 2 <ve >. =0 gibi bir atama ve sayım olarak kullanılır
Clyde Lobo

6

C: 10 jeton

int max(int a, int b, int c)
{
    a += (b > a) * (b - a);
    a += (c > a) * (c - a);
    return a;
}

@ Openorclose'ın cevabından esinlenerek C'ye dönüştürüldü ve kısa devre boole operatörleri yerine çarpma kullanılarak dalsız hale getirildi.


3

JavaScript

14 jeton

function max (a, b, c)
{
    var ab = (a >= b) * a + (a < b) * b;
    return (ab >= c) * ab + (ab < c) * c;
}

1
Yeni işlevler oluşturmanıza izin verilmiyor
qwr

:( 14 token sonra
Fabricio

2

Birçok dil (Python) (10 jeton)

def max3(x,y,z):
    m = x ^ ((x ^ y) & -(x < y))
    return m ^ ((m ^ z) & -(m < z))

print max3(-1,-2,-3) # -1
print max3(-1,2,10) # 10

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

Oh, birisi zaten gönderdi :)


Yeni işlevler oluşturma
izniniz yok

Ahh Tamam! Yorumları
okumadım

@ qwr Anlamıyorum, dedin ki: You are only allowed to have one function, the one that takes the 3 inputs and outputs.Bu cevap tam olarak bu. 2 baskı sadece test
Cruncher

1
@Cruncher max2(max2(x,y),z)Başlangıçta yaptığım yanıtı düzenledim :)
Mardoxx

@Mardoxx ah. Kuyu +1
Cruncher

1

C ++ 11: 15 simge

Sadece aritmetik ve bitsel operatörleri kullanmak (eşitlik ve boolean mantık operatörleri çok kolaylaştırır) ...

#include <iostream>

auto max(int32_t a, int32_t b, int32_t c)->int32_t {
  return c - ((c - (a - ((a - b) & (a - b) >> 31))) & (c - (a - ((a - b) & (a - b) >> 31))) >> 31);
}

auto main()->int {
  // test harness
  std::cout << max(9, 38, 7) << std::endl;
  return EXIT_SUCCESS;
}

Büyük sayılar için başarısız olun (> 2 ^ 30), bkz. Yorum codegolf.stackexchange.com/questions/32476/#comment68870_32477
edc65

Bana iyi geliyor: ideone.com/pEsvG3
Riot

Yorumu dikkatlice okudun mu? Bence 2 milyar 0'dan büyük [ ideone.com/vlcnq9 ]
edc65

Ah, anlıyorum; evet 0 olduğunda, diğer yorumunuzda bu sayılarla ilgili bir sorun var. Ama dediğin gibi 2 ^ 30 için değil. ideone.com/LicmXa
Riot

İlgili 0 değil. Sorun büyük sayılar ve taşma, maksimum deneyin (2000000000, -200000000, 1111111111).
edc65

0

J (Rakip değil)

J'deki bir çözümün nasıl görüneceğini merak ediyordum. Bu a ,ve #olsa kullanır , bu yüzden rekabet etmez.

((a<b),(b<c),(c<a))#b,c,a

Bu yarışacak, ancak 9 jetonla çok uzun:

(b*a<:b)+(c*b<c)+(a*c<a)

0

aşağıdaki varsayımlara sahibiz:

  • max (a; b) = (a + b + | ab |) / 2

  • v max (; b); vmax (a c) (a, b c) maksimum =

  • abs (a) = (a + (a >> 31)) ^ (a >> 31)

sözde kodu kullanabiliriz:

maks. işlev (a, b, c)

{

out1 = ((a + b) + (((ab) + ((ab) >> 31)) ^ ((ab) >> 31))) div 2

out2 = ((out1 + c) + (((out1-c) + ((out1-c) >> 31)) ^ ((out1-c) >> 31))) div 2

geri dön2

}


Lütfen gerçek kodu yazın ve cevabınıza jeton sayısını girin.
ProgramFOX

0

C # (2. deneme)

Anladım ... Entegre işlev yok ...

Ancak diğer tümleşik veri türlerini veya yalnızca düz int kullanmasına izin veriliyor mu? Eğer izin verilirse ben şunu öneririm:

int foo2(int a, int b, int c)
{
   var x = new SortedList<int,int>();

   x[a] = 1;
   x[b] = 1;
   x[c] = 1;

   return x.Keys[2];
}

0

javascript 8 simgeleri

@ openorclose'ın cevabına benzer olsa da, aslında ödevin kendisi için mantıksal operatörleri kullanıyorum.

function max( a, b, c ) {
    x=( a > b && a) || b;
    return ( x > c && x ) || c;
}

Vaktini boşa harcamak


0

R (10 jeton)

function max(a, b, c) {
  max <- a
  max <- max + (b - max) * (b > max)
  max <- max + (c - max) * (c > max)
  return(max)
}

0

Brainfuck (Rakip değil)

>,[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<[-]>[-]>[-]<<<[->>>>+<<<<]>>>>[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<<

0

TIS-100, 8 işlem

MOV ACC UP #A
SUB UP     #B
SUB 999
ADD 999
ADD UP     #B
SUB UP     #C
SUB 999
ADD 999
ADD UP     #C
MOV ACC DOWN

Sağlayıcı (UP) yalnızca MOV'ları kodda gösterilmiyor 999 kenarına çok yakın olduğunda çalışmayabilir


-1

VBA (6 jeton)

 Function max3(a As Integer, b As Integer, c As Integer)
 i = IIf(a >= b And a >= c, a, IIf(b >= c, b, c))
 max3 = i
 End Function  

bunun dallanmadığından emin değilim.


Dallanma, sadece satır içi. Özellikle, her yerde üçlü üçlü operatör (esasen) izin verilen işlemlerden biri değildir.
tomsmeding

Teşekkür Ben her yerde üçlü operatör ne isteyebilir @tomsmeding (o IIF () benim kod mi?)
Alex

evet üzgünüm, her yerde mevcut demek istediğim hemen hemen her dilde mevcut ve üçlü operatör senin IIf, Inline-If. Çoğu dilde, örneğin a>=b ? a : b. Gerçekten dallanıyor.
57'de tomsmeding

-1

JavaScript: 4 jeton (** "atama" nın geniş yorumuna dayanmaktadır!)

Açıkçası 4 benim puan son derece cömert / yumuşak!

Bu puana ulaşmak için "atama" (soruda 0 jeton değerinde) olduğunu varsaydım, toplamsal atama, çıkarıcı atama, çarpma ataması ve XOR-ing ( ^=) ataması gibi şeyleri içerir

function f(a, b, c) {
  d = a;
  d -= b;
  d = d >= 0;

  a *= d;  //a = a if (a>=b), else 0
  d ^= true; //invert d
  b *= d;  //b = b if (b<a), else 0

  a += b;  //a is now max(a,b)

  d = a;
  d -= c;
  d = d >= 0;

  a *= d;  //a = a if (a>=c), else 0
  d ^= true; //invert d
  c *= d;  //c = c if (c<a), else 0
  a += c;  //a is now max(max(a,b),c)

  return a;
}

Bu ödevler gerçekten sayılırsa skor 14 :)


Çünkü d -= baslında aynı d = d - b, aritmetik kullandığınızı ve bunu bir jeton olarak saymanız gerektiğini söyleyebilirim.
ProgramFOX

Evet, farkındayım - (şaka yoluyla) “ödev” in anlamından yararlanmaya çalışıyordum. Sanırım bunu oldukça açık hale getirdim!
jcdude
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.