JS'de bir kıskaç fonksiyonunun bir üçlüden daha kısaltılması mümkün müdür?


22

0 ile 255 arasında bir sayıyı kısmak için bu kısa işlevi hayal edin:

c = n => n > 0 ? n < 255 ? n : 255 : 0

Bu, JavaScript içeren bir kıskaç fonksiyonunun mümkün olan en kısa versiyonu mu (ES.Next özellikleri olmadan)?

Not: Alakalı olup olmadığından emin değiliz, ama 0 ve 255 rastgele değil, fikir 8 bit işaretsiz tamsayı olarak bir numarayı kısmak.


2
Merhaba ve PPCG'ye hoş geldiniz! Sadece açık olmak gerekirse, burada verilen herhangi bir cevabın kod golf oynamak dışında herhangi bir şeyde kullanılması iyi bir fikir olmayacaktır. Bunun dışında, hangi sürümde / ortamda çalışması gerektiğine dikkat ediyorsanız, belirtmek isteyebilirsiniz.
FryAmTheEggman

1
Ah, farkındayım. Soruyu biraz güncelledim. Thank you :)
Ricardo Amaral

2
JS'yi tanımıyorum, ancak kenetlemenin bir yolu [0,n,255]orta öğeyi sıralamak ve almaktır - bu daha kısa olabilir mi?
Xnor

1
@xnor Ne yazık ki, JS sort()yöntemi varsayılan olarak bir sözlükbilimsel karşılaştırma kullanıyor, bu nedenle açık bir geri arama gerektiriyor. (Bunun gibi bir şey .)
Arnauld

5
@Arnauld Wow, bu çok saçma. Ancak sıralama sayısal olsa bile daha uzun olacak gibi görünüyor.
xnor

Yanıtlar:


23

20 bayt

Başvuru için, bu boşluk olmadan ve işlev isimlendirmeden orijinal sürümüdür:

n=>n>0?n<255?n:255:0

Çevrimiçi deneyin!


19 bayt

Üçlü testlerin mantığını tersine çevirerek ve büyük n>>8olup olmadığını test etmek için bir bayt kurtarabiliriz . Bitsel işlem nedeniyle, bu için başarısız olur .n255n232

n=>n<0?0:n>>8?255:n

Çevrimiçi deneyin!


19 bayt

Bu , yerine döndürür ancak .false0n232

n=>n>255?255:n>0&&n

Çevrimiçi deneyin!


18 bayt

Yukarıdaki her iki sürümü de birleştirerek, ve için döndüren bir işlevle .256232n<232falsen<0

n=>n>>8?n>0&&255:n

Çevrimiçi deneyin!

Yorumlananlar

n =>          // n = input number
  n >> 8 ?    // if n is greater than 255 or n is negative:
    n > 0 &&  //   return false if n is negative
    255       //   or 255 otherwise
  :           // else:
    n         //   return n unchanged

(Bu, yorumlarda @ValueInk tarafından önerilen kodun sabit bir revizyonudur .)


17 bayt

Geçerli giriş aralığını sınırlandırarak bir adım daha ileri gidebiliriz :224<n224

n=>n>>8?-n>>>24:n

Çevrimiçi deneyin!

Yorumlananlar

n =>          // n = input number
  n >> 8 ?    // if n is greater than 255 or n is negative:
    -n >>> 24 //   non-arithmetic right-shift of -n by 24 positions
  :           // else:
    n         //   return n unchanged

Neden orada durdun? Eğer 0 olarak sayılan şeylerle ilgili son derece liberalseniz (JavaScript'in yapması gerektiği gibi), her zaman 18 byten=>n>>8?255:n>0&&n için gidebilirsiniz , çünkü zorlanabilir ve bu, tüm negatif sayıları false0false
Value Ink

1
@ValueInk test yoksa , beforhand herhangi bir olumsuz girişi için truthy olacaktır. n<0n>>8
Arnauld

Çok hoş, çok teşekkür ederim!
Ricardo Amaral
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.