Tulis fungsi yang memberi tahu Anda DUA baris yang telah dihapus


19

Dalam tantangan kode saya sebelumnya , saya meminta Anda untuk menulis fungsi yang memberi tahu Anda baris mana yang telah dihapus.

Petunjuknya adalah:

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

Sekarang, mari kita coba sesuatu yang sedikit lebih sulit.

Ikuti aturan yang sama seperti di atas, tetapi kali ini, fungsinya akan mengembalikan sebuah array yang memberitahu Anda dua baris yang telah dihapus.

Jadi, misalnya, jika saya menghapus baris 1 dan 5, nilai kembali harus [1,5], dan jika saya menghapus baris 3 dan 4, nilai pengembalian harus [3,4].

Sekali lagi, jika tidak ada baris yang dihapus, fungsi harus mengembalikan 0. Poin bonus jika Anda juga dapat menangani kasing yang dihapus satu baris, tetapi Anda tidak perlu melakukannya.

Bisakah Anda memanfaatkan fungsi pembantu? Ya, tetapi hanya jika Anda harus. Satu fungsi mandiri yang melakukan ini adalah yang ideal.

Seperti halnya tantangan terakhir, solusi terbanyak menang. Saya akan memilih pemenang dalam seminggu, atau lebih cepat jika tidak ada kiriman baru yang diterima dalam 24 jam.


2
Apakah mengembalikan daftar kosong OK jika tidak ada garis yang dihapus, atau apakah harus nomor 0?
Ilmari Karonen

1
Apakah garis balik dalam fungsi adalah salah satu garis yang dapat dihapus?
le_vine

11
Bolehkah kita berharap besok versi "tiga baris" akan diposting?
Howard

Haruskah fungsi mengembalikan array secara harfiah atau bisakah itu mengedit variabel dalam lingkup global .etc? Saya tidak berpikir ini mungkin dalam 5 baris sementara sebenarnya kembali karena tidak dapat melihat ke depan karena semua baris harus kembali jika kembali dihapus. Kecuali ada beberapa kebiasaan bahasa seperti fungsi pengembalian otomatis yang tidak saya ketahui.
George Reith

Saya pikir Anda juga harus memberikan tautan ke pertanyaan Anda sebelumnya, seperti untuk seseorang yang tertarik dan belum melihatnya.
DroidDev

Jawaban:


17

Perl

sub foo {
    @a = (2..5);
    @a = grep $_ != 2, (@a ? @a : (1..5));
    @a = grep $_ != 3, (@a ? @a : (1..5));
    @a = grep $_ != 4, (@a ? @a : (1..5));
    @a = grep $_ != 5, (@a ? @a : (1..5));
}

Ini benar-benar berfungsi untuk sejumlah baris yang dihapus (asalkan tidak semua baris, yaitu), dan dapat secara sepele diperluas ke lebih dari 5 baris. Tidak ada fungsi pembantu yang digunakan, dan bahkan hanya menggunakan satu pernyataan per baris. Itu bergantung pada fakta bahwa, dengan tidak adanya returnpernyataan eksplisit , nilai kembalinya fungsi Perl adalah nilai dari pernyataan terakhir di dalamnya.

Perhatikan bahwa (dalam konteks daftar) kode ini mengembalikan daftar kosong daripada angka 0 jika tidak ada baris yang dihapus. Ini bisa diperbaiki (misalnya dengan menambahkan " @a ? @a : 0;" ke baris terakhir), tetapi akan membuat kode lebih jelek. Dalam kasus apapun, di skalar konteks itu tidak mengembalikan jumlah baris dihapus, yang akan 0 jika tidak ada garis telah dihapus. ;-)


9

Rubi

Mirip dengan versi Perl, tetapi di Ruby. Saya mengembalikan 0 jika tidak ada baris yang dihapus seperti yang diminta, tetapi saya setuju itu membuat kode lebih jelek dan tidak cukup masuk akal sebagai nilai pengembalian.

def which_lines_removed(arr = [*1..5])
  arr -= [1]
  arr -= [2] 
  arr -= [3] 
  arr -= [4] 
 (arr -= [5]).empty? ? 0 : arr
end

Jika array kosong dapat diterima sebagai nilai balik ketika tidak ada baris yang dihapus, kode ini terlihat seperti ini:

def which_lines_removed(arr = [*1..5])
  arr -= [1]
  arr -= [2] 
  arr -= [3] 
  arr -= [4] 
  arr -= [5]
end

Kedua metode ini berfungsi untuk sejumlah baris yang dihapus antara 0 dan 5.


4

JavaScript, 152 karakter dip Golf

function t() {
    var fa = (f + '').match(/\d/g)
    var ra = []
    for (var i = 0; i < 5; i++) {
        if (fa.indexOf(i + '') < 0) ra.push(i + 1)
    }
    return ra
}

function f() {
    0; return t()
    1; return t()
    2; return t()
    3; return t()
    4; return t()
}

Golf:

function t(){for(a=[],i=0;++i<5;)if((f+'').indexOf(i)<0)a.push(i+1);return a}function f(){
return t(0)
return t(1)
return t(2)
return t(3)
return t(4)
}

Cukup berisi (tapi jelek):

function f() {
    0; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    1; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    2; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    3; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
    4; var ra = []; for (var i = +![]; i < 5; i++) if ((f + '').match(/\d/g).indexOf(i + '') < +![]) ra.push(i); return ra
}

Pada dasarnya mengeksploitasi fungsi toStringdengan memberi nomor pada setiap baris. Perhatikan bahwa Anda benar-benar harus menghapus baris karena ini (berkomentar tidak akan berfungsi).

Ini sebenarnya berfungsi untuk sejumlah baris yang dihapus ! Ini akan mengembalikan array dari baris yang dihapus, atau array kosong jika belum ada yang dihapus. (Saya bisa dengan mudah mengubah itu untuk mengembalikan nol (dengan mengganti return radengan return ra || 0), tapi saya suka solusi array kosong karena akan lebih berguna di dunia nyata.)

Misalnya, menghapus baris pertama kembali [1], dan menghapus semuanya tetapi baris pertama kembali [2,3,4,5]. (Tentu saja, itu tidak berfungsi jika Anda menghapus semua baris ;-))


3

Rubi

def f
    a = [ 2, 3, 4, 5 ]
    defined?(a) ? a = a.select { |num|    num != 2 } : a = [ 1, 3, 4, 5 ]
    defined?(a) ? a = a.select { |num|    num != 3 } : a = [ 1, 2, 4, 5 ]
    a = a.select { |num|    num != 4 }
    (a = a.select { |num|    num != 5 }) == [] ? a = 0 : a
end

Cara kerjanya: ide saya adalah: membuat array, dan pada setiap baris, hapus nilai tertentu. Jadi, pada baris pertama, sebenarnya saya memiliki array [ 1, 2, 3, 4, 5], dengan elemen 1dihapus. Pada baris kedua, jika asudah ditentukan, hapus elemen 2. Jika tidak, buat array baru dengan elemen 2dihapus. Lakukan hal yang sama untuk baris 3. Pada baris 4, Anda dapat yakin bahwa sudah ada array yang dibuat, jadi hapus saja elemen 4. Pada baris 5, pertama hapus elemen 5, dan jika akemudian array kosong, kembali 0. Kalau tidak, kembalilah a.


3

Python

f=lambda:{1,2,3,4,5}-{
1,
2,
3,
4,
5,
} or 0

Mengembalikan 0 jika tidak ada garis yang dihapus, jika tidak mengembalikan garis yang dihapus. Anda dapat menghapus 1 hingga 5 baris, kecuali baris 0 dan 6 ;-).


2

JavaScript, mandiri, berfungsi untuk 0, 1, 2 baris yang dihapus ( 607  315 186 karakter)

demo langsung

Menyalahgunakan peningkatan variabel JS dan kebocoran global, seperti pada tantangan lainnya :)

function(r){
r.shift();
r.splice(r.indexOf(2),1)
r.splice(r.indexOf(3),1);a=b=1;if(this.a&&this.b)return r
var a;r.splice(r.indexOf(4),1);b=1;if(this.b)return r
var b;r.pop();return r[0]?r:0
}

dipanggil dengan array [1,2,3,4,5] sebagai parameter.

315 karakter

function(r){
var a;
var b;
var c;a=1;b=2;d=4;e=5;for(i in(z="abde".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
var d;a=1;b=2;c=3;e=5;for(i in(z="abce".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
var e;a=1;b=2;c=3;d=4;for(i in(z="abcd".split("")))if(y=this[z[i]])r.push(y);return r.length?r:0
}

dipanggil dengan array kosong sebagai parameter.



versi non-golf

(juga berfungsi untuk 3 dan 4 baris dihapus):

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

dipanggil dengan array kosong sebagai parameter.


2

JavaScript:

var f = function(){
    1
    2
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;3
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;4
    a=[];for(i=0;i++<6;){if((f+'').indexOf(i)<0){a.push(i)}}return a.length?a:0;5
}

biola


2

Javascript

(function (i){

i += .1;     // line 1
i += .02;    // line 2
i += .003;   // line 3
i += .0004;  // line 4
i += .00005; // line 5

return (Math.round((.12345-i)*100000)/100000+'').match(/([1-5])/g) || 0 })(0)

Sebut saja yang Anda suka, tapi saya pikir itu cantik .

Memungkinkan Anda tahu garis mana yang dihapus (1 atau lebih), atau 0 jika tidak ada garis yang dihapus. Semua 5 baris dapat dihapus.

EDIT:

Karena saya perhatikan bahwa kode saya mungkin sebenarnya terdiri dari 6 baris, dan melanggar aturan, saya menyesuaikannya sebagai berikut:

(Math.round((.12345 - (new (function(){

    this.i = isFinite(this.i) ? this.i + .1 : .1 ;
    this.i = isFinite(this.i) ? this.i + .02 : .02;
    this.i = isFinite(this.i) ? this.i + .003 : .003; 
    this.i = isFinite(this.i) ? this.i + .0004 : .0004;
    this.i = isFinite(this.i) ? this.i + .00005 : .00005; 

})().i || 0) )*100000)/100000+'').match(/([1-5])/g) || 0

Hal yang sama berlaku - itu akan mengembalikan array garis yang dihapus mulai dari 1- Semua atau 0 jika tidak ada.


Tidak yakin apakah ini akan membantu tetapi saya perhatikan beberapa orang lain melakukannya, jadi .. Milik saya adalah 149 karakter dengan spasi & 128 tanpa.
logic8

Karena ini bukan kode-golf, Anda tidak perlu menghapus spasi putih.
Timtech

1
Baris "return" ada di dalam fungsi, jadi fungsi sebenarnya memiliki enam baris kode, yang melanggar aturan tantangan.
jawns317

@ jawns317, saya tidak yakin bagaimana "garis" didefinisikan. Bisakah seseorang memberikan definisi yang jelas?
logic8

@ logic8 Hapus function(){dan }(dan semua fungsi pembantu). Hitung jumlah garis.
Gagang Pintu

1

Gangguan umum

(defun which-lines-are-removed (&aux (x (list 1 2 3 4 5))) 
  (setq x (remove-if #'(lambda (x) (eql x 1)) x))
  (setq x (remove-if #'(lambda (x) (eql x 2)) x))
  (setq x (remove-if #'(lambda (x) (eql x 3)) x))
  (setq x (remove-if #'(lambda (x) (eql x 4)) x))
  (setq x (remove-if #'(lambda (x) (eql x 5)) x))
)

Ini berfungsi untuk menghilangkan 1-4 baris. Jika Anda menghapus semua baris, itu akan mengembalikan sama seperti jika Anda tidak menghapusnya.

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


1

Python

def function(a = [1,2,3,4,5]):
    delete(a, len(a)-5)#1
    delete(a, len(a)-4)#2
    delete(a, len(a)-3);print a if len(a)==2 else '',#3
    delete(a, len(a)-2);print a if len(a)==2 else '',#4
    delete(a, len(a)-1);print a if len(a)==2 else '',#5

def delete(a, i):
    del a[i]
    return a

Ini bekerja untuk semua baris - tetapi hanya jika dua dihapus. Jika hanya satu baris yang dihapus maka itu akan mencetak baris dan baris yang dihapus 5. Jika terlalu banyak baris dihapus maka tidak akan mencetak apa pun.

Ini menggunakan fungsi pembantu karena kata kunci del tidak dapat digunakan sejalan dengan;; (sejauh yang saya tahu)

Pada dasarnya, setiap baris menghapus dirinya dalam array yang dideklarasikan dalam konstruktor, maka jika cukup baris telah dihapus, array dicetak.

Fungsi ini melewatkan spesifikasi dengan dua cara:

  1. itu tidak mencetak 0 jika dijalankan apa adanya (ini mengasumsikan dua baris terakhir telah dikomentari dan jadi cetak 4, 5
  2. Ini mengasumsikan bahwa printdan returndapat dipertukarkan

Akankah melakukan print ''tidak menghasilkan karakter baris baru ekstra?
SimonT

1

Déjà Vu

Berfungsi untuk menghapus sejumlah baris (selama Anda meninggalkan setidaknya satu baris)

local line n:
    try:
        dup
    catch stack-empty:
        dup set{ 1 2 3 4 5 }
    delete-from swap n

func which-gone:
    line 1
    line 2
    line 3
    line 4
    line 5

0

R

Saya memiliki versi lain dalam R yang menurut saya lebih baik (tetapi menggunakan fungsi pembantu):

trick <- function(sym, value) {
  assign(sym, value, envir=parent.frame())
  values <- unlist(as.list(parent.frame()))
  if(length(values)==5) 0 else which(!1:5 %in% values)
}

reportRemovedLines <- function(){
  trick("a", 1)
  trick("b", 2)
  trick("c", 3)
  trick("d", 4)
  trick("e", 5)
}

Atau seseorang dapat menghindari penggunaan fungsi helper dengan mendefinisikannya sebagai argumen default (berfungsi secara identik tetapi kurang dapat dibaca - namun, itu tidak menggunakan fungsi helper yang "didefinisikan secara terpisah"):

funnyVersion <- function(trick = function(sym, value) {
  assign(sym, value, envir=parent.frame())
  values <- unlist(as.list(parent.frame()))
  if(length(values)==5) 0 else which(!1:5 %in% values)
}){
  trick("a", 1)
  trick("b", 2)
  trick("c", 3)
  trick("d", 4)
  trick("e", 5)
}

Keduanya reportRemovedLines()dan funnyVersion()bekerja dengan sejumlah baris yang dihapus - kecuali jika Anda menghapus semua baris (dalam kasus itu, mereka akan kembali NULL). Mereka benar-benar mengembalikan nomor baris, bukan hanya mencetaknya - seperti pada R, nilai ekspresi terakhir yang dievaluasi dalam suatu fungsi akan secara otomatis dikembalikan.

Bagaimana cara kerjanya? Triknya adalah pada trickfungsi yang mengambil semua objek dari "lingkungan induknya" (yaitu, lingkungan fungsi yang memanggilnya), menempatkan nilai-nilai mereka bersama-sama dalam vektor, dan mengembalikan, yang nilai-nilai dari 1 hingga 5 tidak terwakili.


0

JavaScript (136/166 karakter)

Versi yang lebih kecil dengan beberapa nilai dinyatakan di awal:

function(){b=[1,2,3,4,5],i=0
    b.splice(0,1);i++
    b.splice(1-i,1);i++
    b.splice(2-i,1);i++
    b.splice(3-i,1);i++
    b.splice(4-i,1);i++
return b}

Versi mandiri (Anda tidak perlu melewatkan apa pun - argumen b ada sehingga saya dapat memeriksa apakah b didefinisikan dengan ||)

function(b){
    b=[2,3,4,5],i=1
    b=b||[1,2,3,4,5],i=i||0,b.splice(1-i,1);i++
    b=b||[1,2,3,4,5],i=i||0,b.splice(2-i,1);i++
    b.splice(3-i,1);i++
    b.splice(4-i,1);i++
return b}

Ya, keduanya memiliki returnpernyataan, tetapi itu hanya adil jika saya bersaing dengan bahasa dengan pengembalian implisit.


Benar, lebih mudah dalam bahasa-bahasa itu, tetapi bukan tidak mungkin di JS. Saya tidak menganggap salah satu dari ini telah memenuhi kendala tantangan, karena versi 136-char Anda memiliki tujuh baris kode dalam fungsi, dan versi 166-char Anda memiliki enam. Fakta bahwa Anda memiliki kode pada baris yang sama dengan tanda kurung buka atau tutup tidak berarti bahwa kode itu bukan bagian dari fungsi.
jawns317

Bagaimana dengan jawaban yang menggunakan pembantu?
Bobby Marinoff

Fungsi pembantu secara eksplisit diizinkan. Tetapi fungsi dari mana baris dihapus harus berisi lima baris kode.
jawns317

0

R

Versi sederhana (tidak mudah karena Anda akan mendapatkan kesalahan jika Anda menghapus baris 5):

doit <- function() setdiff(1:5, c(
       1,
       2,
       3,
       4,
       5
    ))

Dan versi yang sangat mudah:

doit<-function() setdiff(1:5, scan(text="
1
2
3
4
5
"))

Ini bekerja dengan sejumlah baris yang dihapus (kecuali jika Anda menghapus semua baris), dan dapat dengan mudah diperpanjang hingga lebih dari 5 baris. Menjalankannya "sebagaimana adanya" akan kembali integer(0)yang secara konseptual mirip dengan mengembalikan adil 0. Mengembalikan nilai 0 yang sebenarnya akan membuatnya lebih jelek dan lebih lama tetapi tidak akan rumit.

Akhirnya, versi menggunakan sihir:

Fungsi pembantu:

dysfunction <- function(E){
    FUN <- function(){}
    e <- substitute(E)
    e[[1]] <- as.name("list")
    nb <- quote(setdiff(as.list(1:5), x))
    nb[[3]] <- e
    body(FUN) <- nb
    FUN
    }

Fungsi sebenarnya:

df <- dysfunction({
1
2
3
4
5
})

0

C ++

void function(int & i)
{
        i=i|1;
        i=i|2;
        i=(i|4);
        i=(i|8);
        i=(i|16);
} 


int[] func2(int i)
{
    int arr[]={0,0};
    int k=0,l=1;
    for(int j=1;j<=16;j*=2,l++)
    {
        if((i&j)==0)
        {
             arr[k++]=l;
        }
    }
    return arr;
}

Cara menggunakan: panggil fungsi dengan i dan gunakan func2 untuk memahami apa yang dikatakan fungsi.

Jika Anda mengubah baris int arr [] = {0,0} ke int arr [] = {0,0,0,0,0} itu juga akan berfungsi untuk semua lima baris, itu juga handline satu garis menghapus case test secara otomatis, apa yang saya lakukan adalah hanya menggunakan bit variabel sebagai bendera untuk setiap baris ....


Tidak functionmemiliki enam baris, bukan lima?
Cel Skeggs

kembali bukan bagian dari itu, Anda dapat melihat jawaban lain juga .... itu ketergantungan bahasa
zeeshan mughal

Lihat komentar ini dari penulis tantangan di salah satu entri lain: "Benar, itu lebih mudah dalam bahasa-bahasa itu, tetapi itu bukan tidak mungkin di JS. Saya tidak menganggap salah satu dari ini telah memenuhi kendala tantangan, karena versi 136-char Anda memiliki tujuh baris kode di dalam fungsi, dan versi 166-char Anda memiliki enam. Fakta bahwa Anda memiliki kode pada baris yang sama dengan tanda kurung buka atau tutup tidak berarti kode itu bukan bagian dari fungsi. - jawns317 "
Cel Skeggs

periksa sekarang dan beri tahu saya respons Anda
zeeshan mughal

C tidak bekerja seperti itu. Ini memberikan kesalahan kompilator. Mungkin Anda berpikir tentang C ++.
Cel Skeggs
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.