Hangi satırlarının kaldırıldığını bildiren bir işlev yazın


28

Beş satır içeren bir fonksiyon yazın.

İşlevi olduğu gibi çalıştırırsanız 0 döndürmesi gerekir.

Beş satırdan birini kaldırırsanız ve işlevi çalıştırırsanız, hangi satırların kaldırıldığını size bildirmelidir (örneğin, son satırı kaldırırsanız 5 değerini döndürmesi gerekir).

Kısalık, yenilik ve zerafetin hepsi dikkate değer. En yüksek yükseltilen çözüm (makul bir süre sonra) kazanır.


4
İşlev bir parametre alabilir mi?
Jeremy

6
Bu tür bir dili kullanmak istiyorsak, işlev bildirimi satırlardan biri olarak mı sayılıyor, yoksa yalnızca beden sayılıyor mu?
meiamsome, 4

1
Ayrıca, hatlarımızın 1, 2, 3, 4, 5 ile numaralandırılması mı gerekiyor yoksa herhangi bir numaralandırma düzenine izin veriliyor mu?
meiamsome,

@ Jeremy, evet, sorun değil.
jawns317

@ meiamsome, sadece vücut sayar ve çizgiler, dönüş değerleri için 1, 2, 3, 4, 5 numaralandırılmalıdır.
jawns317

Yanıtlar:


18

Yakut

Bu kod golf olmadığı için büyü rakamlarından kaçınmak.

def f
  r=2^3^4^5
  defined?(r) ? r^=2 : r=1^3^4^5
  r^=3
  r^=4
  r^=5
end

Her satır kendi numarasını çıkarır 1^2^3^4^5. Bu Ruby, bu yüzden son satır dönüş değerini tanımlar.


13

JavaScript ( 134   77   69   65   60 karakter)

→ canlı demo ←

function(n){
a=n-=1
n-=2
+3
+4;if(this.a)return 5
return n;var a
}

bu işlevi n = 10 ile çağırın.

  • Satır eksikse, satır 5, n == 0 döndürür.
  • Satır 1 eksikse, satır 5, n == 1 döndürür.
  • 2. satır eksikse, 5. satır n == 2 döndürür.
  • 3. satır eksikse, 5. satır n == 3 döndürür.
  • 4. satır eksikse, 5. satır n == 4 döndürür.
  • Satır 5 eksikse, var "a" global hale gelir ve satır 4 "5" döndüreceğini algılar.
  • Satır 5 varsa, JS motoru "değişken kaldırma" gerçekleştirir, "a" yerel bir var olur ve satır 4 "5" döndürmez.



Önceki sürümler:

65 karakter

function(n){
a=n-=1
n-=2
+3
+4;if(this.a)return 5
n-=5;return n;var a
}

(n = 15 ile çağrılmalıdır)

69 karakter

function(n){
n-=1
n-=2
n-=3
a=n-=4;if(this.a)return 5
n-=5;return n;var a
}

(n = 15 ile çağrılmalıdır)

77 karakter

function(){
a=
b=
c=
d=1;if(this.a)return 5
1;var a,b,c,d;return d?c?b?a?0:1:2:3:4
}

134 karakter

function w(){
a=1;e=1;if(this.e)return 5
b=1;if(!a)return 1
c=1;if(!b)return 2
d=1;if(!c)return 3
var a,b,c,d,e;return d?0:4
}

olmayan golfed

  function whichlineisremoved(){
    /* 1 */ var a = 1; e = 1; if(window.e) return 5;
    /* 2 */ var b = 1, a; if(!a) return 1;
    /* 3 */ var c = 1, b; if(!b) return 2;
    /* 4 */ var d = 1, c; if(!c) return 3;
    /* 5 */ var e = 1, d; if(!d) return 4; return 0;
  }

Bundan var asonra tam olarak ne yapar return? Teorik olarak, ulaşılmaması gerekir.
Braden En İyi

@ B1KMusic, aslında JavaScript değişkenleri kaldırma denen bir şey nedeniyle "erişildi". JS "derlenmiş" olduğunda, tüm "var" bildirimleri neredeyse oldukları işlevlerin başında yerleştirilir.
xem

Hmm, bu garip. Bunun için dilde pratik bir kullanım var mı, yoksa bu tamamen bir golf mü? Mozilla'nın belgelerinde değişken kaldırma hakkında hiçbir şey okumamı hatırlamıyorum.
Braden Best

bu bir JS özelliği. Burada
açıklanan

Ah, bu yüzden golf oynamak için bir istismar.
Braden En İyi

6

piton

Parametrelere izin verilirse, bu işe yarayacaktır:

def f(n=10):
    n -= 1
    n -= 2
    n -= 3
    if n == 4: return 0 if f(7) else 5
    return n - 4 or 4

4

R,

f <- function() {
  T <- FALSE
  F <- TRUE
  month.abb <- TRUE
  (pi <- 5)
  T + (!F) * 2 + (!isTRUE(month.abb)) * 3 + (pi != 5) * 4
}

İşlev yerleşik "sabitler" kullanır ve her birine başka bir değer atar. Bu değişkenlerin tümü yeni değere eşitse, işlev 0 değerini döndürür. Mantıksal değerler, matematiksel operatörler nedeniyle sayısal değerlere dönüştürülür. Dördüncü satırın etrafındaki parantezler, sonucun görünmesini sağlar (en son komut buysa).


3

Lua 5.2+

Yeni satırlar hariç fonksiyon gövdesinde 55 karakter. Bundan daha iyi bir şey bulamadım:

function f()
return 7--[[
return 1--[=[]]-2
--[[
-2--[=[]]
-5--]=]--]]-1
end

Yorumların kötüye kullanılması için fazladan puan alma umuduyla: P

5.1'de çalışmamasının sebebi, iç içe yerleştirilmiş [[]]yerlerin çıkarılmış olması ve 5.1'de ise, 5.2'de olduğu gibi yoksaymak yerine bir derleme hatası vermesidir.

  • Çizgilerden hiçbiri kaldırılmazsa, işlev gövdesi eşdeğerdir return 7-2-5
  • İlk satır kaldırılırsa, return 1
  • İkincisi, return 7-5
  • Üçüncü ise, return 7-2-2
  • Dördüncü ise, return 7-2-1
  • Beşinci ise, return 7-2

2

Yakut

Bitsel işlemlerle yapmayı denedim ve ardından listeleri kullanarak çok daha basit bir çözüm olduğunu anladım! Bu zorluk en iyi Ruby gibi otomatik olarak gördüğü son değeri döndüren bir programlama dili tarafından yapılır.

def tellMe(x=[1,2,3,4,5])
    x.delete(1)
    x.delete(2)
    x.delete(3)
    x.delete(4);x[0]
    x.delete(5);x==[]?0:x[0]
end

2

Befunge'ın açık işlevleri yoktur, ancak Befunge'de bir işlev dediğim şey:

v^    <
>v
1>v
 2>v
##3>5v
$0v4 >
>>>>>>^

İlk ve son satırlar fonksiyon başlangıcı ve fonksiyon bitişidir. “Döndürmek” için en yakın şeyi yapar, yani doğru değeri yığına iter.


1

Yeni cevap

Başka bir çözüm buldum. Bu çok kötü, matematiği çok beğendim. Bu çözüm, her satırın çalışıp çalışmadığını anlamak için özyinelemeyi ve genel değişkenleri (yuck!) Kullanır. Diğer çözümlerden farklı bir şey yapmak istedim, bu yüzden bu çok zarif değil, ama düzgün çalışıyor :)

PHP

function LOL($a) {
    if (!$a) { LOL(true); if (!$GLOBALS['b']) return 2; if (!$GLOBALS['c']) return 3; if (!$GLOBALS['d']) return 4; if (!$GLOBALS['e']) return 5; return 0; } 
    if ($a) $GLOBALS['b'] = true; else return 1;
    $GLOBALS['c'] = true;
    $GLOBALS['d'] = true;
    $GLOBALS['e'] = true;
}

Bu meydan okumayı gerçekten çok beğendim, teşekkürler :)


Eski cevap

Matematik kullanarak çözdüm. Her değişken bilinmeyen olarak görülürse ve satır başına bir bildirim yaparsak, beş bilinmeyen ve beş kod satırı vardır: bu bizi şu 5x5 sistemine yönlendirir:

b+c+d+e = 1;
a+c+d+e = 2;
a+b+d+e = 3;
a+b+c+e = 4;
a+b+c+d = 5;
//Solutions are displayed in the code below.

Değerleri bulduktan sonra, bunları kodladım ve bazı temel şeyler ekledim.

PHP

function LOL(){
    $a = 2.75;
    $b = 1.75;
    $c = 0.75;
    $d = -0.25; if ($a+$b+$c+$d == 5) return $a+$b+$c+$d;
    $e = -1.25; return $a+$b+$c+$d+$e;
}

Not: Eski Cevap, olduğu gibi bırakıldığında çalışmaz.


Doğrusal denklemlerin fikir sistemini seviyorum.
ML,

1

balmumu , 86 bayt

İlk icat edilmiş esolang'ımı denemek. İlk kargaşanın ardından çözümün çok basit olduğunu gördüm.

_1 p
_^v>~2+p
   >   >~3+p
       >   >~4+X@7~8+~@$^^{;
           >    >~5+@7~8+~@${;

Açıklama:

balmumu programları 2B altıgen ızgara üzerinde çalışır. Programlar dikdörtgen biçiminde saklanır.

    a — b — c — d
   / \ / \ / \ /
  e — f — g — h
 / \ / \ / \ /
i — j — k — l

olarak saklanır

abcd
efgh
ijkl

Belirli yönlerde hareket etme talimatları şunlardır:

    b — d 
   / \ / \                                  bd
  < —IP — >    or in compact form (β=IP):   <β>
   \ / \ /                                   pq
    p — q

Kısa açıklama

_1 p Bir IP oluşturun, 1 ekleyin, sonra IP'yi 2. satıra yönlendirin

_^v>~2+p Satır 1'in eksik olması durumunda, bir satırın IP'sinin önde olduğundan emin olmak için IP'yi yavaşlatın, ardından 2'yi ekleyin, ardından 3. satıra yönlendirin.

> >~3+p 3 ekle, sonra 4. satıra yönlendir

> >~4+X@7~8+~@$^^{; 4 ekleyin, sonra 2. lstack değerini 15'e ayarlayın, sonra XOR lstack top ve 2. değerler, IP'yi yavaşlatın (5. satırdaki IP'nin devam etmesini sağlamak için 5. satır varsa IP'nin durmasını sağlayın) ve sonucu çıkartın, ardından programı sonlandırın.

> >~5+@7~8+~@${; 5 ekleyin, ardından yavaşlama dışında 4. satırdaki gibi yapın.

Temelde program sadece bir xor 15 toplamı hesaplar

  • Program bozulmamış: (1 + 2 + 3 + 4 + 5) xor 15 = 0
  • Satır 1 eksik: (2 + 3 + 4 + 5) xor 15 = 1
  • Satır 2 eksik: (1 + 3 + 4 + 5) xveya 15 = 2
  • Satır 3 eksik: (1 + 2 + 4 + 5) xor 15 = 3
  • Satır 4 eksik: (1 + 2 + 3 + 5) xor 15 = 4
  • Satır 5 eksik: (1 + 2 + 3 + 4) xor 15 = 5

>3 ila 5 numaralı satırlardaki ekler , 2 ila 4 numaralı satırlardan birinin eksik olması durumunda IP'nin yine de doğru şekilde yönlendirildiğini ve programdan çıkmadığını garanti eder.

Julia'da yazılmış balmumu tercümanımı GitHub depomdan klonlayabilirsin

GitHub'daki benioku dosyası günceldir ve esolangs sayfasından daha iyi yapılandırılmıştır.



0

Ortak LISP:

(defun which-line-is-removed (&aux (x 30)) 
  (decf x 2)
  (decf x 4)
  (decf x 8)
  (decf x 16) 5
  (if (zerop x) 0 (log x 2))
)

Not: Kendi parantezinde bitirme parantezine sahip olmak kötü bir stil olarak kabul edilir, ancak diğer dillerin bildiğinden endve }izin verildiğini varsayalım.


0

Bash, 131 karakter

#!/bin/bash

# the function:
function f(){
  a=1;
  b=2;
  c=3;
  d=4;[ ! $1 ]&&f 1&&return 5||true
  [ $1 ]&&return 6;e=5;s=$((a+b+c+d+e));return $((15-$s))
}

# call it:
f
# report the result:
echo Removed line $?

Her şey 5. satıra kadar basit. Daha sonra son hattın geçip geçmediğini tespit etmesi gerekiyor. Bu, 5. satırda başarısız olduğu söylendiğinde kendi başarı değerini test etmek için tekrar tekrar, bir kez tekrarlamak suretiyle izin verilen işlev parametrelerinden yararlanır ve 5. satır çıkarılırsa 4. satır geri döner 5.

(Not: işlev dışındaki her şeyi çıkarırsanız, boşluk bırakarak ve / bin / bash / / bin / sh değiştirilirse en az 131 karakter olur.)


0

JavaScript

function(){
/*aa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(6)+"*")==-1)return 5;
/*aaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(5)+"*")==-1)return 4;
/*aaaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(3)+"*")==-1)return 2;
/*aaaaa*/if(arguments.callee.toString().indexOf("*"+"a".repeat(4)+"*")==-1)return 3;
/*aaaaaa*/return +!~arguments.callee.toString().indexOf("*"+"a".repeat(2)+"*");
};
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.