Pengukur Golf Kode © 2019

20

Pengukur Golf Kode © 2019

Hexdumps digunakan dengan xxdtampilan seperti ini:

00000000: 666f 6f20 6261 7220 7370 616d 2065 6767  foo bar spam egg
00000010: 730a                                     s.

Tugas Anda adalah mengubah hexdump dalam bentuk ini menjadi jumlah byte yang digunakan.

Aturan:

  • Celah yang biasa dilarang.
  • Ini adalah , jadi jawaban terpendek yang valid dalam byte menang.
  • Anda mungkin atau mungkin tidak menyertakan baris baru di akhir teks ( 0a). Ini berarti bahwa jika hexdump berakhir di baris baru ( 0a), input yang mungkin memiliki output dikurangi satu.
  • Input kosong (secara harfiah tidak ada: daftar kosong / string / dll.) Harus menampilkan 0.
  • Masukan dapat diambil dalam bentuk apa pun
  • Input akan valid ASCII tanpa karakter kontrol
  • Input harus mengandung seluruh hexdump

Kasus uji:

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 2120 4865  Hello, world! He
00000010: 6c6c 6f2c 2077 6f72 6c64 210a            llo, world!.

mengembalikan 28 atau 27

00000000: 0a                                       .

mengembalikan 1 atau 0

00000000: 6368 616c 6c65 6e67 650a                 challenge.

mengembalikan 10 atau 9

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 21         Hello, world!

mengembalikan 13


mengembalikan 0 (Ini benar-benar tidak ada: daftar kosong / string / dll.)

Penjelasan akan bagus untuk bahasa yang tidak standar.

gadzooks02
sumber
Bolehkah kita menganggap inputnya ascii? Bisakah itu berisi karakter kontrol? Apa aturan inputnya? Beberapa bahasa tidak dapat menangani input melalui beberapa baris. Bisakah kita menempelkan baris terakhir sehingga semua garis sama-sama panjang? Mengapa memasukkan input kosong?
Stewie Griffin
@StewieGriffin Ya; tidak; Iya; karena jika xxddiberi string kosong, tidak menghasilkan apa-apa.
gadzooks02
1
@StewieGriffin Anda telah mengedit komentar Anda saat saya menjawab, jadi inilah perluasan: Ya; Tidak; itu bisa menjadi input sesuai keinginan Anda, asalkan seluruh dump disertakan; Lihat jawaban terakhir; Iya nih; Karena jika xxd diumpankan string kosong, itu tidak menghasilkan apa
gadzooks02
1
@ Jonathan Allan Oh ya, sudah terlihat.
gadzooks02
1
Menghitung format hexdump yang tidak menyertakan data ASCIIfied di kanan mungkin menarik. Semua orang pergi hanya dengan menghilangkan bagian hex dan byte-menghitung sisanya. Jika tantangannya adalah melakukan ini hanya dengan memberikan hexdump baris terakhir, itu akan memaksa penguraian nomor hex (posisi) serta menghitung jumlah digit hex pada baris itu. (Seperti yang saya lakukan dengan tangan ketika melihat objdumppembongkaran atau nasmdaftar untuk jawaban kode mesin.) Saya kira saya harus mempostingnya di kotak pasir ...
Peter Cordes

Jawaban:

12

Retina 0.8.2 , 8 byte

.{51}

.

Cobalah online! Penjelasan:

.{51}

Hapus 51 karakter pertama dari setiap baris. (Garis hanya dapat memiliki antara 52 dan 67 karakter, jadi ini selalu cocok sekali per baris.)

.

Hitung sisa karakter non-baris baru.

7 byte jika input kosong tidak harus didukung:

.{52}


Cobalah online! Penjelasan:

.{52}

Hapus 52 karakter pertama dari setiap baris. (Garis hanya dapat memiliki antara 52 dan 67 karakter, jadi ini selalu cocok sekali per baris.)


Hitung 1 lebih dari jumlah karakter yang tersisa (termasuk baris baru).

Neil
sumber
7 dengan &`.{52}.
Grimmy
@ Grimy Itu hanya ... luar biasa ... Anda harus memposting itu sebagai jawaban Anda sendiri.
Neil
Awalnya saya tidak menyadarinya tetapi sebenarnya sudah ada jawaban yang hampir sama .
Grimmy
11

tcsh , 12 byte

xxd -r|wc -c

Cobalah online!

Krzysztof Szewczyk
sumber
1
Sangat kuat dan melakukan persis apa yang diinginkan OP.
tsh
7

V (vim) , 7 byte

Î51x
Ø.

Cobalah online!

Penjelasan:

Î       " On every line...
 51x    "   Delete the first 51 characters
Ø.      " Count the number of remaining characters on any line

Hexdump:

00000000: ce35 3178 0dd8 2e                        .51x...
DJMcMayhem
sumber
6

Retina , 7 byte

Ini menghitung jumlah total string single-line panjang 52. Mungkin bisa melakukan sesuatu yang mirip %52,`., tapi saya gagal menemukan cara untuk memperbaikinya.

w`.{52}

Cobalah online!

kata ganti saya adalah monicareinstate
sumber
1
Juga: &`.{52}untuk Retina 0.8.2.
Grimmy
5

APL (Dyalog Extended) , 18 byte

Program lengkap. Meminta daftar string (yaitu daftar karakter).

2÷⍨≢∊(1↓≠⊆⊢)¨49↑¨⎕

Cobalah online!

 cepat

49↑¨ ambil 49 karakter pertama dari masing-masing

(... terapkan fungsi tersembunyi berikut untuk masing-masing:

 argumen

 potong karakter yang ada

 berbeda dengan karakter padding (spasi)

1↓ letakkan "kata" pertama

ϵ daftar (ratakan)

 menghitung

2÷⍨ bagi dengan dua

Adám
sumber
4

Jelly , 5 byte

Ẉ_51S

Tautan monadik yang menerima daftar garis yang menghasilkan jumlah byte integer.

Cobalah online!

Bagaimana?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Jonathan Allan
sumber
Anda dapat menerima daftar baris. Juga, maukah Anda menambahkan penjelasan?
gadzooks02
Ah keren, jadi apakah input kosong daftar kosong ATAU daftar dengan satu baris kosong? (Ini harus diperjelas dalam pos karena ini merupakan kasus tepi.)
Jonathan Allan
Ini dan daftar kosong / string / dll. Saya baru saja menjelaskan ini.
gadzooks02
Terima kasih, penjelasan juga ditambahkan sekarang.
Jonathan Allan
3

C (gcc) , 64 55 byte

r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}

Cobalah online!

9 byte dicukur berkat YSC!

Berikut ini adalah versi yang lebih rapuh yang terinspirasi oleh solusi JavaScript Arnauld yang mungkin gagal untuk input lama:

C (gcc) , 50 byte

s[];f(l){l=read(0,s,1<<31);l=l?l/68*16+l%68-51:0;}

Cobalah online!

G. Sliepen
sumber
1
59 byte dengan mengubah return rkel=r
girobuz
2
Perilaku tidak terdefinisi @JonathanFrech sangat baik untuk kode golf!
G. Sliepen
1
@YSC Hm, tapi saya pikir membuat r global melanggar aturan bahwa jika Anda mendefinisikan suatu fungsi untuk melakukan sesuatu (dan itu tidak main), seharusnya dimungkinkan untuk menyebutnya berkali-kali.
G. Sliepen
2
@girobuz while()memiliki jumlah byte yang sama dengan for(;;). Jadi ;while()satu byte lebih panjang dari for(;;).
Jonathan Frech
3

Python 3, 48 46 byte

lambda s:(len(s)or 51)+1-52*len(s.split('\n'))

Input diteruskan sebagai string ke fungsi. Fungsi ini menambah panjang input (termasuk baris baru), kemudian kurangi 52 untuk setiap baris.

Cobalah online

IFcoltransG
sumber
2
Dari apa yang saya lihat, f=dapat dipindahkan ke header sebagai `f =`, hanya menyisakan lambda sebagai kode dan menyimpan dua byte: Cobalah online!
gadzooks02
@ gadzooks02 Terima kasih, akan mengedit. Ini f=adalah kebiasaan yang saya ambil dari server perselisihan Python.
IFcoltransG
2

Japt -x , 5 byte

Input sebagai array garis.

®Ê-51

Cobalah

®Ê-51     :Implicit input of array
®         :Map
 Ê        :  Length
  -51     :  Subtract 51
          :Implicit output of sum of resulting array
Shaggy
sumber
2

Perl 6 , 18 byte

{.join.comb-51*$_}

Cobalah online!

Anonim Apa pun lambda yang mengambil daftar garis dan mengembalikan jumlah jumlah karakter, mengurangi 51 untuk setiap baris

Jo King
sumber
2

05AB1E , 8 6 byte

€g51-O

Cobalah online!

Masukan sebagai daftar string.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
Dorian
sumber
1
Maaf, input harus berisi seluruh hexdump. (Anda melewatkan surat pada akhir setiap baris)
gadzooks02
Oh, salahku. Saya membuat ini di smartphone saya. Tidak melihat ada sesuatu di balik kode hex. Saya melakukan koreksi.
Dorian
2

Bahasa Formula IBM / Lotus Notes, 53 byte

@Sum(@Length(@Explode(@Right(@Left(i;"  ");": ")))/2)

Tidak ada TIO untuk Formula jadi di sini adalah screenshot dari kasus uji:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Rumusnya adalah dalam bidang yang dihitung yang memberikan nilai setelah "Pengembalian".

Penjelasan

Ini adalah demonstrasi yang baik tentang cara Formula akan secara rekursif menerapkan fungsi ke daftar tanpa perlu loop. Rumusnya dalam bidang yang dihitung pada formulir yang sama dengan bidang input yang dapat diedit `i '.

  1. Mulai di tengah. @Leftdan @Rightmemungkinkan pembatas string atau sejumlah karakter untuk digunakan. Karena itu kami mencari di sebelah kanan: dan kemudian ke kiri tempat pertama dari dua spasi. Karena Formula melihat baris baru sebagai pemisah daftar, ia akan menerapkan ini pada setiap baris dalam input.
  2. @Explodesetara dengan splitfungsi dan standar untuk ruang, ,atau; . Sekali lagi ini diterapkan untuk setiap baris di lapangan tetapi kali ini hasilnya digabungkan menjadi satu daftar.
  3. @Lengthkemudian akan diterapkan ke setiap anggota daftar. Dalam setiap kasus, kami membagi nilai kembaliannya dengan 2.
  4. @Sum seluruh daftar dan tampilkan hasilnya.
ElPedro
sumber
1
Apakah Anda memiliki tautan ke juru bahasa (baik online atau diunduh)?
gadzooks02
Sayangnya tidak. Formula adalah bahasa berpemilik yang terkait dengan produk IBM (saya memang bertanya pada Meta beberapa waktu lalu apakah ini diizinkan di situs ini dan jawabannya adalah "ya" tetapi tidak untuk tantangan Polisi & Perampok). Terakhir kali saya melihat, Domino Designer (yang mendukung Formula) masih tersedia sebagai unduhan gratis dari IBM. Sayangnya hanya Windows dan ketika saya menjalankan Linux di rumah saya tidak dapat mengkonfirmasi. Jawaban ini ditulis selama istirahat makan siang saya karena saya cukup disayangkan masih mendukung beberapa aplikasi Notes lama dan masih memiliki Catatan di mesin saya di tempat kerja :-)
ElPedro
1
BTW, jika Anda mencari Lotus Notes di situs ini Anda akan menemukan bahwa saya adalah satu-satunya orang yang cukup bodoh untuk mencoba bermain golf dalam bahasa ini :-)
ElPedro
1

JavaScript (ES6), 34 byte

s=>(n=s.length)&&(n/68<<4)+n%68-51

Cobalah online!

Berkomentar

s =>                // s = input string
  (n = s.length) && // n = length of s; return 0 right away if n = 0 (special case)
  (n / 68 << 4) +   // otherwise compute the number of full lines and multiply it by 16
  n % 68 - 51       // add the length of the last line minus 51
Arnauld
sumber
1

Merah , 81 55 byte

func[s][n: 0 foreach l s[n: n - 51 + length? l]max 0 n]

Cobalah online!

Mengambil input sebagai daftar string.

Galen Ivanov
sumber
0

Zsh , 36 byte

Dengan flag default zsh:

for l (${(f)1})((c+=$#l-52))
<<<$[c]

Cobalah online!

${(f)1}membelah $1baris baru, dan membuang baris kosong. The $[ arithmetic expansion ]penjaga terhadap kasus kosong, ketika loop tidak pernah terbenam$c .

Zsh , 28 byte

Dengan -o extendedglob:

<<<${#${(F)${(f)1}#?(#c52)}}

Cobalah online!

(f)Berpisah di baris baru, ${ #?(#c52)}menghapus 52 karakter terkemuka, (F)bergabung di baris baru sehingga penghitungan karakter, bukan daftar karakter, ${# }hitung karakter.

Fungsi Gamma
sumber
0

asm2bf , 135 byte

Versi golf:

lbl 3
mov r2,51
lbl 1
in_ r1
dec r2
jz_ r1,4
jnz r2,1
lbl 2
in_ r1
jz_ r1,4
sub r1,10
jz_ r1,3
inc r3
jmp 2
lbl 4
out r3

Versi yang dikomentari:

lbl 3               ; Main loop - the kinda entry point

    mov r2, 51      ; Loop 51 times.
    lbl 1           ; Loop start.
        in_ r1      ; Read character
        dec r2      ; Decrement the loop accumulator.
        jz_ r1, 4   ; If zero was read, end.
        jnz r2, 1   ; If we still loop, loop again.

    lbl 2           ; Second loop, accumulating the result.
        in_ r1      ; Read a character.
        jz_ r1, 4   ; If character is zero, end the loop and print result.
        sub r1, 10  ; Decrement r1 by 10 for next check.
        jz_ r1, 3   ; If the character - 10 (the newline) is zero, jump to 3
        inc r3      ; Increment character read amount.
        jmp 2
lbl 4
    out r3          ; Print out the result as an ASCII character.
Krzysztof Szewczyk
sumber