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.