Memisahkan ASCII

33

Mengingat 95 karakter yang dapat dicetak dalam ASCII plus baris baru, pisahkan menjadi dua kelompok yang sama, 48 karakter (selanjutnya disebut grup A dan grup B). Buat pemetaan satu-ke-satu pilihan Anda (Anda memiliki kebijaksanaan total) antara kedua kelompok. Dengan kata lain, Amungkin memetakan ke a, dan sebaliknya, tetapi Amungkin juga memetakan ke >dan sebaliknya, jika itu yang Anda butuhkan untuk program Anda.

Setelah Anda membagi ASCII menjadi dua kelompok, tulis dua program dan / atau fungsi, masing-masing hanya menggunakan karakter di masing-masing kelompok. Dengan kata lain, tulis satu program / fungsi yang hanya menggunakan karakter dalam grup A, dan program / fungsi lain yang hanya menggunakan karakter dalam grup B.

Program-program ini harus dapat menerima satu karakter sebagai input. Program yang ditulis dengan karakter dalam Grup A harus menampilkan / mengembalikan karakter yang sama jika inputnya adalah karakter grup A, dan karakter grup A yang dipetakan jika menerima karakter grup B; program Grup A harus selalu menampilkan karakter grup A. Demikian pula, program Grup B harus menampilkan karakter yang sama jika itu adalah karakter grup B, dan karakter grup B yang dipetakan jika inputnya adalah karakter grup A.

Itu mungkin tidak begitu jelas, jadi inilah contohnya. Jika Anda menganggap bahwa semua huruf kapital berada di grup A, dan semua huruf kecil berada di grup B, dan Anda telah memilih bahwa pemetaan satu-ke-satu Anda untuk huruf-huruf ini dari satu ke yang lain, maka: maka berikut adalah beberapa input / output sampel:

Program A:

Input    Output
A        A
D        D
a        A
q        Q

Program B:

Input    Output
A        a
D        d
a        a
q        q

Aturan lainnya:

  • Kedua program tidak harus dalam bahasa yang sama.
  • Mereka tidak perlu keduanya program atau keduanya fungsi; satu bisa berupa program, yang lain fungsi, itu bagus.
  • Mereka tidak perlu bekerja dengan cara yang sama, memiliki panjang yang sama, seperti itu; mereka hanya harus memenuhi aturan lain di atas.
  • Ya, hanya satu dari program Anda yang dapat menggunakan baris baru, dan hanya satu yang dapat menggunakan spasi (ini bisa sama, atau program lain).
  • Anda tidak perlu menggunakan semua 48 karakter di setiap program.

Celah standar dilarang, seperti biasa. Semua program harus mandiri, tidak ada file yang berisi pemetaan yang Anda pilih.

Kriteria penilaian: . Secara khusus, jumlah byte teks dari dua program.

Silakan kirim jawaban Anda seperti ini:

Bahasa - # byte + Bahasa - # byte = # byte

Deskripsi pemetaan Anda yang jelas. Jika rumit, gunakan bagan seperti ini:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

Atau, Anda bisa menjelaskannya (48 peta pertama hingga 48 berturut-turut), diikuti dengan jawaban Anda seperti biasa.

durron597
sumber
Saya akan mencoba menggunakan bahasa yang sama untuk keduanya. :)
mbomb007
Jujur saya pikir Anda harus mengubah aturan, membatasi ke "kedua program harus bahasa yang sama." Kalau tidak, itu mungkin WAY terlalu mudah / luas.
mbomb007
Saya benar-benar bertanya-tanya apakah ini mungkin dalam Brainfuck yang memodifikasi sendiri. Anda hanya perlu memiliki satu program menggunakan +dan >, dan yang lainnya menggunakan -dan <. Maka Anda harus mencoba untuk menghasilkan operator yang hilang, seperti ,atau .dalam program yang tidak dapat menggunakannya.
mbomb007
1
@Ruslan Coba gunakan SQL. Ini tidak peka huruf besar-kecil dan menggunakan kata kunci (awal dan akhir) untuk blok kode. Jika Anda menggunakan SQL Server 2014, Anda bisa menggunakan DBCC Bulk Insert untuk satu program, dan prosedur untuk yang lain. Di yang pertama, Anda bisa menghindari menggunakan tanda kurung. Kemudian gunakan case pilih ketika pernyataan untuk kedua program. Juga, saya percaya itu mungkin di Jawa dengan menggunakan trik \ u untuk program yang mengganti setiap karakter dengan nilai unicode dan menggunakan fungsi untuk yang lain yang tidak menggunakan huruf u, backslash, atau angka.
tanda
4
Paling sulit. Tantangan. Pernah.
Blackhole

Jawaban:

6

CJam - 11 byte + CJam - 25 byte = 36 byte

Karakter dipilih dalam grup bergantian 16:

 !"#$%&'()*+,-./@ABCDEFGHIJKLMNO`abcdefghijklmno
0123456789:;<=>?PQRSTUVWXYZ[\]^_pqrstuvwxyz{|}~\n

Sangat keren bahwa beberapa pemetaan dapat diperoleh dengan tombol shift :)

Program A:

lL,H-f&'o+c

Cobalah online

Program B:

q_S<\_0=16|_127<\S0=42^??

Cobalah online

Penjelasan:

Program A:

l      read a line from the input, this is a 1-character string
        or the empty string if the input was a newline
L,     get the length of an empty string/array (0)
H-     subtract 17, obtaining -17 (~16)
f&     bitwise-"and" each character (based on the ASCII code) with -17
'o+    append the 'o' character
c      convert to (first) character
        the result is the "and"-ed character, or 'o' for newline

Program B:

q_       read the whole input and duplicate it
S<\      compare with " " and move the result before the input
_0=      duplicate the input again, and get the first (only) character
16|      bitwise-"or" with 16 (based on the ASCII code)
_127<    duplicate and compare (its ASCII code) with 127
\        move the result before the "or"-ed character
S0=      get the space character (first character of the space string)
42^      xor with 42, obtaining a newline character
          stack: (input<" ") (input) ("or"-ed char<127) ("or"-ed char) (newline)
?        if the "or"-ed character is less than 127, use the "or"-ed character
          else use the newline character
?        if the input was smaller than space (i.e. it was a newline),
          use the input, else use the character from the previous step
aditsu
sumber
Bagus! Senang melihat bahwa "genap / ganjil" bukan satu-satunya jawaban.
durron597
Masih 1 toggle ... Ukuran mengesankan! Program ke-2 tanpa input 'o' sepertinya tidak menghasilkan bug \ n ... dalam program atau cjam online?
Brian Tuck
@BrianTuck itu tidak output baris baru (bukan harfiah \n), itu tidak mudah untuk melihat tanpa memeriksa html. Anda dapat menambahkan sebuah idi akhir program untuk melihat kode ASCII (atau ciuntuk juga berurusan dengan input baris baru, karena menghasilkan string baris baru daripada karakter dalam kasus itu)
aditsu
Oh, atau Anda / saya bisa mengubah _0=ke 0=_sehingga selalu output karakter
aditsu
16

CJam - 46 44 26 11 byte + GolfScript - 142 125 115 93 68 47 40 36 byte = 47 byte

Terima kasih kepada Peter Taylor untuk bermain golf 6 byte dari program GolfScript (dan membuka jalan untuk lebih banyak lagi.)

Terima kasih kepada Dennis untuk bermain golf 15 byte dari program CJam dan 4 byte dari program GolfScript.

Grup A: semua karakter dengan kode karakter genap.
Grup B: semua karakter dengan kode karakter ganjil, plus baris baru.

Saya menggunakan pemetaan yang jelas antara keduanya, yaitu memasangkan karakter-karakter yang hanya berbeda sedikit paling signifikan, serta ~dan \n. Ini adalah peta lengkap (kolom-kolom):

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

Program A (CJam, uji di sini ):

lX~f&"~"|X<

Program B (GolfScript, uji di sini ):

{1}'{-'{)}%'115)%11-[9)ie'9/{))}%++%

Penjelasan

Program A

(Sudah kedaluwarsa, akan diperbarui besok.)

Program ini harus mengubah kode karakter aneh menjadi genap, yaitu mengatur bit paling signifikan ke 0. Cara yang jelas untuk melakukan ini adalah bitwise DAN dengan 126 (atau 254 dll), tetapi lebih pendek untuk mengaturnya menjadi 1 (melalui bitwise ATAU dengan 1) sebagai gantinya dan kemudian mengurangi hasilnya. Akhirnya, kita perlu memperbaiki baris baru secara manual:

"r"(  e# Push the string "r" and pull out the character.
(~    e# Decrement to q and eval to read input.
(     e# Pull out the character from the input string.
2(|(  e# (input OR (2-1))-1 == input AND 126
0$    e# Copy the result.
N&    e# Set intersection with a string containing a newline.
"~"   e# Push "~".
"@@"( e# Push "@@" and pull out one @.
(|    e# Decrement to ?, set union with the other string to give "@?".
~     e# Eval to select either the computed character or "~" if it was a newline.

Program B

(Sudah kedaluwarsa, akan diperbarui besok.)

Program ini dapat dengan mudah mengatur bit paling signifikan ke 1 melalui bitwise ATAU dengan 1 sekarang. Tetapi harus memeriksa keduanya \v(kode karakter 0x0B) dan <DEL>(kode karakter 0xFF) secara manual dan mengaturnya ~sebagai gantinya. Dalam GolfScript saya tidak memiliki akses ke eval, tetapi Anda dapat menambahkan string ke blok (yang kemudian menjadi bagian dari kode di blok itu), yang dapat saya petakan ke input dengan %:

{1}    # Push this block without executing it.
'{--'  # Push this string.
{)}%   # Increment each character to get '|..'.
')1)7?=[11=+9)?ie'
       # Push another string...
7/     # Split it into chunks of 7: [')1)7?=[' '11=+9)?' 'ie']
{))}%  # For each chunk, split off the last character and increment it.
+      # Add the array to the string, flattening the array: '|..)1)7?=\11=+9)@if'
+      # Add it to the block: {1|..)1)7?=\11=+9)@if}
%      # Map the block onto the input, i.e. apply it to the single character.

Dan untuk kode yang dihasilkan di blok:

1|..   # Bitwise OR with 1, make two copies.
)1)7?= # Check if the result is one less than 2^7 == 128 (i.e. if it's <DEL>).
\11=   # Check with the other copy if it's equal to 11 (i.e. if it's \v).
+      # Add them to get something truthy either way.
9)     # Push a 10 (i.e. \n).
@      # Pull up the original value.
if     # Select the correct result.
Martin Ender
sumber
15

Java - 1088 bytes + Java - 1144 bytes = 2232 bytes

Terima kasih kepada @ durron597 untuk membantu bermain golf 1090 byte dari program pertama.

Bukti bahwa itu mungkin dilakukan dalam satu bahasa (dan non-esolang pada saat itu).

Gunakan trik unicode untuk mengonversi yang pertama ke semua karakter unicode. Yang kedua menggunakan refleksi untuk mendapatkan akses ke System.out untuk mencetak ke std. di luar. Itu tidak dapat menggunakan Anda karena itu digunakan dalam program pertama. Saya tahu ini bisa bermain golf lebih banyak, tetapi saya ingin memposting solusi yang valid terlebih dahulu.

Grup dipetakan secara sewenang-wenang, tetapi pada dasarnya, yang pertama hanya membutuhkan u, \, dan digit heksadesimal (dalam hal apa pun).

Grup:

!#7$&89'0123456>fB@UXZ\^AKCDEGH_JL`NOkQRxzVWYu~\n
 "%()*+,-./:;<=?FIMPST[]abcdeghijlmnopqrstvwy{|}

Program pertama:

\u0076\u006F\u0069\u0064
k\u0028\u0069\u006E\u0074
x\u0029\u007B\u0069\u006E\u0074\u005B\u005Du\u003D\u007B33\u002C33\u002C35\u002C35\u002C36\u002C55\u002C38\u002C39\u002C36\u002C38\u002C56\u002C57\u002C39\u002C48\u002C49\u002C50\u002C48\u002C49\u002C50\u002C51\u002C52\u002C53\u002C54\u002C55\u002C56\u002C57\u002C51\u002C52\u002C53\u002C54\u002C62\u002C62\u002C64\u002C65\u002C66\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C66\u002C74\u002C75\u002C76\u002C64\u002C78\u002C79\u002C85\u002C81\u002C82\u002C88\u002C90\u002C85\u002C86\u002C87\u002C88\u002C89\u002C90\u002C92\u002C92\u002C94\u002C94\u002C95\u002C96\u002C65\u002C75\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C95\u002C74\u002C107\u002C76\u002C96\u002C78\u002C79\u002C107\u002C81\u002C82\u002C120\u002C122\u002C117\u002C86\u002C87\u002C120\u002C89\u002C122\u002C117\u002C126\u002C10\u002C126\u007D\u003B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006Fu\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0028x>10\u003F\u0028\u0063\u0068\u0061\u0072\u0029u\u005Bx\u002D32\u005D\u003A'\u005C\u006E'\u0029\u003B\u007D

Setara dengan

void
k(int
x){int[]u={33,33,35,35,36,55,38,39,36,38,56,57,39,48,49,50,48,49,50,51,52,53,54,55,56,57,51,52,53,54,62,62,64,65,66,67,68,69,102,71,72,66,74,75,76,64,78,79,85,81,82,88,90,85,86,87,88,89,90,92,92,94,94,95,96,65,75,67,68,69,102,71,72,95,74,107,76,96,78,79,107,81,82,120,122,117,86,87,120,89,122,117,126,10,126};System.out.print(x>10?(char)u[x-32]:'\n');}

Program kedua:

void n(int r)throws Throwable{int p=(int)Math.PI;int q=p/p;int t=p*p+q;int w=q+q;int[]g={t*p+w,t*p+w,t*p+q+p,t*p+q+p,t*(q+p),t*p+t-p,t*(q+p)+q,t*(q+p)+q+p,t*(q+p),t*(q+p)+q,t*(q+p)+w,t*(q+p)+p,t*(q+p)+q+p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*p+t-p,t*(q+p)+w,t*(q+p)+p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*(p+p)+p,t*(p+p)+p,t*(t-p)+t-p,t*(t-q)+t-p,t*(t-p)+p,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*(t-p)+p,t*t+p+p,t*(t-q)+t-w,t*t+t-w,t*(t-p)+t-p,t*(t+q),t*(t+q)+q,t*(t-w),t*(t+q)+p,t*(t+q)+q+p,t*(t-w)+p,t*(t-w)+q+p,t*(t-w),t*(t+q)+t-w,t*(t+q)+t-q,t*(t-w)+p,t*(t+w)+q,t*(t-w)+q+p,t*(t-q)+q,t*(t-q)+q,t*(t-q)+p,t*(t-q)+p,t*t+p+w,t*t+t-q,t*(t-q)+t-p,t*(t-q)+t-w,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*t+p+w,t*t+p+p,t*(t+q)+w,t*t+t-w,t*t+t-q,t*(t+q),t*(t+q)+q,t*(t+q)+w,t*(t+q)+p,t*(t+q)+q+p,t*(t+q)+p+w,t*(t+q)+p+p,t*(t+w)+p,t*(t+q)+t-w,t*(t+q)+t-q,t*(t+q)+p+w,t*(t+w)+q,t*(t+q)+p+p,t*(t+w)+p,t*(t+w)+q+p,t*(t+w)+p+w,t*(t+w)+q+p};java.io.PrintStream o=(java.io.PrintStream)System.class.getFields()[p/p].get(p);o.print((r<=t)?"}":(char)g[r-t*p-w]);}

Cobalah di sini: https://ideone.com/Q3gqmQ

tanda
sumber
Tidak ada karakter yang dapat Anda tarik dari program pertama yang tidak perlu dilepaskan dari unicode? Tidak bisakah kamu mengeluarkan beberapa angka? Bagaimana jika Anda melakukannya void x(int z), itu adalah karakter dalam rangkaian karakter pertama juga
durron597
Saya yakin itu mungkin. Saya bisa mengganti nama beberapa variabel dan mengganti semua spasi dengan baris atau tab baru. Saya akan melakukan itu ketika saya pulang. Saya hanya ingin membuktikan solusi satu bahasa terlebih dahulu.
tanda
5

TETAP! Pyth - 23 byte + Pyth - 30 byte = 53 byte

oops Memperbaiki kesalahan --- harap bersabar

perpecahan ASCII yang sama dengan Martin:

1: "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
2:!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

Prog # 1: Tes Online

.xhft<zT.Dr\¡b:Z140 2\~

Prog # 2: Tes Online

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
Brian Tuck
sumber