Smooth vs Chunky vs Squiggles Rusak

12

Berdasarkan Chunky vs. Smooth Strings .

Coretan /\_/\/\__/\/\/\/\_/\_/\menyenangkan untuk dibuat di keyboard saat Anda benar-benar bosan. Tapi tidak semua coretan diciptakan sama. Beberapa coretan halus, seperti \___/, dan beberapa chunky, seperti /\/\/\/\. Yang lain benar-benar rusak, seperti////_\\\

Di dalam setiap coretan Nkarakter, ada N-1persimpangan coretan. Setiap persimpangan berlekuk diklasifikasikan menjadi salah satu dari tiga jenis:

  • Halus (sudut> "90 derajat"):

    \_ __ _/

  • Chunky (sudut = "90 derajat")

    /\ \/

  • Rusak (apa pun yang tidak terhubung)

    // \\ /_ _\

Mari kita mendefinisikan kelancaran menjadi proporsi persimpangan yang mulus, dengan chunkiness dan kehancuran didefinisikan dengan cara yang sama. Setiap nilai berkisar antara 0dan 1. Jumlah kehalusan, kekasaran, dan kehancuran dari coretan selalu sama dengan 1.

Misalnya, coretan /\/\\_//\_memiliki 3 persimpangan halus, 4 persimpangan tebal, dan 2 persimpangan rusak. Dengan demikian 0.3333halus, 0.4444tebal, dan 0.2222pecah.

String kosong dan string dengan hanya satu karakter memiliki nilai yang tidak ditentukan, semua input akan memiliki minimal 2 karakter.

Tantangan

Tulislah sebuah program yang melibatkan pertengkaran yang panjangnya sewenang-wenang dan hasilkan dua nilai kelancaran, kekenyalan, dan kehancurannya.

  • Anda dapat menulis program atau fungsi, dengan input melalui STDIN, baris perintah, atau sebagai argumen string.
  • Anda dapat mengasumsikan input paling tidak panjang> = 2 dan hanya terdiri dari karakter /\_dengan baris tambahan opsional.
  • Cetak (atau kembali jika suatu fungsi) keduanya mengapung dengan ketepatan minimal 4 desimal, bulat atau terpotong. Jika nilai sebenarnya adalah 2/3, nilai yang dapat diterima mencakup nilai apa pun antara 0.6666dan 0.6667, bahkan hal-hal seperti 0.666637104. Jika nilai pastinya adalah 1/3, jawaban apa pun yang berisi 0.3333valid. Anda dapat meninggalkan nol di belakang, atau nol di depan jika nilainya kurang dari satu.
  • Keluarkan pasangan dari ketiga nilai yang Anda inginkan, pastikan untuk menyatakan yang mana dua dan dalam urutan apa.

Kode terpendek dalam byte menang.

Contohnya

/\/\\/\//\\→ Kelancaran 0, Kekurangan 0.7, Kerusakan0.3

_/\\_/\\/__/\\\//_→ Kelancaran 0.29411764705, Kekurangan 0.29411764705, Kerusakan0.41176470588

//\\__/_\/→ Kelancaran 0.3333333, Kekurangan 0.2222222, Kerusakan0.4444444

Pertanyaan bonus: Mana yang Anda sukai, coretan halus atau tebal atau patah?

PhiNotPi
sumber
Mungkinkah ada bonus untuk mengeluarkan ketiganya, atau apakah Anda memiliki alasan khusus untuk memilih hanya dua?
A
1
@Callodacity 2 sudah cukup untuk mendefinisikan ke-3 karena jumlahnya dijumlahkan 1
trichoplax
2
@trichoplax poin bagus - jelas saya sudah bermain golf terlalu lama, saya tidak bisa memahami hal-hal sederhana lagi: P
A

Jawaban:

2

Pyth, 25 byte

mcl@.:d2.:z2tlzc2"\__//\/

Suite uji

Keluaran kelancaran, chunkiness. Pada dasarnya, ini mengambil string kode keras dan memotongnya menjadi dua. Setiap setengah diuraikan menjadi 2 substring karakter, dan hal yang sama dilakukan untuk input. Kami mengambil persimpangan, menghasilkan pasangan selatan dan tebal. Kemudian, kita ambil panjangnya, bagi dengan jumlah pasangan, dan cetak.

isaacg
sumber
2

Japt, 42 byte

U=U¬ä@2+"\\/\\__/"bX+Y)f2};[T2]£U¬fX l /Ul

Kerusakan keluaran, chunkyness. Cobalah online!

Bagaimana itu bekerja

            // Implicit: U = input string
U=UŠ@   }  // Set U to U split into chars, with each pair mapped by this function:
"..."bX+Y)  // Take the index in this string of the two chars concatenated.
            // This is 0-1 for chunky, 2-4 for smooth, and -1 for broken.
2+    f2    // Add two and floor to the nearest multiple of 2.
            // This is now 2 for chunky, 4 or 6 for smooth, and 0 for broken.
[T2]£       // Map each item X in [0,2] through this function:
U¬fX l      //  Count the occurances of X in U.
/Ul         //  Divide by U.length.
            // Implicit: output last expression

Versi yang tidak bersaing, 36 byte

U=Uä@2+"\\/\\__/"bZ)f2};[T2]£UèX /Ul

Bekerja pada dasarnya dengan cara yang sama seperti yang lain, dengan beberapa perubahan kecil:

  • äsekarang bekerja pada string. Karakter dilewatkan ke fungsi secara berurutan (X, Y, X+Y).
  • è menghitung jumlah kemunculan argumen dalam string / array.
Produksi ETH
sumber
1

Python 3, 149 byte

Ini menghasilkan kehalusan dan kekenyalan.

def f(s):
 for i in"012":s=s.replace("\_/"[int(i)],i)
 a=len(s)-1;t=["bscbssbbc"[int(s[i:i+2],3)]for i in range(a)]
 for x in"sc":print(t.count(x)/a)

Tidak Disatukan:

def f(s):
    for i in "012":
        s = s.replace("\_/"[int(i)], i)
    a = len(s) - 1
    t = []
    for i in range(a):
        t.append("bscbssbbc"[int(s[i:i+2],3)])
    for x in "sc":
        print(t.count(x) / a)
Sherlock9
sumber
1

Ruby, 71

Keluaran kelancaran, chunkiness.

Mengambil string halus dan tebal minimal dan mencari mereka untuk setiap string dua karakter dalam string awal.

Terima kasih kepada Kevin Lau untuk DELAPAN byte!

->x{%w{\\__/ /\\/}.map{|t|(0..n=x.size-2).count{|i|t[x[i,2]]}/(n+1.0)}}
Bukan itu Charles
sumber
1
(0..x.size-2).count{|i|t[x[i,2]]}menghemat 5 byte lebih dari x.chars.each_cons(2).count{|i|t[i*'']}. Dan sekarang Anda menggunakan x.sizedua kali dalam fungsi, menugaskannya ke variabel dan menggunakannya menyimpan byte tambahan.
Value Ink
@KevinLau Berhasil menyimpan 8 byte menggunakan pendekatan Anda. Terima kasih!
Bukan berarti Charles