COBOL adalah bahasa yang sangat tua, pada saat penulisan ini berusia 58 tahun. Sebenarnya sudah sangat tua sehingga memiliki kekhasan yang sangat menarik: enam karakter pertama dari setiap baris adalah komentar.
Mengapa ini, Anda bertanya? Nah, 6 karakter itu dimaksudkan untuk digunakan sebagai nomor baris, kembali pada hari di mana program tidak sepenuhnya digital dan diketik di komputer.
Selain itu, karakter ketujuh hanya bisa menjadi bagian dari set yang sangat kecil (biasanya *
untuk mengomentari garis atau spasi untuk memisahkan nomor baris dari kode)
Tetapi bagaimana jika Anda menggunakan sistem yang lebih digital, dan Anda hanya menginginkan program mentah?
Sistem komentar
Ada dua jenis komentar di COBOL: komentar baris dan komentar "nomor baris" yang disebutkan di atas.
Nomor garis komentar sederhana adalah sederhana: hanya mengambil tujuh (enam ditambah satu spasi) karakter pertama dari setiap baris.
000000 apple
000001 banana
celery donuts
akan menjadi:
apple
banana
donuts
Komentar garis membuatnya sedikit lebih sulit. Komentar baris dimulai dengan tanda bintang yang *
ditempatkan di posisi karakter ketujuh di baris, seperti:
000323* this is a comment
Ini bukan komentar baris:
*00000 this isn't a comment
Untuk menghapus komentar baris, cukup hapus seluruh baris.
Contoh berkomentar "program":
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
Versi tanpa komentar:
blah blah
oranges?
love me some oranges
Dengan kata lain, untuk menghapus tanda komentar pada sebuah string, hapus enam karakter pertama dari setiap baris, lalu kembalikan semua kecuali karakter pertama dari setiap baris yang tidak dimulai dengan bintang.
Tantangan
Buat program atau fungsi yang mengambil program yang dikomentari dan mengembalikan varian yang tidak diomortasikan.
Klarifikasi
- Tanda bintang (
*
) tidak akan pernah ditemukan di mana pun di luar tujuh karakter pertama pada sebuah baris (kami tidak meminta Anda memverifikasi sintaksis) - Setiap baris akan selalu memiliki setidaknya 7 karakter.
- Anda mungkin menganggap karakter ketujuh selalu tanda bintang atau spasi.
- Input atau output dapat berupa matriks atau daftar.
- Hanya karakter ASCII yang dapat dicetak (ditambah baris baru) yang harus ditangani.
- Anda dapat menampilkan dengan baris baru tambahan. Anda juga dapat berasumsi bahwa input tersebut akan memiliki baris tambahan, jika Anda memilihnya.
Mencetak gol
Karena ini adalah kode-golf , jawabannya dengan byte paling sedikit menang!
PENOLAKAN: Saya tidak benar-benar tahu COBOL dan tidak mengklaim. Jika ada klaim tentang COBOL yang saya buat dalam pertanyaan ini salah, saya tidak bertanggung jawab.
*
. Apakah ini suatu kebetulan?key:{key:{key:length,key:length}}
. Hapus semua format data dan ketikkan data.Jawaban:
COBOL (GnuCOBOL), 191 + 17 = 208 byte
Saya "belajar" COBOL untuk jawaban ini, jadi mungkin tidak sepenuhnya golf.
Ini adalah program lengkap, mengambil input tentang apa yang saya anggap sebagai input standar dan menulis apa yang saya anggap sebagai output standar. Mungkin suatu hari saya akan kembali ke ini dan (1) menentukan apakah COBOL memiliki fungsi dan, jika demikian, (2) melihat apakah solusi fungsi akan lebih pendek.
Hitungan byte termasuk flag program dan compiler (
-free
dan-frelax-syntax
).Cobalah secara Online
Program tidak digabungkan
Keterbatasan
Outputnya, secara teknis, tidak benar. Dari penelitian sepintas saya, tampaknya satu-satunya cara praktis untuk menyimpan string dalam COBOL adalah dalam buffer ukuran tetap. Saya telah memilih ukuran buffer 80 karakter, karena ini adalah batas panjang garis untuk program format tetap. Ini menyajikan dua batasan:
Saya kira ini bisa diterima karena, well, itu COBOL. Jika tidak, saya bersedia mencari alternatif.
Ucapan Terima Kasih
sumber
Python 2 ,
393837 byte-1 byte terima kasih kepada LyricLy. -1 byte terima kasih kepada Mego.
Cobalah online!
I / O sebagai daftar string.
sumber
!=
dengan<
, karena titik kode ruang lebih rendah dari satu tanda bintang itu, dan karakter ketujuh akan selalu menjadi ruang atau tanda bintang.You may assume the seventh character is always an asterisk or a space.
if'*'!=i[6]
Perl 5 ,
19+ 1 (-p) =2016 byte-4 byte dengan saran Pavel
Cobalah online!
sumber
(\*.*$| )
dengan( |.*)
/ /;$_=/\* /?$,:$'
merupakan alternatif lain^
.V ,
131110 byteCobalah online!
Penjelasan
Hexdump:
sumber
7x
bukan6x<<
?*
*
pertama dan kemudian lakukanÎ7x
? (dengan asumsi * tidak bisa tidak dalam karakter 0-5)*
dalam 6 karakter pertama.Paradoc (v0.2.8 +), 8 byte (CP-1252)
Mengambil daftar garis, dan menghasilkan daftar garis yang tidak diomentari.
Penjelasan:
Hai, saya menulis bahasa pemrograman golf. :)
Saya masih mengembangkan ini dan menambahkan / men-tweak sekelompok built-in setelah mencoba menulis ini sehingga ada cara yang lebih masuk akal untuk membedakan antara spasi dan tanda bintang daripada "
7#
", tapi saya merasa seperti itu akan membuat ini tidak bersaing. Untungnya masih bekerja (ini hanya menggunakan fitur dari v0.2.8, yang saya lakukan tiga hari yang lalu).sumber
Oktaf, 23 byte
Cobalah online!
sumber
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, di manas
array sel, bukan array string. Menggunakan regexp atau sesuatu mungkin akan lebih pendek, tetapi metode yang saya tulis ini sebanding dengan metodologi dalam jawaban ini hanya untuk MATLAB lamaJelly ,
119 byteCobalah online!
Input dan output sebagai daftar garis.
-2 byte terima kasih kepada @EriktheOutgolfer dan @JonathanAllan
Bagaimana itu bekerja
sumber
7$€
bisa€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 byte
Cobalah online!
Input pipeline datang sebagai array string,
-replace
bekerja pada setiap string, dan-ne ''
(tidak sama dengan string kosong) yang diterapkan pada array, bertindak untuk menyaring baris kosong.sumber
C,
635955484746 byteBerkat " pengguna anonim " karena telah menyingkirkan byte lain.
Terima kasih kepada Felix Palmen karena mengingatkan saya pada " Anda dapat menganggap karakter ketujuh selalu merupakan tanda bintang atau spasi. ", Yang memangkas satu byte lagi.
Gunakan seperti:
Cobalah online!
sumber
Sebenarnya , 13 byte
Input dan output dilakukan sebagai daftar string.
Penjelasan:
Cobalah online!
sumber
Gaia , 9 byte
Fungsi menerima daftar string dan mengembalikan daftar string.
Cobalah online!
Penjelasan
sumber
⁈
dan«
keduanya 1 karakter. Bahasa pegolf keluar yang menggunakan karakter non-ascii (mungkin kecuali untuk Neim) menggunakan penyandian khusus, yang memungkinkan semua non-ASCII dihitung sebagai satu byte. Ini adalah halaman kode Gaia .Pyth , 9 byte
Perhatikan bahwa ini hanya berfungsi jika setidaknya 1 baris bukan komentar dan setidaknya 1 baris adalah komentar. Semua solusi lain berfungsi dalam semua kasus.
-2 byte terima kasih kepada @pizzakingme !
Coba di sini!
Penjelasan
Pyth , 11 byte
Coba di sini!
Penjelasan
Pyth , 11 byte
Coba di sini!
Penjelasan
Pyth , 12 byte
Coba di sini!
Penjelasan
Pyth , 12 byte
Coba di sini!
Penjelasan
sumber
m>d7.m@b6
harus bekerja pada 9 byte, menyalahgunakan yang*
setelah ruang dalam urutan leksikografisGNU Sed, 19 + 2 = 21 karakter
Membutuhkan
-E
argumen untuksed
mengaktifkan ekspresi reguler yang diperluas.sumber
s/^.{6}( |.*)//g
Java 8, 40 byte
Ekspresi reguler: hanya tentang, tetapi tidak cukup, alat yang salah untuk pekerjaan itu. Lambda dari
String
keString
(menetapkan keFunction<String, String>
). Input harus memiliki baris tambahan tambahan.Cobalah secara Online
Ucapan Terima Kasih
sumber
Haskell ,
2725 byteVersi Laikoni lebih pendek dari versi saya:
Cobalah online!
Versi saya:
Cobalah online!
sumber
f n=[x|' ':x<-drop 6<$>n]
.C (gcc) ,
534846 byteCobalah online!
-5 byte: Sangat sulit untuk " keseluruhan program " ini turun ke ukuran yang sama dengan fungsi gurka . Sekarang menulis di luar batas (di kedua arah) dari array jenis yang salah dan bergantung pada sedikit bilangan bulat endian dan 4 byte untuk menemukan tanda bintang ... tapi hei, itu berfungsi;)
-2 byte: Baiklah, jika kita sudah menulis ke beberapa
.bss
lokasi "acak" , mengapa repot-repot mendeklarasikan array sama sekali! Jadi di sini datang program penanganan string yang menggunakan baik yangchar
jenis atau array.sumber
*x&2
membuat saya ingat, jadi saya harus bisa mencukur beberapa byte off jawaban saya :-) "Anda mungkin menganggap karakter ketujuh selalu tanda bintang atau ruang."R,
4745 bytesumber
pe=T
argumen. Namun, saya tidak yakin apakah input sebagai daftar string diperbolehkan.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 byteCobalah online!
Pencocokan pola di SNOBOL sangat berbeda dari regex tetapi idenya di sini masih sama: Jika sebuah baris cocok dengan "enam karakter dan kemudian tanda bintang", hapus, jika tidak, hapus tujuh karakter pertama dari garis dan cetak hasilnya.
Ini sekarang benar-benar mengambil keuntungan lebih baik dari operator penugasan bersyarat SNOBOL.
Pola inilah
POS(6) (' ' REM . OUTPUT | '*')
yang diartikan sebagai:Mulai dari posisi 6, cocokkan spasi atau tanda bintang, dan jika Anda cocok dengan spasi, tetapkan sisa baris ke
OUTPUT
.sumber
Vim, 14 byte
Ctrl-V
G5ld:%g/\*/d
EnterMemuat file input sebagai buffer untuk diedit, lalu masukkan perintah di atas. Output adalah buffer baru.
sumber
Ruby ,
39383629232220 + 1 = 21 byteCobalah online!
Menggunakan
-p
benderaPenjelasan:
The
-p
bendera menambahkan blok implisit sekitar kode, sehingga kode yang benar-benar akan dijalankan terlihat seperti ini:gets
membaca sebaris teks dan menyimpan hasilnya dalam$_
.$_[/.../]=''
menghapus kemunculan pertama regex...
di$_
./.{6}( |.*\n)/
cocok dengan 6 karakter apa pun di awal baris, diikuti spasi atau sisa baris. Karena spasi muncul pertama, itu akan mencoba untuk menghapus hanya 6 karakter pertama dan spasi sebelum mencoba untuk menghapus seluruh baris.$_
kemudian dicetak, dan proses ini diulang untuk setiap baris.sumber
Pyke , 9 byte
Coba di sini!
Dapat dibaca:
Coba di sini!
sumber
Retina ,
2315 byte5 byte disimpan berkat nmjcman101
1 byte disimpan berkat Neil
Cobalah online!
sumber
JavaScript (ES6), 48 byte
Cobalah online!
sumber
z
, yang tidak diizinkan di sini. Namun Anda dapat mengubahnya menjadi fungsi panah anonim, agar membuatnya valid.(
dan)
seputar fn, menambahkannya untuk memastikan.()
fungsi di sekelilingnya, tetapi jika tidak, fungsi ini akan terlihat baik.> <>,
5753 Bytescoba online
Penjelasan
Edit: 53 byte
Pada dasarnya hal yang sama seperti sebelumnya, tetapi sedikit terstruktur
Sebagai catatan: Saya kecewa belum ada yang melakukan ini di cobol.sumber
C #,
160 145 9089 byteTerima kasih kepada Pavel & auhmaan untuk mengurangi ukurannya.
sumber
t=>{...}
func<string, string>
.Python 3, 71 byte (tanpa regexp)
Berhasil!
sumber
05AB1E , 11 byte
Cobalah online!
sumber
.$
tidak ada saat itu. : PJavaScript,
4434 byteDicoret 44 masih teratur 44.
6 byte disimpan berkat tsh
Cobalah online!
sumber
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (Tidak Standar, Stage3) Chrome62 +?
setelah\n
).C ++ (GCC),
121112 byteTerima kasih kepada @urka untuk menghemat 9 byte!
Mengambil input sebagai daftar baris.
Cobalah online!
sumber
#import
? Juga, saya pikir tidak masalah untuk menghilangkan standar termasuk.#import
bukan C ++ standar, tetapi setidaknya GCC dan MSVC mendukungnya. Menghilangkan beberapa termasuk karya dengan C, tetapi tidak dengan C ++. Kode tidak berfungsi tanpa menyertakan, jadi mereka harus dihitung dalam total bytecount.import
jawaban python atauusing
dalam jawaban C #. Juga, bukankah#include <bits/stdc++.h>
jawaban Anda lebih pendek?system.foo()
daripadausing system;foo()
Java 8,
955453 byte-42 byte terima kasih @ OliverGrégoire , dengan menggunakan
Stream<String>
alih - alihString
sebagai in- dan output.Penjelasan:
Coba di sini.
sumber
String[]
atauList<String>
sebagai input untuk -12 byte.Stream<String>
jika itu bisa membantu. Contoh:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
sebesar 54 byte.<42
alih-alih!=42
karena "Anda dapat menganggap karakter ketujuh selalu merupakan tanda bintang atau spasi."