Bir çizgiden geçen çeyrekler


15

Görev

Bir çizginin temsili verildiğinde , o çizginin geçtiği kadran sayısını çıkarın .

Bir Hattın Geçerli Temsilleri

Bir satırı şu şekilde temsil edebilirsiniz:

  • Üç imzalı tamsayı A, Bve Cortak bir faktör paylaşmak ve nerede hangi Ave Bçizgiyi temsil eden her iki sıfır değildir Ax + By = C,
  • Dört imzalı tamsayı , , , ve , noktalardan geçen çizgi temsil ve yaX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Dilinizde varsa bir satırı tanımlayan bir veri türü (dikey satırları desteklemesi gerekir).

Sen olabilir değil dikey bir çizgi (örneğin eğim-kesişim formu) için izin vermiyor herhangi bir biçimde girdi alır. Tam sayıları girdi olarak almayı seçerseniz, bunların kapsayıcı aralıkta olduğunu varsayabilirsiniz [-127, 128].

Özellikler

  • Çıktı her zaman 0, 2 veya 3 olacaktır (bir satır hiçbir zaman dört çeyreğin tamamından geçemez veya sadece tek bir satırdan geçemez).
  • Eksendeki bir çizginin herhangi bir çeyrek daire içinden geçmediği kabul edilir. Kökeni geçen bir çizginin sadece 2 kadrandan geçtiği kabul edilir.
  • Hangi kadranlardan geçildiğini iade etmek zorunda değilsiniz (test vakaları netlik için bunları içeriyor olsa da).
  • Bu , bu nedenle (bayt cinsinden ölçülen) en kısa geçerli cevap kazanır.

Test Durumları

Bunları kullanmadan önce uygun bir biçime dönüştürmeniz gerekir.

1x + 1y = 1   ->  3  (quadrants I, II, and IV)
-2x + 3y = 1  ->  3  (quadrants I, II, and III)
2x + -3y = 0  ->  2  (quadrants III and I)
1x + 1y = 0   ->  2  (quadrants II and IV)
3x + 0y = 6   ->  2  (quadrants I and IV)
-3x + 0y = 5  ->  2  (quadrants II and III)
0x + -8y = 4  ->  2  (quadrants III and IV)
0x + 1y = 0   ->  0  (lies on the x-axis)
1x + 0y = 0   ->  0  (lies on the y-axis)

1
Eğer ihtiyaç varsa, okulda Leaky Nun'den ödünç aldığımız taktiği öğretmelidirler.
mbomb007

Yanıtlar:



3

Jöle , 5 bayt

TL’ȧ$

Çevrimiçi deneyin!

  • Challenger5 sayesinde -1 bayt
  • Leaky Nun sayesinde -1 bayt
  • H.PWiz sayesinde -2 bayt

Artık Leaky'nin cevabına dayanmıyor!


ċ0ị2,0,3bir bayt kaydeder
Esolanging Meyve

@ Challenger5 Ha, öyle. Teşekkürler!
caird coinheringaahing


1
Nasıl hakkında TL’ȧ$. Jelly bilmiyorum, bu yüzden golf edilebilir
H.PWiz

@ H.PWiz Çok hoş! Bunun golf yapılabileceğini sanmıyorum ama yanılıyor olabilirim.
Şubat

3

Javascript (ES6), 30 24 22 bayt

Bu benim ilk kez Javascript'te golf oynamaya çalışıyor. Sıfırları saymanın daha iyi bir yolu olmalı ...

(a,b,c)=>3<<!a+!b+!c&3

Herman Lauenstein sayesinde -6 bayt, operatör önceliklerini hatırlamak için -2 bayt.

Bunun yerine bir dize döndürmek için alternatif 24 baytlık çözüm:

(a,b,c)=>"320"[!a+!b+!c]

1
Aslında oldukça zekice ...
Esolanging Fruit

1
Dizi kullanmadan 24 bayt(a,b,c)=>3<<(!a+!b+!c)&3
Herman L

Görünüşe göre artık bir dizi kullanmak için benim golf olamaz ...
ericw31415



2

GolfScript , 16 14 bayt

~{!!}%{+}*.1>*

Çevrimiçi deneyin!

  • @ Challenger5 -2 bayt

Bu program, denklemdeki katsayıları temsil eden 3 tamsayıdan oluşan bir dizi alır Ax + By = C

Örnek Giriş / Çıkış

[1 1 1]   -> 3
[-2 3 1]  -> 3

Nasıl çalışır

~                       - Eval string (input)
  {  }%                 - Map to array
   !!                   - Double not (equivalent to != 0)
        {+}*            - total array (fold addition)
            .           - Duplicate top of stack
             1>         - Greater than 1?
               *        - Multiply     

Bunu hesaplamanın matematiksel bir yolunu bulmak benim için biraz zor oldu. Ancak, yalnızca 8 olası yapılandırma vardır.a != 0 & b != 0 & c != 0

0 0 0 = 0
a 0 0 = 0
0 b 0 = 0
0 0 c = 0
a 0 c = 2
0 b c = 2
a b 0 = 2
a b c = 3

Sonunda aşağıdaki fonksiyona geldim.

F(a,b,c) {
    var r = sign(a)+sign(b)+sign(c);
    if(r > 1)
        r;
    else
        return 0;
}

ve her şey tek bir matematik problemine yoğunlaştırılabilir

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}

Bunun {!!}%yerine kullanabileceğinizi düşünüyorum [{!!}/].
Esolanging Fruit

Bu sunumun CJam çevirisi vardır {:!:!:+_1>*}.
Esolanging Fruit

@ Challenger5 lol, Bunu nasıl fark etmedim. Ayrıca güzel bir liman, sadece şimdi nasıl okunacağını öğrenmek zorundayım.
Marcos

Bu durumda, önemli farklar haritalama 1) kestirme olan ( :!eşdeğerdir {!}%), (azaltmak için 2) kestirme :+eşdeğerdir {+}*, 3)) .ile değiştirilir _CJam)) ilmiklere sahip bulunmaktadır, ve 4 için (CJam giriş yok varsayılan olarak yığının üzerinde, yani {}bir işlev yapmak için kodu sarmanız anlamına gelir .
Esolanging Fruit


1

JavaScript, 25 bayt

_=>3<<!_[0]+!_[1]+!_[2]&3

Leaky Nun'in cevabına dayanarak.




1

ABCR , 30 bayt

Girdi, A,B,Cvirgüllerin sayısal olmayan, -karakter olmayan herhangi bir karakterle değiştirilebileceği biçimdedir .

BBi7baxci7baxci7bax@7)A7(xxo

Henüz çevrimiçi tercüman yok, ama işte bir açıklama:

BB                                Add two values to the B queue. (Values are unimportant)
  i7 ax                           Read in a number.  If it's non-zero...
    b                             Dequeue one item from the B queue.
       c                          Read in the delimiter...
        i                         ... And promptly overwrite it with the next number.
         7baxci7bax               Repeat the whole "if 0, dequeue from B" for the
                                     other two input numbers.
                   @              Get the current length of the B queue. [2, 1, or 0]
                    7             If the length isn't 0...
                     )            ... Increment it to our required [3,2,0]
                      A           ... And enqueue it to A.
                                  (We don't need to add to A otherwise, because it defaults
                                    to 0 already if there's no value in it.
                                    I used that to exit the queue with 7_ax earlier.)
                       7(xx       Set the register to 0 to exit from loop.
                           o      Peek A and print as a number.


0

Deorst , 12 bayt

l0EN))A:k?Z+

Çevrimiçi deneyin!

Biraz Leaky'nin cevabına dayanıyordu ; aynı öncül, ancak farklı bir eşleme yöntemi kullanır.

Nasıl çalışır

Deorst'un yerleşik bir sayım olayı var, ancak (bazı nedenlerden dolayı) bir indeksleme komutu yok, bu yüzden solun a.count(0)ve sağın istenen sonuç olduğu aşağıdaki eşlemeyi oluşturmak zorunda kaldım

0 -> 3
1 -> 2
2 -> 0

Programın kendisi bu şekilde çalışır (örnek girdi [1,1,1])

l0           - Push 0;     STACK = [[1 1 1] 0]
  EN         - Count;      STACK = [0]
    ))       - Subtract 2; STACK = [-2]
      A      - Absolute;   STACK = [2]
       :     - Duplicate;  STACK = [2 2]
        k?Z  - Positive?;  STACK = [2 1]
           + - Sum;        STACK = [3]

0

++ , 23 bayt ekle

D,f,@@@,!$!@!s2$_|d0$>+

Çevrimiçi deneyin!

Her iki kapalı göre benim Deorst cevap ve sızan Python cevap

Nasıl çalışır

D,f,@@@,  - Create a triadic function. 
            Example arguments;   [1 1 1]
        ! - Logical NOT; STACK = [1 1 0]
        $ - Swap;        STACK = [1 0 1]
        ! - Logical NOT; STACK = [1 0 0]
        @ - Reverse;     STACK = [0 0 1]
        ! - Logical NOT; STACK = [0 0 0]
        s - Sum;         STACK = [0]
        2 - Push 2;      STACK = [0 2]
        $ - Swap;        STACK = [2 0]
        _ - Subtract;    STACK = [-2]
        | - Absolute;    STACK = [2]
        d - Duplicate;   STACK = [2 2]
        0 - Push 0;      STACK = [2 2 0]
        $ - Swap;        STACK = [2 0 2]
        > - Greater to;  STACK = [2 1]
        + - Sum;         STACK = [3]

Ancak, ana kod gövdesi yerine Add ++ işlevlerini çok fazla kullandığımı düşünüyorum. Bu yüzden her iki işlevi ve kod gövdesini kullanarak yapmaya çalıştım ve çok daha güzel bir 50 baytlık parça ile sonuçlandı (evet, buradaki en uzun cevap):

# Example input: 1 1 1;
# x and y are the accumulators

D,f,@@@,!$!@!s # Count the 0s
$f>?>?>?       # Call f with the input.
-2   # Subtract 2;    x: -2;  y: 0
^2   # Square;        x: 4;   y: 0
S    # Square root;   x: 2.0; y: 0
\1   # To integer;    x: 2;   y: 0
y:x  # Assign x to y; x: 2;   y: 2
}    # Switch to y;   x: 2;   y: 2
>0   # Is positive?;  x: 2;   y: 1
}    # Switch to x;   x: 2;   y: 1
+y   # Add y to x;    x: 3;   y: 1
O    # Print x

Çevrimiçi deneyin!

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.