Kami akan mendefinisikan ASCII Odd / Even Cipher melalui pseudocode di bawah ini:
Define 'neighbor' as the characters adjacent to the current letter in the string
If the one of the neighbors is out of bounds of the string, treat it as \0 or null
Take an input string
For each letter in the string, do
If the 0-based index of the current letter is even, then
Use the binary-or of the ASCII codes of both its neighbors
Else
If the ASCII code of the current letter is odd, then
Use the binary-or of itself plus the left neighbor
Else
Use the binary-or of itself plus the right neighbor
In all cases,
Convert the result back to ASCII and return it
If this would result in a code point 127 or greater to be converted, then
Instead return a space
Join the results of the For loop back into one string and output it
Misalnya, untuk input Hello
, outputnya adalah emmol
, sejak
- The
H
bergantian untuk\0 | 'e'
yange
- The
e
berubah menjadi'e' | 'l'
, atau101 | 108
, yang109
ataum
- Yang pertama
l
juga berubah menjadi101 | 108
ataum
- Yang kedua
l
berubah menjadi108 | 111
, yaitu111
atauo
- The
o
berubah menjadi108 | \0
, ataul
Memasukkan
- Sebuah kalimat yang hanya terdiri dari karakter ASCII yang dapat dicetak, dalam format apa pun yang sesuai .
- Kalimat tersebut mungkin memiliki titik, spasi, dan tanda baca lainnya, tetapi hanya akan menjadi satu baris.
- Panjang kalimat setidaknya tiga karakter.
Keluaran
- Cipher yang dihasilkan, berdasarkan aturan yang dijelaskan di atas, dikembalikan sebagai string atau output.
Aturan
- Program lengkap atau fungsi dapat diterima.
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
Contohnya
Input pada satu baris, output pada baris berikut. Baris kosong memisahkan contoh.
Hello
emmol
Hello, World!
emmol, ww~ved
PPCG
PSWG
Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl
abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz
!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy
Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66
o
perubahanl
pada contoh pertama, saya cukup yakin spesifikasi Anda memastikan bahwa yang pertamao
tidak berubahl
pada contoh kedua. Itu harus berubah menjadi'l' | ','
, apa pun itu, kan?'l' | ','
, yang108 | 44 --> 1101111 | 0101100
, yang menjadi108
, yangl
. The,
terjadi untuk berbaris denganl
, jadi tidak ada perubahan saat biner-atau berlangsung.Jawaban:
Jelly ,
3331 bytePendekatan langsung yang pasti bisa dibuat lebih pendek.
Cobalah online!
sumber
Perl,
6362 byteTermasuk +4 untuk
-lp
Berikan masukan pada STDIN
oddeven.pl
:Ini berfungsi seperti yang ditunjukkan, tetapi untuk mendapatkan skor yang diklaim ini harus dimasukkan ke dalam file tanpa akhir
;
dan baris baru dan\xhh
lolos harus diganti dengan nilai literalnya. Anda dapat melakukan ini dengan meletakkan kode di atas dalam file dan menjalankan:sumber
Python 2,
138131 byteCobalah secara online (berisi semua kasus uji)
Kurang golf:
Coba online (tidak disunat)
Saya menambahkan
\x00
ke kedua sisi string sehingga saya tidak perlu khawatir tentang itu selama bitwise atau ing. Saya mengulangi karakter asli string, melakukan operasi bitwise dan menambahkannya ke hasilnya, mengikuti aturan paritas.sumber
|=
... setara di PowerShell akan$a=$a-bor$b
a?b:c
seperti JS.C - 101 byte
Kami bahkan tidak perlu memeriksa apakah itu item terakhir dalam string karena string dalam C diakhiri null.
Penjelasan
Agak sederhana:
Gunakan & 1 untuk menguji ekspresi aneh / merata dan ternary untuk menggantikan if / elses. Tambahkan char * p untuk mengurangi jumlah tanda kurung yang diperlukan.
sumber
Mathematica, 152 byte
Penjelasan
Mengubah string menjadi kode ASCII
Partisi kode ASCII dengan panjang 3, offset 1 partisi, dengan 0s empuk.
Menerapkan fungsi untuk setiap partisi.
If...else if... else
di Mathematica .Cek apakah indeks (# 2) ganjil. (
Max
untuk perataan); sejak Mathematica indeks dimulai pada 1, saya gunakan diOddQ
sini, tidakEvenQ
Mengambil kode ASCII dari tetangga kiri dan kanan.
Cek apakah kode ASCII dari karakter yang sesuai aneh.
Mengambil kode karakter ASCII dan tetangga kiri.
Mengambil kode karakter ASCII dan tetangga kanan.
Berlaku atau beroperasi.
Ganti semua angka yang lebih besar dari 126 dengan 32 (spasi).
Mengonversi kode ASCII kembali ke karakter dan bergabung dengan mereka.
sumber
From/ToCharacterCode
fungsi. Maka tampak seperti AndaDrop
dapat notasi penggunaan infiks:#~Drop~{2}
. Dan tampaknya Anda menerapkanBitOr
untuk setiap kemungkinan hasilWhich
jadi mengapa tidak menerapkannya setelah itu dan hanya sekali?Ruby
133128108106 byteJordan membantu saya menghemat 20 byte dan cia_rana membantu saya menghemat 2 byte :)
s
diambil sebagai string input.Contoh output dengan
s="Test 123 with odd characters. R@*SKA0z8d862"
:Penjelasan
Kode di atas sangat tidak terbaca jadi inilah penjelasannya. Kode ini agak retas, saya berhenti baru ke ruby jadi saya yakin ada cara yang lebih pendek untuk melakukan ini :)
sumber
print
bukannyap
: p->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
J, 42 byte
Menggunakan properti yang kata kerja dalam J dapat diterapkan secara bergantian menggunakan gerund
`
untuk kata keterangan tertentu seperti infiks\
.Pemakaian
Penjelasan
sumber
JavaScript (ES6),
125118114 byteMemalukan lama, tapi
charCodeAt
danString.fromCharCode
saja yang 29 byte. : - /Bagaimana itu bekerja
Setiap karakter pada posisi
i
diterjemahkan dengan rumus berikut, yang mencakup semua aturan sekaligus:di mana
C(n)
mengembalikan kode ASCII dari karakter ke-n dari string input.Demo
sumber
PHP,
10797 bytemungkin golf.
sumber
C #, 145 byte
Program lengkap dengan metode ungolfed dan uji kasus:
Ini ternyata lebih lama dari yang saya kira ...
sumber