Tulis fungsi yang memberi tahu Anda baris mana yang telah dihapus


28

Tulis fungsi yang berisi lima baris.

Jika Anda menjalankan fungsi apa adanya, itu harus mengembalikan 0.

Jika Anda menghapus salah satu dari lima baris dan menjalankan fungsinya, itu akan memberi tahu Anda baris mana yang telah dihapus (misalnya, jika Anda menghapus baris terakhir, ia harus mengembalikan 5).

Keringkasan, kebaruan, dan keanggunan semuanya patut dipertimbangkan. Solusi tertinggi yang dipilih (setelah jangka waktu yang wajar) menang.


4
Bisakah fungsi mengambil parameter?
jeremy

6
Apakah pernyataan fungsi dihitung sebagai salah satu baris jika kita ingin menggunakan bahasa semacam itu, atau hanya badan yang dihitung?
meiamsome

1
Juga, apakah saluran kami harus diberi nomor 1, 2, 3, 4, 5 atau apakah ada skema penomoran apa pun?
meiamsome

@ Jeremy, ya, tidak apa-apa.
jawns317

@meiamsome, hanya body yang dihitung, dan garis harus diberi nomor 1, 2, 3, 4, 5 untuk tujuan mengembalikan nilai.
jawns317

Jawaban:


18

Rubi

Menghindari angka ajaib karena ini bukan kode golf.

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

Setiap baris mengeluarkan nomornya sendiri 1^2^3^4^5. Ini Ruby, jadi baris terakhir menentukan nilai kembali.


13

JavaScript ( 134   77   69   65   60 karakter)

→ demo langsung ←

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

panggil fungsi ini dengan n = 10.

  • Jika tidak ada baris yang hilang, baris 5 mengembalikan n == 0.
  • Jika baris 1 tidak ada, baris 5 mengembalikan n == 1.
  • Jika baris 2 hilang, baris 5 mengembalikan n == 2.
  • Jika baris 3 hilang, baris 5 mengembalikan n == 3.
  • Jika baris 4 hilang, baris 5 mengembalikan n == 4.
  • Jika saluran 5 hilang, var "a" menjadi global dan saluran 4 mendeteksi bahwa untuk mengembalikan "5".
  • Jika jalur 5 ada, mesin JS melakukan "pengangkat variabel", "a" menjadi var lokal, dan jalur 4 tidak mengembalikan "5".



Versi sebelumnya:

65 karakter

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

(harus dipanggil dengan n = 15)

69 karakter

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

(harus dipanggil dengan n = 15)

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
}

non-golf

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

Apa tepatnya yang dilakukan var asetelahnya return? Secara teori, itu seharusnya tidak tercapai.
Braden Best

@ B1KMusic, sebenarnya itu "tercapai" karena sesuatu yang disebut JavaScript variabel mengangkat. Ketika JS "dikompilasi", semua deklarasi "var" secara virtual ditempatkan di awal fungsi di mana mereka berada.
xem

Hmm, itu aneh. Apakah ada kegunaan praktis untuk ini dalam bahasa, atau ini murni golf / eksploitasi? Saya tidak ingat pernah membaca apa pun tentang pengangkatan variabel dalam dokumentasi Mozilla.
Braden Best


Ah, jadi ini lebih merupakan eksploitasi untuk bermain golf.
Braden Best

6

Python

Jika parameter diizinkan, maka ini akan berfungsi:

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
}

Fungsi ini menggunakan "konstanta" bawaan dan memberikan nilai lain untuk masing-masingnya. Jika semua variabel ini sama dengan nilai baru, fungsi mengembalikan 0. Nilai logis ditransformasikan menjadi numerik karena operator matematika. Tanda kurung di sekitar baris ke-4 memungkinkan untuk mengembalikan hasilnya (jika itu adalah perintah terakhir).


3

Lua 5.2+

55 karakter di badan fungsi tidak termasuk baris baru. Saya tidak bisa menghasilkan sesuatu yang lebih baik dari ini:

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

Berharap mendapatkan poin tambahan untuk penyalahgunaan komentar: P

Alasan itu tidak bekerja di 5.1 adalah bahwa bersarang [[]]telah dihapus, dan di 5.1 itu memberikan kesalahan kompilasi bukannya mengabaikannya seperti 5.2.

  • Jika tidak ada garis yang dihapus, fungsi tubuh sama dengan return 7-2-5
  • Jika baris pertama dihapus, return 1
  • Jika yang kedua, return 7-5
  • Jika yang ketiga, return 7-2-2
  • Jika yang keempat, return 7-2-1
  • Jika yang kelima, return 7-2

2

Rubi

Saya mencoba melakukannya dengan operasi bitwise dan kemudian saya menyadari ada solusi yang lebih sederhana menggunakan daftar! Tantangan ini paling baik dilayani oleh bahasa pemrograman yang secara otomatis mengembalikan nilai terakhir yang dilihatnya, seperti 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

2

Befunge tidak memiliki fungsi eksplisit, tapi inilah yang saya sebut fungsi di Befunge:

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

Baris pertama dan terakhir adalah fungsi mulai dan fungsi berakhir. Ia melakukan hal terdekat untuk "kembali", yaitu, mendorong nilai yang benar ke tumpukan.


1

Jawaban Baru

Saya menemukan solusi lain. Itu sangat buruk, saya sangat menyukai matematika. Solusi ini menggunakan rekursi dan variabel global (yuck!) Untuk mengetahui apakah setiap baris telah dijalankan atau tidak. Saya ingin melakukan sesuatu yang berbeda dari solusi lain, jadi ini tidak terlalu elegan, tetapi berfungsi dengan baik :)

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

Saya sangat menikmati tantangan ini, terima kasih! :)


Jawaban Lama

Saya memecahkannya menggunakan matematika. Jika setiap variabel dilihat sebagai tidak dikenal, dan kami melakukan satu deklarasi per baris, ada lima baris tidak diketahui dan lima baris: ini membawa kita ke sistem 5x5 berikut:

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.

Setelah saya menemukan nilai-nilai, saya hardcoded mereka dan menambahkan beberapa hal dasar.

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

Catatan: Jawaban Lama tidak akan berfungsi jika dibiarkan apa adanya.


Saya suka sistem persamaan persamaan linear.
ML

1

lilin lebah , 86 byte

Mencoba esolang pertamaku. Setelah kebingungan awal saya menemukan bahwa solusinya sangat sederhana.

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

Penjelasan:

program lilin lebah bekerja pada kisi heksagonal 2D. Program disimpan dalam format persegi panjang.

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

disimpan sebagai

abcd
efgh
ijkl

Petunjuk untuk bergerak ke arah tertentu adalah:

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

Penjelasan singkat

_1 p Buat IP, tambahkan 1, lalu redirect IP ke jalur 2

_^v>~2+p Buat IP lain, hanya dalam kasus baris 1 hilang, memperlambat IP untuk memastikan IP dari baris satu di depan, lalu tambahkan 2, lalu redirect ke baris 3

> >~3+p Tambahkan 3, lalu redirect ke baris 4

> >~4+X@7~8+~@$^^{; Tambahkan 4, kemudian atur nilai lstack ke-15, kemudian nilai Xst lstack ke atas dan ke-2, perlambat IP (untuk memastikan IP di jalur 5 ada di depan, jika jalur 5 ada) dan output hasilnya, kemudian hentikan program.

> >~5+@7~8+~@${; Tambahkan 5, lalu lakukan hal yang sama seperti pada baris 4, kecuali lambat.

Pada dasarnya program hanya menghitung jumlah xor 15

  • Program utuh: (1 + 2 + 3 + 4 + 5) xor 15 = 0
  • Baris 1 hilang: (2 + 3 + 4 + 5) xor 15 = 1
  • Baris 2 hilang: (1 + 3 + 4 + 5) xor 15 = 2
  • Baris 3 hilang: (1 + 2 + 4 + 5) xor 15 = 3
  • Baris 4 hilang: (1 + 2 + 3 + 5) xor 15 = 4
  • Baris 5 hilang: (1 + 2 + 3 + 4) xor 15 = 5

Tambahan >dalam baris 3 hingga 5 hanya menjamin bahwa jika salah satu dari baris 2 hingga 4 hilang, IP masih akan dialihkan dengan benar dan tidak meninggalkan program.

Anda dapat mengkloning juru lilin lebah saya, yang ditulis dalam Julia, dari repositori GitHub saya

Readme pada GitHub lebih terkini dan terstruktur lebih baik daripada halaman esolang.



0

LISP umum:

(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))
)

NB: Memiliki tanda kurung pada barisnya sendiri dianggap gaya yang buruk, tetapi karena bahasa lain memiliki enddan }saya menganggap itu diizinkan.


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 $?

Semuanya mudah ke garis 5. Kemudian perlu mendeteksi jika garis akhir hilang. Ini mengambil keuntungan dari parameter fungsi yang diizinkan dengan memanggil dirinya secara rekursif, sekali, untuk menguji nilai keberhasilannya sendiri ketika diperintahkan untuk gagal pada saluran 5, dan jika saluran 5 dihapus, saluran 4 kembali 5sebagai gantinya.

(Catatan: itu ke minimum 131 karakter jika menghapus semuanya kecuali fungsi, membuang spasi, dan mengubah / bin / bash ke / bin / sh)


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)+"*");
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.