Hitung karakter - sedikit demi sedikit!

19

Bagian yang sederhana: Diberikan string input yang hanya berisi karakter ASCII yang dapat dicetak (spasi - tilde), hitung jumlah kemunculan setiap karakter dan kembalikan hasilnya pada format yang sesuai. Hasil untuk string a%hda7aharus sesuatu seperti: a:3, %:1, h:1, 7:1, d:1. Penyortiran tidak perlu, pembatas dan format adalah opsional tetapi harus mudah dipahami angka mana yang sesuai dengan karakter mana. Anda tidak boleh memasukkan karakter yang tidak ada dalam string input ( a:3, b:0, c:0, d:1, ...tidak OK).

Tantangan nyata:

Ubah setiap karakter dalam kode Anda menjadi angka biner 8-bit (atau 16-bit jika Anda menggunakan UTF-16 atau yang serupa), dan sebutkan setiap karakter mulai dari 0.

Untuk setiap karakter ( iadalah pencacah), yang i%7-bit 1 harus menjadi 1. Bit diberi nomor dari kanan. Semua bit lain bisa menjadi apa pun yang Anda inginkan.

Mari kita gunakan kode berikut sebagai contoh:

[f]-xif)#f

Mengubah ini ke biner kita mendapatkan array di bawah ini. Angka pertama (mewakili [memiliki 1di posisi ke-0, sehingga yang satu itu OK. Angka kedua (mewakili fmemiliki 1di posisi ke-1, sehingga yang itu juga OK. Lanjutkan seperti ini, dan Anda akan melihat bahwa kode di atas valid.

C 76543210 Nomor bit
- -------- ----------
[0101101 1   0 - OK
f 011001 1 0 1 - OK
] 01011 1 01 2 - OK
- 0010 1 101 3 - OK
x 011 1 1000 4 - OK
i 01 1 01001 5 - OK
f 0 1 100110 6 - OK
) 0010100 1   0 - OK
# 001000 1 1 1 - Oke
f 01100 1 10 2 - OK

Jika kita mengubah kode menjadi: ]f[-xif)#fkita akan mendapatkan awal urutan berikut:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

Seperti yang kita lihat, karakter ketiga [tidak ada 1di posisi ke-2 (diindeks nol), dan oleh karena itu kode ini tidak valid.

Kasus uji:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

Format output yang masuk akal adalah OK (apa pun yang paling nyaman bagi Anda). Misalnya Anda dapat memiliki: :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...atau [ ,7][!,1][",2][#,3][&,1].... Outputnya dengan cara standar apa saja (kembali dari fungsi, dicetak ke STDOUT dll.)

1i modulus 7.


Ini adalah , jadi kode terpendek dalam byte akan memenangkan ref .

Stewie Griffin
sumber
6
Untuk sedikit bantuan, berikut adalah karakter yang diizinkan untuk Anda gunakan di tempat n%7th> pastie.org/pastes/10985263/text
TidB
@ IDB situs web sedang offline ??
Rod
1
@Rod Ya, pastie tampaknya memiliki beberapa masalah. Cobalah pastebin sebagai gantinya
TidB
1
Ingatlah bahwa baris baru itu 00001010. Ini bisa bermanfaat juga! :)
Stewie Griffin
1
Untuk bantuan lebih lanjut, inilah skrip validasi yang dapat Anda gunakan untuk pengkodean UTF-8. Cukup enkapsulasi input dalam string seperti contoh.
AdmBorkBork

Jawaban:

6

Pyke, 1 6 byte

1cn;1c

Coba di sini!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

Setengah dari kode ini hanyalah tanpa ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c
Biru
sumber
@EriktheOutgolfer memiliki poin yang valid. Saya tidak berpikir format input ini valid, kecuali ini sebenarnya string biasa di Pyke. Ini akan menjadi string input yang valid di MATLAB / Oktaf 'abc'==['a','b','c'], jadi mungkin juga di Pyke ...?
Stewie Griffin
@StewieGriffin Ini bukan cara Pyke biasanya menangani string. Jika itu tidak apa-apa, saya dapat melihat tentang beralih format input tetapi karena daftar karakter berada di bawah daftar default yang diterima meskipun ini mungkin dianggap sebagai kecurangan di bawah itu
Biru
5
Maaf untuk memecahkan tantangan Anda dengan built-in 1-byte. Saya tidak berpikir Anda benar-benar menyesal, dan tantangannya tidak rusak oleh ini :-)
Luis Mendo
2
Ini bukan daftar karakter; itu adalah daftar string. Sementara daftar karakter berada di + 17 / -0 , daftar string berada di + 2 / -2 , jadi itu hampir tidak merupakan standar yang diterima. @StewieGriffin harus memutuskan apakah itu valid atau tidak.
Dennis
1
@StewieGriffin lebih baik?
Biru
6

Pyth, 12 8 7 byte

-1 byte terima kasih kepada @Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

representasi biner

0110110 1 m
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

Coba di sini

tongkat
sumber
Bagus! :) Output 13untuk 111terlihat aneh, tetapi tidak bisa disalahpahami (tidak ada karakter tunggal 13yang digunakan 1 kali), jadi ini benar-benar valid!
Stewie Griffin
4

Befunge-93, 150 byte

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

Cobalah online!

Saya mulai dengan menulis ini sebagai program Befunge biasa, yang saya main golf sebanyak mungkin. Saya kemudian menambahkan padding untuk memastikan berbagai karakter dalam program hanya muncul di posisi yang diizinkan. Padding ini bergantung pada fakta bahwa perintah yang tidak didukung diabaikan di Befunge-93, jadi saya hanya perlu urutan karakter yang tidak digunakan yang bit-bitnya sejajar dengan posisi yang diperlukan (urutan yang saya gunakan adalah ={}{}{}).

Bit yang rumit adalah bahwa berbagai cabang di antara garis perlu berbaris dengan benar (misalnya vpanah dalam satu baris, harus sejajar dengan <panah di bawahnya). Ini semakin rumit oleh fakta bahwa perintah jembatan ( #) tidak dapat dipisahkan dari panah percabangan yang berdekatan. Awalnya saya mencoba membuat padding secara sistematis, tetapi pada akhirnya itu sebagian besar merupakan proses manual.

Karena ukuran program saya tidak akan mencantumkan analisis karakter lengkap, tetapi ini adalah contoh dari awal dan akhir:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

Istirahat baris diperlakukan sebagai karakter baris baru, sehingga akan berada di posisi 1 atau 3.

James Holderness
sumber
3

MATL , 17 byte

u"G91x@=zD91x@uRD

Menampilkan hitungan, lalu karakter terkait, semua baris-baru dipisahkan. Kesulitan terbesar adalah @yang 0b01000000; Saya harap saya dapat menemukan cara untuk hidup tanpa itu.

Cobalah online!

Penjelasan:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 byte (keluaran yang dipertanyakan)

Jika hanya membiarkan dua vektor baris di tumpukan diizinkan (perilaku seperti fungsi sesuai dengan postingan Meta ini ), kita bisa turun ke

u"G91x@=zv]v!Gu

Tapi di sini, outputnya tidak tertata dengan rapi.

Sanchises
sumber
Tumpukan dicetak secara implisit di akhir program dan format output fleksibel sesuai tantangan, jadi saya tidak melihat ada masalah dengan pendekatan kedua
Luis Mendo
@LuisMendo saya tidak yakin. Jika Anda memiliki 90 karakter input yang berbeda maka akan sulit untuk menentukan kunci mana yang dimiliki karakter yang mana, jadi saya pikir saya harus mengatakan tidak pada Sanchise yang satu itu. - Stewie Griffin 2 jam yang lalu adalah jawaban untuk hibrida yang diusulkan (dihitung secara individual D, Gupada akhir program), dan saya tidak yakin apakah versi 15-byte cukup berbeda.
Sanchises
@StewieGriffin Bisakah Anda melihat apakah versi 15-byte ( Coba online! ) OK atau tidak?
Sanchises
Tidak yakin itu Stewie akan mendapatkan ping pada posting ini, lebih baik gunakan posting tantangan
Luis Mendo
Tidak tahu tentang Anda, tapi saya pikir itu tidak mudah dipahami di sini :) Saya lebih suka solusi 17 byte, tetapi jangan ragu untuk tetap menggunakan 15 byte sebagai jawabannya! Ngomong-ngomong, jawaban yang bagus :)
Stewie Griffin
1

CJam, 14 byte

q__|_ @sfe=]zp

Coba di sini.

Spasi sebelum @dan ssesudahnya adalah karakter pengisi yang dimasukkan untuk membuat kode ASCII sesuai dengan pola yang diperlukan: spasi tidak melakukan apa-apa, dan yang sbenar mengubah string menjadi string. Selain itu, ini adalah implementasi tugas tantangan yang cukup sederhana dan mudah:

q_ "baca input dan buat salinannya";
  _ | "runtuh karakter yang berulang dalam salinan";
    _ "simpan salinan string yang diciutkan";
      @ "tarik string input asli ke atas tumpukan";
       s "(tidak melakukan apa pun di sini)";
        fe = "untuk setiap karakter dalam string yang diciutkan, hitung ...";
                 "... berapa kali itu terjadi dalam string asli";
           ] z "pasangkan hitungan dengan salinan simpanan dari string yang diciutkan";
             p "cetak representasi string hasil";

Untuk input foobar123, kode ini di-output [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]. Jika hanya mencetak hitungan pada satu baris dan karakter yang sesuai pada yang lain, seperti pada:

[1 2 1 1 1 2 2 1]
fobar123

dianggap sebagai format output yang dapat diterima, maka ]zdapat dihilangkan untuk menyimpan dua byte, dengan total 12 byte . Ya, kode yang diperpendek masih akan melewati persyaratan pola bit.

Ps. Saya juga menulis pemeriksa kode sumber sederhana untuk tantangan ini. Diberikan satu baris kode sebagai input, pertama-tama akan menggemakan baris itu dan kemudian mencetak baris yang sama dengan setiap karakter diganti dengan bit ASCII ( n % 7) -nya. Jika baris kedua adalah semua, input valid.

Ilmari Karonen
sumber
1

Jelly , 6 byte dalam codepage Jelly

ṢZṢṀŒr

Cobalah online!

Ini adalah fungsi yang mengembalikan daftar (karakter, jumlah) pasangan. (Jelly mewakili daftar seperti teks, misalnya jika dikirim ke output standar, dengan menggabungkan elemen-elemen, itulah sebabnya Anda harus memperlakukan ini sebagai fungsi daripada program yang lengkap. ( Berikut program yang sama dengan beberapa kode yang ditambahkan ke panggil fungsi dan kemudian cetak struktur internal ke output standar, membuktikan bahwa output dalam format yang jelas.)

Representasi dan penjelasan biner:

  76543210 

Ṣ 1011011 1    Urutkan karakter input
Z 010110 1 0 Atur ulang daftar (ini 1D, jadi ini secara efektif membungkusnya dalam daftar)
Ṣ 10110 1 11 Urutkan daftar (no-op, karena hanya memiliki satu elemen)
Ṁ 1100 1 000 Ambil elemen terbesar (yaitu saja)
Œ 000 1 0011 Byte pertama dari perintah dua-byte
r 01 1 10010 Enkode panjang-berjalan

Dapat dilihat bahwa karakter kedua, ketiga, dan keempat membatalkan satu sama lain dan hanya ada untuk mempertahankan pola bit yang kita butuhkan. Œrterlalu nyaman, meskipun, dan padding program sehingga kita dapat menggunakannya mungkin memberi kita program yang lebih pendek daripada mencoba memecahkan masalah tanpa builtin mau.


sumber