Anda sedang mengembangkan beberapa kode untuk menghasilkan nomor ID. Kebijakan mensyaratkan bahwa tidak ada nomor ID yang menyertakan urutan digit 666 .
Buat fungsi (atau bahasa Anda yang setara) yang mengambil parameter bilangan bulat positif dan mengembalikan bilangan bulat berikutnya yang tidak termasuk 666 ketika bilangan bulat itu dinyatakan dalam desimal. (60606 baik-baik saja, 66600 tidak.)
Kode Anda tidak boleh menggunakan loop yang menambahkan satu sampai menemukan hasil yang sesuai dengan aturan.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
UPDATE:
Mengganti 666 dengan 667 tidak akan berfungsi jika ada lebih dari satu 666 di input.
66700
.Jawaban:
Python, tidak ada manipulasi string
Pekerjaan dengan mencari kekuatan dari 10,
p
, di mana 666 muncul, dan menambahkanp - n % p
untukn
yang menggantikan666xxxxx
dengan66700000
.sumber
m /= 10
kem //= 10
. Jika Anda tidak maka m akan menjadi pelampung dan kondisim % 1000 == 666
terus menerus akan palsu dan lainnya "666" di n yang tersisa tidak berubah.JavaScript (diperbarui untuk bekerja dengan semua kasus uji)
Kebenaran yang sedikit diketahui adalah bahwa sebenarnya ada empat
6
, tetapi salah satu dari yang dikhianati yang lain dan polymorphed ke dalam bentuk kode untuk membasmi mereka dari digit angkadunia. Inilah enam pengkhianat itu:Berikut ini penjelasannya. Pertama, percantik kode dan hapus hal-hal yang tidak berguna seperti
''+'string'
dan((code))
:Ubah notasi aneh (seperti
~indexOf
dan['replace']
) menjadi yang lebih umum:Dan sekarang cukup pahami bahwa algoritmenya seperti ini:
Jika sudah ada input 666,
lain,
Versi lama (tidak berfungsi untuk
666666666
) :Untuk memahami ini, mari kita mempercantiknya:
Sekarang mari kita hapus hal-hal yang tidak berguna seperti
'' + string
dan'str' + 'ing'
, hapuss
variabel yang tidak perlu , dan ubah keanehan seperti-~![]
menjadi1
:'l ength'['replace'](/ /g,'')
hanya"length"
:Dan
"undefined"[0]
adalah"u"
, dan"u".length
adalah1
:Sekarang kita sudah selesai! Seharusnya cukup mudah dimengerti sekarang.
sumber
666666666
666666666
, dan font dari6
pelamun;)~1
untuk!= -1
itu sangat keren.~a.indexOf('b')
buat JS yang benar, coba di livescript.net!Applescript
Situs ini tidak memiliki cukup jawaban Applescript. Mari kita singkirkan beberapa setan!
Output log:
Saya ingin mendapatkan beberapa kutipan yang lebih kuat dari The Exorcist ke dalam ini, tapi itu akan membuat ini diposting jelas NSFW. Anda dapat membaca halaman IMDB sebagai gantinya.
sumber
Perl
Anda bilang kita tidak harus menambah dalam satu lingkaran. Saya tidak menggunakan operator matematika sama sekali! Ini adalah pendekatan substitusi murni (tidak ada jaminan aman untuk kewarasan Anda).
Tiga pergantian pemain pertama menambah satu per satu. Saya memang pernah memecahkan masalah itu sendiri, tetapi itu termasuk substitusi yang harus dilingkarkan sampai tidak ada lagi penggantian yang dibuat, jadi saya menggunakan pendekatan Andrew Cheong sebagai gantinya.
Substitusi keempat mengubah semua digit setelah a
666
menjadi nol. Substitusi terakhir mengubah sisanya666
menjadi a667
.Sebagai bonus, ini akan bekerja dengan beberapa bilangan bulat dalam input selama mereka dipisahkan oleh karakter non-digit.
sumber
LiveScript
Ini menekuk aturan. Anda lihat, Anda bilang saya tidak boleh menggunakan loop yang menambahkan satu sampai ia menemukan hasil yang benar. Jadi saya mengurangi minus satu sebagai gantinya!
Versi golf dalam
534845 byte untuk bersenang-senang:Terima kasih kepada pengguna1737909 untuk membantu golf lebih jauh.
Tes
Membutuhkan Node.js dengan
LiveScript
modul npm atau pustaka yang kompatibel.sumber
Rubi
Ini adalah (saya pikir) jawaban pertama yang berfungsi untuk 666666666. (Kecuali cheaty yang mengurangi -1 jawaban.;))
Saya sedang terburu-buru sekarang; Penjelasan akan ditambahkan nanti.
Pembaruan : versi yang jauh lebih efisien (saya kira runtime hampir konstan):
sumber
PowerShell
sumber
J
Akhirnya, gunakan untuk
E.
!Intinya, kami menemukan posisi pertama di mana argumen memiliki penuh
666
, dan kami mengganti substring itu dan semuanya setelah dengan66700000...
sampai akhir.Dijelaskan secara rinci:
":@>:
- Kenaikan satu demi satu dan dikonversi menjadi string.'666'&E.
- Buatlah vektor boolean, berlaku di setiap tempat yang '666' dimulai dalam string.i.1:
- Temukan indeks true pertama dalam vektor, jika tidak kembalikan panjang vektor.#@[-]
- Panjang string (yang juga merupakan panjang vektor) minus hasil darii.
.'667'{.!.'0'~
- Ambil substring '667' dengan panjang hasil itu, padding di sebelah kanan dengan '0' jika perlu.{.~
- Ambil substring dengan panjang hasil asli darii.
.,
- Tambahkan keduanya bersamaan.Digunakan:
Dan karena ini bukan kode golf, ini tidak harus golf ke neraka dengan optimisasi gila. Semua orang menang!
sumber
C #
148137 karakterMampu mencukur beberapa karakter berkat @recursive
Tidak Disatukan:
Fiddle: http://dotnetfiddle.net/XB83bf
sumber
Int32
bisa diganti denganint
.Python
sumber
Perl
Kode sebaris yang mengubah konten di dalamnya
$_
, ideologi yang cukup standar di perl. Dapat digunakan bersamaan dengan-p
flag seperti ini:sumber
J
Tanpa string, loop, atau kondisional:
Demikian pula dengan solusi cardboard_box, ini memisahkan angka menjadi kelompok tiga digit dengan membaginya dengan kekuatan sepuluh. Ini menggunakan indeks kejadian pertama 666 untuk mengumpulkan angka dengan tepat.
sumber
Haskell (70 karakter)
Berikut ini adalah implementasi sederhana di Haskell.
map digitToInt . show
untuk mengkonversi ID jahat yang mungkin menjadi daftar angka.purge
cocokkan dengan pola jahat dan gantikan dengan padanannya yang baik.foldl' ((+).(*10)) 0
kurangi daftar digit menjadi satuInteger
.Mari kita lihat apakah itu berhasil!
Kelihatan bagus. Dan hanya untuk bersenang-senang versi golf.
sumber
Jawa
Bukankah itu cukup untuk melakukan ini?
sumber
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Mengganti 666 dengan 667 karya.
Hasil
sumber
3 jawaban JavaScript yang berbeda:
1. JavaScript (ECMAScript 6)
Bertobat jumlah ke string kemudian iterates atas masing-masing karakter sampai menemukan
666
maka perubahan yang terakhir6
ke7
dan output0
untuk semua karakter berikut.2. JavaScript (Draft ECMAScript 6)
Fungsi rekursif tanpa manipulasi string:
Atau lebih tepatnya:
Tes:
3. JavaScript
Menggunakan ekspresi reguler:
Atau (sama tetapi menggunakan ECMAScript 6)
sumber
6.667
jadi secara teknis itu masih ada. Tapi jangan berpikir itu bisa membantu.1e20
adalah tentang urutan besarnya terbesar yang akan dicetak JavaScript (setidaknya di FireFox) sebagai bilangan bulat tanpa menggunakan notasi ilmiah.AWK
memberi
sunting: solusi ke-2
hasil panen
sumber
awk
indeks berbasis string 1.f(665) returns 667
karena meminta "bilangan bulat berikutnya yang tidak termasuk 666"awk
ish dan b) meminimalkan penggunaan fungsi string.Python:
Atau:
sumber
666666
menjadi667667
bukan667000
?Jawa
Menggunakan fungsi rekursif untuk menemukan 666 paling kiri dan menghitung berapa banyak untuk menyesuaikan nomor ketika muncul lagi tumpukan panggilan.
sumber
f(666666666) -> 667000000
popularity-contest
, bukan acode-golf
.Batch
Manipulasi string berulang sederhana.
Ini dimulai pada tiga karakter pertama dari nomor (sebagai string), dan bekerja sampai akhir sampai menemukan 666, kemudian menggantikan 666 dengan 667, dan loop ke panjang string menambahkan nol.
Semua test case menghasilkan hasil yang benar.
sumber
perl, 45 byte
Regex tunggal dengan flag / e melakukan semua pekerjaan di sini:
sumber
SQL
Lebih tepatnya, SQL Server 2012 Transact-SQL.
sumber
Python
sumber
Julia
Hasil REPL
sumber
C #
Apakah saya melakukannya dengan benar
sumber
vba
Dalam aksi:
hasil:
sumber
C ++
Saya tahu ini bukan kode-golf, tetapi (a) beberapa orang menyarankan itu adalah tantangan golf yang bagus, dan (b) ini adalah tantangan / golf jawaban pertama saya, saya pikir ini akan menyenangkan, dan jika saya melakukannya ini di sini saya tidak muncul dalam tantangan golf yang sebenarnya untuk menjadi pegolf yang mengerikan. X)
Pada dasarnya, mengganti '666' dengan '667' berfungsi jika Anda melakukannya untuk contoh pertama dalam angka dan kemudian menuliskan 0 trailing.
Golfed (
175155 chars):Tidak Disatukan:
sumber
x+=c=='6'?1:0
, Anda bisa lolosx+=c=='6'
. Tapi belum pernah mencobanya.std::
sebelumnyastringstream
. Itu tidak dapat dikompilasi tanpa itu.x+=c=='6'
pengurangan, serta melihat melakukan ini dengan angka int bukan chars sstream ...Rubi
sumber
perl, 36 hanya sub, tidak ada byte
Versi yang lebih pendek dari solusi terakhir saya, menggunakan campuran ops aritmatika dan regex.
sumber
C
OK - tidak ada batas memeriksa dan spasi terlalu banyak tapi itu bukan golf. Juga sedikit menyenangkan memformat di "while (d -> 0)".
sumber