Pürüzsüz ve Tıknaz ve Kırık Dalgalı


12

Dayanarak Chunky vs dizeler Smooth .

Squiggles /\_/\/\__/\/\/\/\_/\_/\gerçekten sıkıldığınızda klavyede yapmak eğlencelidir. Ancak tüm dalgalı çizgiler eşit yaratılmaz. Bazı dalgalı çizgiler gibi \___/, bazıları tıknaz, gibi /\/\/\/\. Diğerleri düpedüz kırık,////_\\\

NKarakterlerin her dalgasının içinde N-1dalgalı kavşaklar var. Her dalgalı bağlantı üç tipten birine sınıflandırılır:

  • Pürüzsüz (açı> "90 derece"):

    \_ __ _/

  • Tıknaz (açı = "90 derece")

    /\ \/

  • Kırık (bağlanmayan herhangi bir şey)

    // \\ /_ _\

Diyelim tanımlayan düzgünlüğü ile pürüzsüz olan birleşme oranı olarak bodurluk ve parçalanmışlığın benzer şekilde tanımlanır. Her değer 0ve arasında değişir 1. Bir dalganın düzgünlüğü, tıkanıklığı ve kırılganlığının toplamı her zaman 1'e eşittir.

Örneğin, dalgalı kenarda /\/\\_//\_3 düz kavşak, 4 tıknaz kavşak ve 2 kırık kavşak vardır. Böylece 0.3333pürüzsüz, 0.4444tıknaz ve 0.2222kırılır.

Boş dizeler ve yalnızca bir karaktere sahip dizeler tanımsız değerlere sahiptir, tüm girişler en az 2 karakter uzunluğunda olacaktır.

Meydan okuma

Rasgele uzunlukta bir dalgalı olan ve düzgünlüğü, tıkanıklığı ve kırılma değerlerinden herhangi birini veren bir program yazın.

  • STDIN, komut satırı veya dize bağımsız değişkeni olarak girdi ile bir program veya işlev yazabilirsiniz.
  • Girişin en az uzunluk = = 2 olduğunu ve yalnızca /\_isteğe bağlı bir satırsonu karakteri olan karakterlerden oluştuğunu varsayabilirsiniz .
  • Yazdırın (veya bir işlev varsa geri getirin), en az 4 ondalık hassasiyetle yuvarlanır veya yuvarlanır. Gerçek değer ise 2/3, kabul edilebilir değerler 0.6666ve 0.6667hatta gibi şeyler arasındaki herhangi bir değeri içerir 0.666637104. Kesin değer ise 1/3, içeren yanıtlar 0.3333geçerlidir. Sondaki sıfırları veya değer birden küçükse baştaki sıfırı bırakabilirsiniz.
  • Üç değerin herhangi bir çiftini istediğiniz gibi çıktılayın, sadece hangi ikisinin ve hangi sırada olduğunu belirttiğinizden emin olun.

Bayt cinsinden en kısa kod kazanır.

Örnekler

/\/\\/\//\\→ Pürüzsüzlük 0, Tıknazlık 0.7, Kırıklık0.3

_/\\_/\\/__/\\\//_→ Pürüzsüzlük 0.29411764705, Tıknazlık 0.29411764705, Kırıklık0.41176470588

//\\__/_\/→ Pürüzsüzlük 0.3333333, Tıknazlık 0.2222222, Kırıklık0.4444444

Bonus soru: Hangisini tercih edersiniz, pürüzsüz veya tıknaz veya kırık dalgalı çizgiler?


Üçünün de çıktısını almak için bir bonus olabilir mi, yoksa sadece ikisini seçmek için özel bir nedeniniz var mı?
Aᴄʜᴇʀᴏɴғᴀɪʟ

1
@Callodacity 2, 3'ü tanımlamak için yeterlidir, çünkü 1
trichoplax

2
@trichoplax iyi bir nokta - belli ki çok uzun süre golf
oynuyorum,

Yanıtlar:


2

Pyth, 25 bayt

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

Test odası

Pürüzsüzlük, tıkanıklık verir. Temel olarak, sabit kodlanmış dizeyi alır ve yarıya indirir. Her yarım, 2 karakter alt dizelerine ayrılır ve giriş için aynı işlem yapılır. Güney ve tıknaz çiftlerle sonuçlanan kesişim noktasını alıyoruz. Sonra, uzunluğu alır, çift sayısına böleriz ve yazdırırız.


2

Japt, 42 bayt

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

Çıktı kırılma, tıkanıklık. Çevrimiçi deneyin!

Nasıl çalışır

            // 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

Rakip olmayan sürüm, 36 bayt

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

Birkaç küçük değişiklikle temelde diğeriyle aynı şekilde çalışır:

  • äşimdi dizelerde çalışıyor. Karakterler sırayla işleve aktarılır (X, Y, X+Y).
  • è dize / dizideki bağımsız değişkenin yineleme sayısını sayar.

1

Python 3, 149 bayt

Bu düzgünlük ve tıkanıklık verir.

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)

Ungolfed:

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)

1

Ruby, 71

Pürüzsüzlük, tıkanıklık verir.

En az düz ve tıknaz dizeleri alır ve ilk dizgideki her iki karakterli dizeyi arar.

Sekiz bayt için Kevin Lau'ya teşekkürler !

->x{%w{\\__/ /\\/}.map{|t|(0..n=x.size-2).count{|i|t[x[i,2]]}/(n+1.0)}}

1
(0..x.size-2).count{|i|t[x[i,2]]}5 bayt tasarruf sağlar x.chars.each_cons(2).count{|i|t[i*'']}. Ve şimdi x.sizeişlevde iki kez kullandığınıza , bir değişkene atadığınıza ve bunu kullandığınızda fazladan bir bayt tasarrufu sağladığınıza.
Değer Mürekkebi

@KevinLau Yaklaşımınızı kullanarak 8 bayt tasarruf etmeyi başardı. Teşekkürler!
Charles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.