Pekerjaan rumah saya adalah mengambil string dan membaginya menjadi beberapa bagian di setiap baris baru. Saya tidak tahu harus berbuat apa! Tolong bantu!
Catatan: Ini adalah pertanyaan troll kode . Tolong jangan menganggap pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini .
code-trolling
Turion
sumber
sumber
Jawaban:
C
Masalah rumit untuk kelas pemrograman C awal! Pertama, Anda harus memahami beberapa dasar tentang subjek yang rumit ini.
String adalah urutan yang hanya terdiri dari karakter . Ini berarti bahwa agar programmer dapat menunjukkan hal "tidak terlihat" (itu bukan spasi, yang dianggap sebagai karakter), Anda harus menggunakan urutan karakter khusus untuk memaksudkan hal yang tidak terlihat itu.
Pada Windows , baris baru adalah urutan dua karakter dalam string: backslash dan n (atau string
"\n"
)Di Linux atau OS / X Mac , ini adalah urutan empat karakter: backslash, n, backslash, dan kemudian r: (atau
"\n\r"
).(Catatan sejarah yang menarik: pada Macintosh lama itu adalah urutan yang berbeda dari empat karakter: "\ r \ n" ... benar-benar mundur dari cara Unix melakukan sesuatu! Sejarah mengambil jalan yang aneh.)
Tampaknya Linux lebih boros daripada Windows, tetapi sebenarnya itu ide yang lebih baik untuk menggunakan urutan yang lebih lama. Karena Windows menggunakan urutan singkat seperti itu, runtime bahasa C tidak dapat mencetak huruf yang sebenarnya
\n
tanpa menggunakan panggilan sistem khusus. Anda biasanya dapat melakukannya di Linux tanpa panggilan sistem (bahkan dapat mencetak\n\
atau\n\q
... apa pun kecuali\n\r
). Tetapi karena C dimaksudkan sebagai platform silang, ia memberlakukan common-denominator terendah. Jadi, Anda akan selalu melihat\n
di buku Anda.(Catatan: Jika Anda bertanya-tanya bagaimana kita berbicara
\n
tanpa mendapatkan baris baru setiap kali kita lakukan, StackOverflow ditulis hampir seluruhnya dalam HTML ... bukan C. Jadi jauh lebih modern. Banyak aspek lama dari C adalah sedang ditangani oleh hal-hal yang mungkin pernah Anda dengar, seperti CLANG dan LLVM.)Tetapi kembali ke apa yang sedang kita kerjakan. Mari kita bayangkan sebuah string dengan tiga potong dan dua baris baru, seperti:
Anda dapat melihat panjang string itu adalah 3 + 2 + 3 + 2 + 3 = 13. Jadi Anda harus membuat buffer dengan panjang 13 untuk itu, dan programmer C selalu menambahkan satu ke ukuran array mereka agar aman. Jadi buat buffer Anda dan salin string ke dalamnya:
Sekarang yang harus Anda lakukan adalah mencari pola dua karakter yang mewakili baris baru. Anda tidak diizinkan mencari hanya garis miring terbalik. Karena C digunakan untuk pemisahan string yang cukup banyak, itu akan memberi Anda kesalahan jika Anda mencoba. Anda dapat melihat ini jika Anda mencoba menulis:
(Catatan: Ada pengaturan di kompiler untuk jika Anda menulis program yang hanya mencari garis miring terbalik. Tapi itu sangat jarang; garis miring terbalik sangat jarang digunakan, itulah sebabnya mereka dipilih untuk tujuan ini. Kami tidak akan mengubahnya menyalakan.)
Jadi mari kita buat pola yang kita inginkan, seperti ini:
Saat kami ingin membandingkan dua string dengan panjang tertentu, kami menggunakan
strncmp
. Ini membandingkan sejumlah karakter dari string yang berpotensi lebih besar, dan memberi tahu Anda apakah mereka cocok atau tidak. Jadistrncmp("\nA", "\nB", 2)
mengembalikan 1 (benar). Ini meskipun string tidak sepenuhnya sama dengan panjang tiga ... tetapi karena hanya dua karakter yang diperlukan.Jadi mari kita melangkahi buffer kita, satu karakter pada satu waktu, mencari dua karakter yang cocok dengan pola kita. Setiap kali kita menemukan urutan dua karakter dari garis miring terbalik diikuti oleh n, kita akan menggunakan pemanggilan sistem yang sangat khusus (atau "syscall")
putc
untuk mengeluarkan jenis karakter khusus: kode ASCII 10 , untuk mendapatkan baris fisik baru .Output dari program ini adalah hasil yang diinginkan ... string split!
\t
untuk \ trolling ......
...
...
sumber
Selamat! String Anda sekarang harus dipisah. Jika tidak, ulangi langkahnya sampai tiba. Jika Anda telah mengulangi langkah-langkah itu beberapa kali dan talinya tidak terpecah, coba gunakan gunting yang lebih tajam.
DISCLAIMER: Saya tidak bertanggung jawab atas kerusakan yang terjadi pada Anda selama proses berlangsung.
sumber
Python
Saya merasa sangat buruk karena Anda diberi pertanyaan jebakan yang jelas seperti pekerjaan rumah. Bahasa yang sangat maju seperti Python menjadikan ini dua kalimat sederhana:
Harap pilih dan terima.
sumber
C
Dalam C sangat mudah:
Sebut saja seperti ini:
Contoh kerja:
http://codepad.org/GBHdz2MR
Mengapa ini jahat:
printf
fungsi untuk membagi string#define
(dan bahkan mereka yang mengerti )sumber
Ini dapat dilakukan dalam beberapa baris kode dengan algoritma sederhana berikut:
Namun, ini sia-sia. Ini pada dasarnya adalah algoritma pencarian linier , yang memiliki kompleksitas waktu linear (O (n)). Saya akan memberitahu Anda tentang teknik yang lebih maju: pencarian biner . Pencarian biner jauh lebih efisien daripada pencarian linier: ia hanya memiliki kompleksitas waktu logaritmik (O (log (n)). Ini berarti bahwa jika ruang pencarian dua kali lebih besar, waktu pencarian tidak dua kali lipat, itu hanya meningkat sebesar jumlah yang tetap!
Kode untuk pencarian biner sedikit lebih rumit, karena menggunakan teknik rekursi dan divide-and-conquer yang canggih . Tapi itu pasti sepadan untuk manfaat kinerja. Jika Anda mengirimkannya, saya berharap Anda akan mendapatkan kredit tambahan.
Inti dari algoritma ini adalah:
Anda tidak menentukan bahasa, jadi saya menulisnya dengan Python. Di dunia nyata, tentu saja, orang tidak menulis dengan Python - gunakan C atau C ++ (atau bahkan lebih baik, bahasa assembly) untuk kinerja nyata. Jangan khawatir jika Anda tidak mengerti apa yang dilakukan semua kode - ini pasti hal-hal canggih.
Tentu saja semua pernyataan tentang kinerja adalah palsu. Algoritma "sederhana" mungkin linear atau kuadratik tergantung pada bagaimana Anda menafsirkannya. Algoritma "lanjutan" adalah Θ (n × log (n)) (cukup dekat dengan linear dalam praktiknya), tetapi anak laki-laki, adalah konstanta multiplikatif yang tinggi karena pembangunan kembali daftar yang tak henti-hentinya (yang pelaksanaannya agak jauh dari cara untuk mendorong ).
Gaya Python, gaya komentar, pernyataan tentang pilihan bahasa dan hampir semua hal lain dalam posting ini tidak mencerminkan pendapat atau kebiasaan saya yang sebenarnya.
sumber
Dasar visual
The
IO
monad memiliki fungsi untuk melakukan itu!sumber
C ++
std::strstream
strstream
std::
awalan yang tidak konsistensumber
Python 3 (Rapi dan Bersih)
sumber
#define
? ;-)Rubi
Nah Anda lihat dulu Anda harus membuatnya menjadi array seperti ini
Sekarang Anda harus meletakkan elemen sebagai string
Oh juga hapus koma terakhir itu
Ups lupa, Anda harus meletakkan tanda kurung menjadi array
Sekarang cukup gunakan string dan Anda selesai
Kejahatan:
split
eval
'
atau,
sumber
Lua
Contoh input:
"Hello\nworld\nstuff"
Output:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Oh dan saya lupa menyebutkan bahwa kodenya O (n ^ 2)
sumber
Node.JS
Ini sangat sederhana, setiap programmer bisa melakukan ini.
Pertama, kita harus mengubah
hosts
file sehingga.com, .net, .org
peta menjadi127.0.0.1
.dan sisanya adalah Javascript dasar yang dapat dipahami oleh noob mana pun.
Itu dia :)
sumber
string.split('/n');
untuk membingungkan mahasiswa teori :).Rubi
String dalam pemrograman terbuat dari Einsteintanium. Karena itu mereka sangat sulit untuk dibagi.
Beruntung bagi Anda, saya memiliki gelar PhD dalam bidang kimia dan pemrograman, jadi saya dapat membantu.
Kami akan menggunakan ruby untuk ini.
Ini jahat karena:
sumber
SplitStr
selalu terbelah oleh baris baru tidak peduli apa argumennya, tidak yakin apakah disengajaC ++
Berkat fitur baru yang kuat dari bahasa pemrograman C ++ ini dapat diselesaikan dengan mudah menggunakan perpustakaan standar, ingat jangan menciptakan kembali roda .
Sunting: Jawaban ini jelas hanya mencoba untuk membuat sesuatu yang sangat rumit untuk tugas sepele, dan sambil melakukan itu menyalahgunakan alat sebanyak yang saya bisa sementara masih bisa menulis kode.
Berikut beberapa hal yang perlu diperhatikan:
sumber
C #
Ini menggunakan teknologi rekursi untuk mengubah baris baru menjadi koma. String CSV yang dihasilkan dapat dengan mudah dipisah menjadi sebuah array.
sumber
C ++
Terlihat sepenuhnya dapat dipercaya dan buku teks hingga ungkapan terakhir. Itu bahkan benar, coba jelaskan ini kepada guru Anda.
Tentu saja tidak ada pembenaran untuk itu
std::for_each
, tetapi memungkinkan kita untuk salah menggunakan lambda. Lambda itu sepertinya mengembalikan sesuatu, tetapi kenyataannya tidak. Operator ternary ada hanya untuk efek samping.sumber
Baik! Jadi masalah ini menjadi sangat mudah dengan menggunakan beberapa fitur python yang kurang dikenal, termasuk pernyataan #define (mereka baru-baru ini memindahkannya dari C ++) dan pendaftaran otomatis metode pada kelas builtin.
Seberapa baik itu?
Penjelasan
... ada daftar trolling yang cukup besar di sini.
Sebenarnya, program ini berfungsi (setidaknya dalam Python 3.3.0, dan selain masalah input baris tunggal) karena banyak hal yang membuatnya tidak melakukan apa yang dikatakan digabung untuk membuatnya benar-benar berfungsi.
sumber
LOLCODE obyektif
sumber
ANSI C
Ini adalah tugas standar yang telah kita semua lakukan. Ini adalah solisi yang diterima secara umum.
Anda harus menyertakan perpustakaan dengan fungsi yang benar untuk dipecah dan dicetak.
#include <stdio.h>
Buat string yang ingin Anda bagi:
const char * input = "First Line\nSecond Line\nThird Line\n";
Perhatikan bagaimana saya menggunakanconst
kata kunci untuk menggambarkan bahwa printf tidak memiliki sarana untuk mengubah input Anda. Ini penting karena Anda selalu ingin mempertahankan input pengguna dalam bentuk aslinya untuk tujuan hukum.printf("%s", input);
melakukan pemisahan untuk Anda seperti yang Anda lihat di output konsol.getchar();
hanyalah trik ekstra kecil untuk menjaga konsol tetap bertahan saat Anda memeriksa output.Input:
"First Line\nSecond Line\nThird Line\n"
Menciptakan output:
sumber
Python
Kita dapat menggunakan
find()
metode string Python secara iteratif untuk membagi string pada setiap instance baris baru (perhatikan bahwa string input dikodekan sebagaiinput_str
, tetapi dapat diganti dengan raw_input ()):Menjalankan skrip di atas, kami mendapatkan output yang diharapkan (perhatikan bahwa spasi putih depan dan belakang konsisten dengan pemisahan string pada setiap kemunculan baris baru):
sumber
PHP / GD
Memisahkan string adalah masalah yang sangat rumit. Meskipun kami melanjutkan dan membuat implementasi yang cukup mendasar untuk masalah pekerjaan rumah yang sangat penting ini.
Berjalan tanpa ketergantungan pada versi PHP terbaru: Jumlah contoh terbatas dalam kode yang diposkan karena kami memiliki batas karakter sekitar 40.000 karakter di sini yang tidak sesuai dengan jumlah string demonstrasi yang layak.
Versi contoh:
http://codepad.viper-7.com/YnGvCn
Tepat mengkonfirmasi untuk spesifikasi Anda.
sumber
Saya tidak ingin menjadi kejam, jadi inilah bagian kerja kode Python yang membagi string Anda menjadi beberapa bagian. Namun, karena Anda tidak menentukan di mana Anda ingin dibagi, saya hanya akan memilih lokasi acak. Saya harap tidak apa-apa dengan Anda.
sumber
Python
sumber
Untuk bahasa yang mendukung ekspresi reguler dan
split
fungsi yang tersedia, Anda harus selalu menggunakannya untuk membagi string. Ini membantu Anda menghindari menciptakan kembali roda dan menjaga kode Anda pendek dan manis. Menggunakan ekspresi reguler juga memungkinkan Anda untuk porting kode Anda ke bahasa lain tanpa mengubah ekspresi reguler Anda.Solusi buruk
Ada solusi yang jelas di mana Anda membaginya dengan
\n
atau\r\n
:Jawa
PHP
Solusi itu adalah sampah dan tidak boleh digunakan. Di zaman sekarang ini, sia-sia untuk menghindari Unicode, alih-alih setiap programmer harus menerimanya dan memastikan aplikasi Anda siap dengan Unicode. Jika Anda hanya mempertimbangkan
\n
atau\r\n
sebagai pemisah baris baru, Anda sedang menulis perangkat lunak di tahun 90-an. Di zaman Unicode ini, Anda harus mempertimbangkan U + 0085, U + 2028, U + 2029 sebagai pemisah garis yang valid. Karena Unicode diperbarui setiap sekarang dan kemudian, dan biasanya perlu waktu sebelum Anda menyadarinya telah diperbarui, mungkin ada pemisah baris baru yang ditambahkan ke Unicode. Jangan khawatir, karena semua mesin ekspresi reguler siap dengan Unicode, dan diperbarui secara berkala untuk menyesuaikan dengan standar Unicode terbaru. Jadi jika Anda menggunakan bahasa yang ditafsirkan, kode Anda akan diperbarui tanpa Anda melakukan apa pun.Solusi yang disarankan
Untuk membagi string dengan terminator garis, dan tetap up-to-date dengan evolusi Unicode, berikan regex
^
dan tentukanMULTILINE
mode.Secara default,
^
hanya cocok dengan awal string. DalamMULTILINE
mode,^
juga cocok dengan awal baris, yaitu setelah terminator garis.Sebagai contoh:
Jawa
PHP
Perhatikan bahwa ada entri string kosong tambahan di depan, cukup hapus atau loop dari indeks 1.
Penjelasan
Pada pandangan pertama, ini tampak seperti jawaban yang baik dengan solusi (agak) bekerja, ditambah dengan penjelasan dengan beberapa rekomendasi pengkodean praktik terbaik. Namun, solusinya sendiri adalah troll ( "Saya tahu, saya akan menggunakan ekspresi reguler." Sekarang mereka memiliki dua masalah. ), Dan seluruh posting ditaburi dengan informasi yang salah secara halus, yang akan meracuni setiap pemula untuk pemrograman.
MULTILINE
mode, perilaku^
dan$
tergantung pada definisi "terminator garis". Java menganggap\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
menjadi garis terminator, di mana\r\n
urutan dianggap atom. JavaScript menganggap\n
,\r
,\u2028
,\u2029
untuk menjadi line terminator. Ruby hanya menganggap\n
sebagai terminator garis.split
fungsi mungkin memiliki semantik berbeda dalam bahasa yang berbeda untuk kasus sudut. Python tidak terpecah pada kecocokan kosong, Java menghapus jejak kosong (kecuali Anda menentukan batas negatif), JavaScript tidak terpecah pada kecocokan string kosong pada indeks 0.sumber
Skrip bash
Ini membagi string dengan baris baru. Jika Anda menggema
$new_string
, Anda akan melihat bahwa itu mengganti baris baru ke pemisah array.Output sampel:
sumber
Jawa
Ini tidak membaca dari file. Ekspresi reguler digunakan. Kode mengasumsikan bahwa string yang dibaca memiliki karakter '\ n' untuk menunjukkan baris baru. Angka 1,2,3,4 digunakan untuk menunjukkan perpecahan.
sumber
C #
sumber
Anda tidak menentukan apakah "baris baru" yang Anda inginkan untuk membagi string Anda peka terhadap huruf besar atau kecil. Saya menganggap tidak sensitif.
sumber
Kawan, ini sangat mudah dilakukan di Powershell.
Dapatkan string Anda seperti ini:
Kemudian lilitkan ascii acak hingga string Anda terbelah menjadi dua seperti ini:
akhirnya Anda harus mendapatkan string split, yang dapat Anda hasilkan seperti ini:
Keluaran:
sumber
Php
Inilah cara Anda membagi string. Bukankah itu mudah?
Yang harus Anda lakukan sekarang adalah menulis fungsinya
Spliter()
sumber
spesifik bash
Ada pekerjaan bagus untuk bash !
Ya, memisahkan string dapat dilakukan dengan cara yang sangat sederhana:
Pertama, Anda harus menginisialisasi variabel yang akan Anda gunakan untuk menyimpan hasil pemisahan Anda:
Sekarang karena setiap baris dibatasi oleh dua pemisah, mulai atau akhir string, Anda akan memerlukan variabel untuk menyimpan yang pertama
Oke, sekarang Anda bisa mencari pemisah dan menyimpan garis Anda menggunakan loop . Karena bash tidak bisa berfungsi dengan nilai biner, Anda bisa menggunakan alat seperti
od
untuk bekerja dengan nilai heksadesimal, untuk sampel:Sekarang, kita memiliki string terpisah yang disimpan ke dalam variabel
lines
:Kita bisa mencetak menggunakan:
Masukkan semua ini dalam satu skrip:
Ini akan mencetak:
Pesta modern
Tetapi menggunakan implementasi bash modern , Anda bisa menyimpan chars kontrol seperti baris baru ke dalam variabel, dan bahkan mengujinya:
bash golf
Tetapi jika Anda tidak peduli tentang keterbacaan, Anda bisa menulis skrip kental seperti:
Skrip golf dapat muncul sebagai:
dan akan memberikan efek yang sama: Baris pertama membagi string dan menyimpannya dalam larik bernama baris . Dan baris kedua akan mencetak setiap anggota array '' baris '', diikuti oleh a baris baru .
konsol bash + vt
Tetapi karena banyak orang menggunakan konsol teks berdasarkan standar ANSI VT , Anda dapat menggunakan perilaku VT konsol Anda dan menulis ini lebih pendek lagi:
akan memberikan hasil yang sama.
sumber