Ada 97 karakter ASCII yang ditemui orang secara teratur. Mereka terbagi dalam empat kategori:
Surat (52 total)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Angka atau Digit (10 total)
0123456789
Simbol & Tanda Baca (32 total)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Spasi (3 total)
Spasi
\t
, dan baris baru\n
. (Kami akan memperlakukan varian baris baru seperti\r\n
sebagai satu karakter.)
Untuk keringkasan, kami akan memanggil kategori ini masing-masing L, N, S, dan W.
Pilih salah satu dari 24 permutasi dari huruf yang LNSW
Anda inginkan dan ulangi tanpa batas waktu untuk membentuk templat pemrograman untuk Anda sendiri.
Misalnya, Anda dapat memilih permutasi NLWS
, jadi templat pemrograman Anda adalah:
NLWSNLWSNLWSNLWSNLWS...
Anda perlu menulis program atau fungsi berdasarkan templat ini, di mana:
Setiap
L
diganti dengan huruf apa pun (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Setiap
N
diganti dengan nomor berapa pun (0123456789
).Setiap
S
diganti dengan simbol apa pun (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Setiap
W
diganti dengan karakter spasi putih (\t\n
).
Pada dasarnya, kode Anda harus mengikuti pola
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
seperti yang disarankan judul pertanyaan, kecuali Anda dapat memilih urutan berbeda dari empat kategori karakter, jika diinginkan.
Perhatikan bahwa:
Penggantian untuk suatu kategori dapat berupa karakter yang berbeda. misalnya
9a ^8B\t~7c\n]
sesuai dengan templatNLWSNLWSNLWS
(\t
dan\n
akan menjadi karakter literal mereka).Tidak ada batasan panjang kode. mis
1A +2B -
dan1A +2B
dan1A
dan1
semua sesuai dengan templatNLWSNLWSNLWS...
.
Apa yang harus dilakukan oleh kode yang sesuai dengan templat Anda adalah menggunakan satu karakter ASCII tanpa ekstensi dan mengeluarkan angka dari 0 hingga 4 berdasarkan kategori apa yang menjadi anggotanya dalam kategorisasi di atas. Yaitu, output 1
jika input adalah huruf, 2
jika angka, 3
jika simbol, dan 4
jika spasi. Keluaran 0
jika inputnya tidak ada ( karakter kontrol ).
Untuk input, Anda dapat juga memasukkan angka 0 hingga 127 inklusif yang mewakili kode karakter ASCII input.
Input (sebagai kode char) dan pasangan output kode Anda harus tepat adalah sebagai berikut:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Input 11, 12, dan 13 sesuai dengan karakter yang kadang - kadang dianggap sebagai ruang kosong, sehingga outputnya mungkin 0
atau 4
sesuai keinginan Anda.
Kode terpendek dalam byte menang.
sumber
Jawaban:
Haskell 300 byte
Kode ini seharusnya tidak memiliki baris baru. Fungsi
m1
mengambil input sebagai aChar
dan mengembalikan jawaban sebagai aChar
.Saya tidak bisa menolak tantangan yang seseorang nyatakan tidak mungkin untuk bahasa "konvensional".
Anda dapat membantah apakah Haskell penting, tetapi sebagian besar kata kunci dan pengidentifikasi adalah beberapa karakter dan tidak dapat digunakan. Namun, definisi fungsi tingkat atas, daftar, string literal, perbandingan ketat, pencocokan pola dan percabangan dengan penjaga berfungsi, selama huruf datang tepat sebelum angka, dan jika simbol juga muncul sebelum huruf kita memiliki karakter seperti
\t
dan\r
. Sayangnya permutasi yang berfungsi untuk pemrograman umum tidak memungkinkan literal angka, jadi saya tidak bisa mendapatkan angka dengan cara yang bermanfaat.Bagaimana itu bekerja:
m1
.x1
adalah karakter yang dianalisis.f1
fungsi memecah string dengan pencocokan daftar pola, dan memiliki tiga cabang: ketika batas-batas adalah simbol lebih besar dari ruang, untuk karakter kontrol ketika batas-batas yang lolos lebih kecil dari ruang, dan untuk menangani perbandingan akhir untuk ruang itu sendiri. Nama-nama potongan daftar mnemonik untuk cabang pertama: Letter, Number, sPace, sYmbol, Remainder.b1
menangani fungsi bercabang dua karakter batass1 < b1
pada suatu waktu.Cobalah online
sumber
Retina , 113 byte
Huruf, Angka, Spasi, Simbol, Ulangi
Cobalah online!
Uji sendiri!
Retina sepertinya alat yang bagus untuk pekerjaan ini: kita dapat menggunakan semua jenis karakter secara fleksibel dalam konfigurasi panggung, dan kami memiliki beberapa kelas karakter yang telah ditentukan yang dapat berguna.
Saya pikir masalah ini dapat diselesaikan dengan tahap Penggantian atau tahap Transliterasi; Saya telah memilih Transliterasi karena lebih fleksibel dan memiliki kelas karakter yang paling berguna. Mengenai pola sumbernya, saya dipaksa untuk meletakkan simbol sebelum huruf untuk digunakan
\n
untuk baris baru (saya sebenarnya memiliki solusi yang lebih pendek menggunakan ¶ yang lebih praktis untuk baris baru, tetapi karakter non-ascii dilarang).Penjelasan
Tahap pertama adalah transliterasi. Kami menggunakan
+
dan1
sebagai opsi untuk menjaga pola berjalan tetapi mereka tidak akan mempengaruhi hasil panggung. Sintaksnya adalahT`from`to
untuk memetakan setiap karakterfrom
ke karakter di posisi yang sama dito
. Jikato
lebih pendek dari itufrom
, karakter terakhirnya diulang sebanyak yang diperlukan. Jikafrom
memiliki karakter yang berulang, hanya kemunculan pertama dari masing-masing karakter yang dipertimbangkan. Beberapa huruf sesuai dengan kelas karakter, misalnyad
setara dengan0123456789
.Dengan ini kami memetakan beberapa karakter ke karakter lain dari kelas yang sama untuk "membuat beberapa ruang" untuk transliterasi berikut. (
a
->b
,0
->1
,space
->tab
,@
->;
). Final:D0
hanya tersenyum: D0Kita mulai dengan digit,
d
adalah kelas karakter0-9
, di sini kita mentransformasikan0
->a
,1-9
->2
,space
->2
: transliterasi untuk0
danspace
salah, tetapi karakter tersebut telah dihilangkan oleh transliterasi sebelumnya.Spasi, mengubah
a
->a
, (9
,tab
,\n
,space
) ->4
.9
sudah dihapus pada tahap sebelumnya.Surat, di sini kita menggunakan dua kelas karakter yang berbeda (karena tidak ada yang lebih lengkap):
l
untuk huruf kecil danL
huruf besar. Mereka semua dipetakan ke1
, bersama dengan beberapa karakter lain yang telah ditangani pada tahap sebelumnyaSimbol. Karena setiap kelas lain telah berubah menjadi digit, di sini kami memetakan semua digit dengan
d
->d
, dan kemudian semua karakter yang dapat dicetak3
denganp
->3
. Digit juga di antara karakter yang dapat dicetak, tetapi transliterasi pertama menang.Sekarang kita perlu menetapkan
0
karakter kontrol, tetapi saya tidak menemukan cara yang valid untuk secara eksplisit mengatasi kelas itu. Sebagai gantinya, kami akan mengonversi setiap digit menjadi unary: karakter kontrol bukan digit sehingga mereka dianggap sebagai string kosong, yang sama dengan0
unary. Sayangnya, perintah konversi unary di retina adalah$*
, yang merupakan dua simbol yang saling berdekatan, jadi kami akan mengonversi "secara manual" menggunakan substitusi.Digit unary kami adalah
$n
, yang merupakan pola penggantian untuk baris baru.\b
cocok dengan "batas", di mana kata alfanumerik dimulai atau berakhir: dalam kasus kami ini akan selalu cocok dengan angka apa pun. Kami pada dasarnya mengganti setiap angkan
dengan plus baris barun-1
.Pada akhirnya, kami menghitung jumlah baris baru dan mendapatkan hasil yang diinginkan.
sumber
Kardinal
22402224 byteTemplate menggunakan LSNW
Kode ini memiliki baris baru tambahan.
Bagaimana itu bekerja:
Kode ini memiliki banyak karakter yang tidak digunakan.
% melepaskan pointer ke semua arah. 3 dari mereka baru saja mencapai ujung garis dan mati.
Pointer terakhir mengambil input di:
Input ini kemudian dibandingkan dengan setiap nilai dari 0 hingga 127.
Cetakan:
0 untuk 0-8
4 untuk 9-12
0 untuk 13-31
4 untuk 32
3 untuk 33-47
2 untuk 48-57
3 untuk 58-64
1 untuk 65-90
3 untuk 91-96
1 untuk 97-122
3 untuk 123-126
0 untuk 127
Operasi yang digunakan:
J = Lewati operasi berikutnya jika bukan nol
^ = Ubah arah ke atas
> = Ubah arah ke kiri
- = Pengurangan
+ = Penambahan
: = Ambil input
% = Buat pointer di awal program
x = Hapus pointer
0 = Atur aktif nilai pointer ke 0
Cobalah online
sumber
Perl 5 , 293 byte
291 byte kode + 2 untuk
-0p
.Saya telah diberi tahu bahwa flag-command-line gratis, tetapi saya telah menambahkannya di sini untuk visibilitas, karena tautan TIO tidak termasuk
-0
, untuk pengujian yang lebih mudah.Cobalah online!
Ini adalah tantangan yang sangat sulit untuk dipecahkan dalam hampir semua bahasa, jadi saya cukup senang saya bisa (akhirnya, banyak bermain-main dan mematikan selama beberapa waktu) membuat ini bekerja di Perl. Semoga spasi putih tambahan sebelum dan sesudah nomor tidak menjadi masalah.
Memilih urutan urutan sangat rumit, tetapi untungnya
s///
dany///
dapat menerima karakter lain sebagai pembatas sehingga dimungkinkan untuk menggunakan huruf, spasi, angka, simbol, yang memungkinkan untuks 0...0...0;
dany 0...0...0;
.Hal pertama yang diperlukan untuk appraoch adalah untuk mengganti
_
dengan!
sehingga\w
hanya akan cocok[0-9a-zA-Z]
, lalu ganti semua spasi putih (\s
) dengan\t
, semua digit dengan\r
dan semua karakter kata yang tersisa (\w
) dengan\n
untuk pencocokan mudah nanti. Kemudian, menggunakany///
operator, semua simbol yang tersisa dikonversi ke karakter kata!
ke_
dan semua karakter lainnya (antara9
dana
) digeser ke bawah 9 tempat, mengubahnya menjadi huruf atau angka. Ini kemudian diganti melalui\w
dengan3
dan yang lainnya, penggantian yang dibuat sebelumnya diganti dengan nilai-nilai bernomor mereka.sumber
Spasi , 1332 byte
Urutan adalah
1234
/LNSW
(huruf, angka, simbol, spasi putih).Cobalah secara online (input sebagai integer yang mewakili unicode karakter).
Penjelasan:
Whitespace adalah bahasa berbasis tumpukan tempat setiap karakter kecuali spasi, tab, dan baris baru diabaikan. Berikut adalah program yang sama tanpa
YO!
( 333 bytes ):Huruf
S
(spasi),T
(tab), danN
(baris baru) ditambahkan hanya sebagai penyorotan.[..._some_action]
ditambahkan sebagai penjelasan saja.Cobalah online.
Program dalam pseudo-code:
sumber