Napisz funkcję, która powie ci, która z linii została usunięta

28

Napisz funkcję zawierającą pięć wierszy.

Jeśli uruchomisz funkcję taką, jaka jest, powinna zwrócić 0.

Jeśli usuniesz jeden z pięciu wierszy i uruchomisz funkcję, powinna ona powiedzieć, która z linii została usunięta (np. Jeśli usuniesz ostatnią linię, powinna ona zwrócić 5).

Zwartość, nowość i elegancja zasługują na uwagę. Wygrywa najwyżej ocenione rozwiązanie (po rozsądnym czasie).

jawns317
źródło
4
Czy funkcja może przyjąć parametr?
Jeremy,
6
Czy deklaracja funkcji jest liczona jako jeden z wierszy, jeśli chcemy użyć tego rodzaju języka, czy też liczy się tylko treść?
meiamsome
1
Ponadto, czy nasze linie muszą być ponumerowane 1, 2, 3, 4, 5 lub czy jest dozwolony jakikolwiek schemat numeracji?
meiamsome
@Jeremy, tak, w porządku.
jawns317
@meiamsome, liczy się tylko ciało, a linie powinny być ponumerowane 1, 2, 3, 4, 5 do celów zwracania wartości.
jawns317

Odpowiedzi:

18

Rubin

Unikanie magicznych liczb, ponieważ nie jest to golf golfowy.

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

Każda linia usuwa z niej swój własny numer 1^2^3^4^5. Jest to Ruby, więc ostatni wiersz określa wartość zwracaną.

histocrat
źródło
13

JavaScript ( 134   77   69   65   60 znaków)

→ demo na żywo ←

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

wywołaj tę funkcję przy n = 10.

  • Jeśli nie brakuje żadnej linii, linia 5 zwraca n == 0.
  • Jeśli brakuje linii 1, linia 5 zwraca n == 1.
  • Jeśli brakuje linii 2, linia 5 zwraca n == 2.
  • Jeśli brakuje linii 3, linia 5 zwraca n == 3.
  • Jeśli brakuje linii 4, linia 5 zwraca n == 4.
  • Jeśli brakuje linii 5, zmienna „a” staje się globalna, a linia 4 wykrywa, że ​​zwraca „5”.
  • Jeśli linia 5 jest obecna, silnik JS wykonuje „podnoszenie zmiennej”, „a” staje się zmienną lokalną, a linia 4 nie zwraca „5”.



Poprzednie wersje:

65 znaków

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

(musi być wywołany przy n = 15)

69 znaków

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

(musi być wywołany przy n = 15)

77 znaków

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 znaki

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
}

nie golfa

  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;
  }
Xem
źródło
Co dokładnie robi var apo return? Teoretycznie nie należy tego osiągnąć.
Braden Best
@ B1KMusic, w rzeczywistości jest „osiągnięty” z powodu czegoś zwanego podnoszeniem zmiennych JavaScript. Kiedy JS jest „kompilowany”, wszystkie deklaracje „var” są praktycznie umieszczane na początku funkcji, w których się znajdują.
xem
Hmm, to dziwne. Czy jest to praktyczne zastosowanie w języku, czy jest to wyłącznie gra w golfa / exploit? Nie przypominam sobie, aby w dokumentacji Mozilli czytać o podnoszeniu zmiennych.
Braden Best
Ach, więc to raczej exploit do gry w golfa.
Braden Best
6

Pyton

Jeśli parametry są dozwolone, to zadziała:

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
Zmienność
źródło
4

R

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

Funkcja wykorzystuje wbudowane „stałe” i przypisuje każdemu z nich inną wartość. Jeśli wszystkie te zmienne są równe nowej wartości, funkcja zwraca 0. Wartości logiczne są przekształcane na wartości liczbowe z powodu operatorów matematycznych. Nawiasy wokół czwartej linii pozwalają na wyraźne zwrócenie wyniku (jeśli jest to ostatnie polecenie).

Sven Hohenstein
źródło
3

Lua 5.2+

55 znaków w ciele funkcji z wyłączeniem znaków nowej linii. Nie mogłem wymyślić nic lepszego oprócz tego:

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

Mając nadzieję na dodatkowe punkty za nadużywanie komentarzy: P

Powodem, dla którego nie działa w 5.1 jest to, że zagnieżdżone [[]]zostały usunięte, aw 5.1 powoduje błąd kompilacji zamiast ignorowania go tak, jak to robi 5.2.

  • Jeśli żadna z linii nie zostanie usunięta, treść funkcji jest równoważna z return 7-2-5
  • Jeśli pierwszy wiersz zostanie usunięty, return 1
  • Jeśli drugi, return 7-5
  • Jeśli trzeci return 7-2-2
  • Jeśli czwarty return 7-2-1
  • Jeśli piąty, return 7-2
mniip
źródło
2

Rubin

Próbowałem to zrobić z operacjami bitowymi, a potem zdałem sobie sprawę, że istnieje znacznie prostsze rozwiązanie z wykorzystaniem list! Najlepszym rozwiązaniem tego wyzwania jest język programowania, który automatycznie zwraca ostatnią wyświetlaną wartość, na przykład Ruby.

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
Danmcardle
źródło
2

Befunge nie ma wyraźnych funkcji, ale oto, co nazwałbym funkcją w Befunge:

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

Pierwszy i ostatni wiersz to początek i koniec funkcji. Robi to najbliżej „powrotu”, czyli wypycha poprawną wartość na stos.

Justin
źródło
1

Nowa odpowiedź

Znalazłem inne rozwiązanie. To bardzo źle, bardzo podobała mi się matematyka. To rozwiązanie wykorzystuje rekurencję i zmienne globalne (fuj!), Aby stwierdzić, czy każda linia została uruchomiona, czy nie. Chciałem zrobić coś innego niż inne rozwiązania, więc nie jest to zbyt eleganckie, ale działa poprawnie :)

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;
}

Naprawdę podobało mi się to wyzwanie, dziękuję! :)


Stara odpowiedź

Rozwiązałem to za pomocą matematyki. Jeśli każda zmienna jest postrzegana jako nieznana i robimy jedną deklarację w wierszu, istnieje pięć niewiadomych i pięć wierszy kodu: to prowadzi nas do następującego systemu 5x5:

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.

Kiedy znalazłem wartości, zakodowałem je na stałe i dodałem kilka podstawowych rzeczy.

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;
}

Uwaga: Stara odpowiedź nie będzie działać, jeśli pozostanie bez zmian.

Vereos
źródło
Podoba mi się pomysł na układ równań liniowych.
ML
1

wosk pszczeli , 86 bajtów

Wypróbowanie mojego pierwszego wymyślonego esolangu. Po początkowym zamieszaniu odkryłem, że rozwiązanie jest takie proste.

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

Wyjaśnienie:

Programy wosku pszczelego działają na sześciokątnej siatce 2D. Programy są przechowywane w formacie prostokątnym.

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

jest przechowywany jako

abcd
efgh
ijkl

Instrukcje poruszania się w określonych kierunkach to:

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

Krótkie wyjaśnienie

_1 p Utwórz adres IP, dodaj 1, a następnie przekieruj adres IP do wiersza 2

_^v>~2+p Utwórz kolejny adres IP, na wypadek braku linii 1, spowolnij adres IP, aby upewnić się, że adres IP z pierwszej linii jest naprzód, a następnie dodaj 2, a następnie przekieruj do linii 3

> >~3+p Dodaj 3, a następnie przekieruj do wiersza 4

> >~4+X@7~8+~@$^^{; Dodaj 4, następnie ustaw 2. wartość pierwszego stosu na 15, następnie XOR najwyższą wartość i 2. wartość, spowolnij IP (aby upewnić się, że IP w linii 5 jest przed nami, jeśli linia 5 istnieje) i wyślij wynik, a następnie zakończ program.

> >~5+@7~8+~@${; Dodaj 5, a następnie zrób to samo, co w wierszu 4, z wyjątkiem spowolnienia.

Zasadniczo program po prostu oblicza sumę xor 15

  • Program nienaruszony: (1 + 2 + 3 + 4 + 5) x lub 15 = 0
  • Brak linii 1: (2 + 3 + 4 + 5) x lub 15 = 1
  • Brak linii 2: (1 + 3 + 4 + 5) x lub 15 = 2
  • Brak linii 3: (1 + 2 + 4 + 5) x lub 15 = 3
  • Brak linii 4: (1 + 2 + 3 + 5) x lub 15 = 4
  • Brak wiersza 5: (1 + 2 + 3 + 4) x lub 15 = 5

Dodatkowe >wiersze od 3 do 5 po prostu gwarantują, że jeśli brakuje jednej z linii od 2 do 4, adres IP nadal zostaje poprawnie przekierowany i nie opuszcza programu.

Możesz sklonować mój interpreter wosku pszczelego, napisany w Julii, z mojego repozytorium GitHub

Plik Readme na GitHub jest bardziej aktualny i ma lepszą strukturę niż strona esolangs.

ML
źródło
0

MuPAD, 57 znaków

subs(()->
-d(1)
-d(2)
-d(3)
-d(4)
-d(5)
,d=Dom::IntegerMod(15))
Christopher Creutzig
źródło
0

Wspólny 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))
)

Uwaga: Posiadanie końca nawiasu we własnej linii jest uważane za zły styl, ale ponieważ inne języki mają endi }zakładam, że jest to dozwolone.

Sylwester
źródło
0

Bash, 131 znaków

#!/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 $?

Wszystko jest proste do linii 5. Następnie musi wykryć, czy ostatnia linia zniknęła. Wykorzystuje to dozwolone parametry funkcji, wywołując się rekurencyjnie, raz, aby przetestować swoją własną wartość sukcesu, gdy powiedziano jej, że zawiedzie na linii 5, a jeśli linia 5 zostanie usunięta, linia 4 powróci 5.

(Uwaga: przy usuwaniu wszystkiego oprócz funkcji, porzucaniu białych znaków i zmianie / bin / bash na / bin / sh) jest to minimum 131 znaków

Zamieszki
źródło
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)+"*");
};
SuperJedi224
źródło