Magic the Gathering: przyjaciele czy wrogowie?

67

W grze karcianej Magic: the Gathering występuje pięć różnych kolorów, które reprezentują luźne powiązania kart, biały ( W), niebieski ( U), czarny ( B), czerwony ( R) i zielony ( G). Są one często ułożone w pięciokąt w następujący sposób:

  W
G   U
 R B

Zarówno w tradycji MtG, jak i w wielu mechanikach kart, sąsiednie kolory w tym pięciokącie są zwykle uważane za sojuszników, a niesąsiadujące (jakby przeciwne) kolory są uważane za wrogów.

W tym wyzwaniu otrzymasz dwa kolory i powinieneś określić ich związek.

Wyzwanie

Otrzymałeś dowolne dwie różne postacie z zestawu BGRUW. Możesz je traktować jako ciąg dwóch znaków, ciąg z ogranicznikiem między znakami, dwie oddzielne wartości znaków, dwa ciągi singletonów, dwie liczby całkowite reprezentujące ich punkty kodowe lub typ listy lub zestawu zawierający dwa znaki / ciągi / liczby całkowite.

Twój wynik powinien być jedną z dwóch wyraźnych i spójnych wartości twojego wyboru, jedną, która wskazuje, że dwa kolory są sojusznikami, a drugą, że są wrogami. Jedna z tych dwóch wartości może w ogóle nie dać wyniku.

Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.

Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Przypadki testowe

Istnieje tylko 20 możliwych danych wejściowych, więc wymienię je wszystkie.

Przyjaciele:

WU   UB   BR   RG   GW   UW   BU   RB   GR   WG

Przeciwnicy:

WB   UR   BG   RW   GU   BW   RU   GB   WR   UG
Martin Ender
źródło
33
Dalej: zaimplementuj podstawowe zasady: P
Captain Man
12
@CaptainMan będę cię głosować, jeśli uda ci się dopasować do posta o postaci 30k :)
Walfrat
@Walfrat 30k? Powinno być możliwe
Nie że Karol
2
@IvanKolmychek z najbardziej nieoczekiwanych sojuszy przynosi najbardziej nieoczekiwane wyniki.
aluriak
1
Ciekawostka: Magic: Spotkanie dobiega końca :)
Matthew Roh

Odpowiedzi:

82

JavaScript (ES6),  26 23 17 15  14 bajtów

Pobiera dane wejściowe jako dwa kody ASCII w składni curry (a)(b). Zwraca 4dla przyjaciół lub 0dla wrogów.

a=>b=>a*b/.6&4

Wypróbuj online!

W jaki sposób?

NB: tylko iloraz liczby całkowitej dzielenia przez 0,6 pokazano poniżej.

Combo | a  | b  | a*b  | / 0.6 | AND 4
------+----+----+------+-------+------
  WU  | 87 | 85 | 7395 | 12325 |   4
  UB  | 85 | 66 | 5610 |  9350 |   4
  BR  | 66 | 82 | 5412 |  9020 |   4
  RG  | 82 | 71 | 5822 |  9703 |   4
  GW  | 71 | 87 | 6177 | 10295 |   4
  UW  | 85 | 87 | 7395 | 12325 |   4
  BU  | 66 | 85 | 5610 |  9350 |   4
  RB  | 82 | 66 | 5412 |  9020 |   4
  GR  | 71 | 82 | 5822 |  9703 |   4
  WG  | 87 | 71 | 6177 | 10295 |   4
------+----+----+------+-------+------
  WB  | 87 | 66 | 5742 |  9570 |   0
  UR  | 85 | 82 | 6970 | 11616 |   0
  BG  | 66 | 71 | 4686 |  7810 |   0
  RW  | 82 | 87 | 7134 | 11890 |   0
  GU  | 71 | 85 | 6035 | 10058 |   0
  BW  | 66 | 87 | 5742 |  9570 |   0
  RU  | 82 | 85 | 6970 | 11616 |   0
  GB  | 71 | 66 | 4686 |  7810 |   0
  WR  | 87 | 82 | 7134 | 11890 |   0
  UG  | 85 | 71 | 6035 | 10058 |   0

Poprzednie podejście, 15 bajtów

Pobiera dane wejściowe jako dwa kody ASCII w składni curry (a)(b). Zwraca 0dla przyjaciół lub 1dla wrogów.

a=>b=>a*b%103%2

Wypróbuj online!

W jaki sposób?

Combo | a  | b  | a*b  | MOD 103 | MOD 2
------+----+----+------+---------+------
  WU  | 87 | 85 | 7395 |    82   |   0
  UB  | 85 | 66 | 5610 |    48   |   0
  BR  | 66 | 82 | 5412 |    56   |   0
  RG  | 82 | 71 | 5822 |    54   |   0
  GW  | 71 | 87 | 6177 |   100   |   0
  UW  | 85 | 87 | 7395 |    82   |   0
  BU  | 66 | 85 | 5610 |    48   |   0
  RB  | 82 | 66 | 5412 |    56   |   0
  GR  | 71 | 82 | 5822 |    54   |   0
  WG  | 87 | 71 | 6177 |   100   |   0
------+----+----+------+---------+------
  WB  | 87 | 66 | 5742 |    77   |   1
  UR  | 85 | 82 | 6970 |    69   |   1
  BG  | 66 | 71 | 4686 |    51   |   1
  RW  | 82 | 87 | 7134 |    27   |   1
  GU  | 71 | 85 | 6035 |    61   |   1
  BW  | 66 | 87 | 5742 |    77   |   1
  RU  | 82 | 85 | 6970 |    69   |   1
  GB  | 71 | 66 | 4686 |    51   |   1
  WR  | 87 | 82 | 7134 |    27   |   1
  UG  | 85 | 71 | 6035 |    61   |   1

Wstępne podejście, 23 bajty

Pobiera dane wejściowe jako ciąg 2 znaków. Zwraca truedla przyjaciół lub falsedla wrogów.

s=>parseInt(s,35)%9%7<3

Wypróbuj online!

Arnauld
źródło
10
Ach, w końcu coś zabawnego. :)
Martin Ender
4
Fantastyczne znalezisko!
Greg Martin
Czy są jakieś sprytne matematyki, których tu nie znam, czy po prostu brutalnie wymuszałeś różne moduły, dopóki nie dostałeś takiego, który zadziałał?
FourOhFour
@FourOhFour To była brutalna siła. Myślę, że jest to najmniejsze rozwiązanie z podwójnym modułem . Ale część tej odpowiedzi (która używa porównania) byłaby w rzeczywistości o jeden bajt krótsza.
Arnauld,
1
@OddDev Właściwie przetestowałem wszystkie bity, nie tylko najmniej znaczące. Na przykład, a*b%290&8działałby równie dobrze (produkowanie 0dla przyjaciół lub 8wrogów).
Arnauld,
37

Galaretka , 6 bajtów

ạg105Ị

Jako argument przyjmuje dwa punkty kodowe. Daje 1 dla przyjaciół, 0 dla wrogów.

Wypróbuj online!

tło

Niech n i m będą punktami kodowymi dwóch znaków wejściowych. Biorąc | n - m | , musimy zajmować się tylko 2-kombinacjami postaci. Poniższa tabela pokazuje wszystkie 2 kombinacje znaków odpowiadające im różnice bezwzględne.

WU  2
UB 19
BR 16
RG 11
GW 16

WB 21
UR  3
BG  5
RW  5
GU 14

Wszystkie stac choc kombinacje są podzielne przez 3 , 5 lub 7 , ale żaden ze znajomych kombinacji tego, więc przyjaciele są dokładnie te, które są wspólnie pierwsza z 3 × 5 × 7 = 105 .

Jak to działa

ạg105Ị  Main link. Left argument: n (code point). Right argument: m (code point)

ạ       Yield the absolute difference of n and m.
 g105   Compute the GCD of the result and 105.
     Ị  Insignificant; return 1 if the GCD is 1, 0 if not.
Dennis
źródło
Ładnie zauważony! Dlaczego niezbędna jest wartość bezwzględna? (Próbowałem go online i nie dało to właściwej odpowiedzi; ale matematycznie nie powinno to mieć znaczenia.)
Greg Martin
@GregMartin Nie jest konieczne; podpisana różnica działałaby równie dobrze. Odejmowanie _to galaretka. Użyłeś czegoś innego?
Dennis
Ach, rozumiem, błędnie odczytałem tylko wartość bezwzględną, a nie absolutną różnicę.
Greg Martin
21

Befunge-98, 13 12 bajtów

~~-9%5%3%!.@

Wypróbuj online!

Odbitki 0dla przyjaciół i 1wrogów

Wykorzystuje różnicę między wartościami ASCII liter.

Jeśli weźmiemy (((ASCII difference % 9) % 5) % 3), wartości dla wrogów będą wynosić 0. Wówczas nie będziemy wartością i wydrukujemy ją.

Dzięki @Martin za golfa

Łagodnie Milquetoast
źródło
Użyj galaretki na 9 bajtów: IA%9%5%3¬Edytuj Wypróbuj online!
Jonathan Allan
@JonathanAllan Widzę, że już to zrobiłeś! Miły.
MildlyMilquetoast
Zmieniłem twoją metodę (używając rzeczywistej, a nie bezwzględnej różnicy) mod 9 mod 6, i wykorzystałem fakt, że Jelly indeksuje listy w sposób modułowy, aby sprowadzić go do 7 . Akredytowałem cię i zamieściłem tutaj link.
Jonathan Allan
@JonathanAllan Wymyśliłem również metodę mod 9 mod 6, ale Befunge nie ma rzeczywistej różnicy ani wartości bezwzględnej, więc nie było to tak wykonalne
MildlyMilquetoast
18

Galaretka , 8 7 bajtów

Piggyback z fantastycznej odpowiedzi Mistunge Figgins na Befunge !

Iị390B¤

Wypróbuj online!

W jaki sposób?

Jak zauważył Mistah Figgins, decyzję można podjąć, biorąc absolutną różnicę między wartościami ASCII mod 9 mod 5 mod 3 - 0 to przyjaciele, a 1 i 2 są wrogami.

Jeśli zamiast tego weźmiemy (zwykły) mod różnicy 9, stwierdzimy, że przyjaciele to 1, 2, 7 i 8, podczas gdy wrogowie to 3, 4, 5 i 6.

Kod do kwadratu różnicę przy Iczym indeksy do listy długość 9 [1,1,0,0,0,0,1,1,0], który jest 390 binarnie 390B. Indeksowanie jest zarówno modułowe (tak więc indeksowanie wykonuje mod 9 za darmo), jak i oparte na 1 (stąd 1 po lewej).

Jonathan Allan
źródło
16

Metaprogramowanie szablonu C ++, 85 bajtów

template<int A,int B,int=(A-B)%9%5%3>struct f;template<int A,int B>struct f<A,B,0>{};

mniej golfa:

template<int A, int B,int Unused=(((A-B)%9)%5)%3>
struct foe;
template<int A, int B>
struct foe<A,B,0>{};

Ponieważ jest to język metaprogramowania, kompilacja lub kompilacja nie jest jednym z możliwych wyników.

Instancja f<'W','B'>kompilacji wtedy i tylko wtedy 'W'i 'B'są wrogowie.

Matematyka oparta na odpowiedzi Befunge .

Przykład na żywo .

Ponieważ metaprogramowanie szablonów C ++ jest jednym z najgorszych języków gry w golfa, każdy, kto jest gorszy, powinien się wstydzić. ;)

Jak
źródło
Wygląda na to, że w środku znajdują się dwa zbędne białe znaki template.
Yytsi
@TuukkaX naprawiono, d'oh
Yakk 13.03.17
14

Ruby, 22 19 bajtów

->x,y{390[(x-y)%9]}

Wprowadź: kod ASCII 2 znaków. Wyjście: 1 dla sojuszników, 0 dla wrogów.

Jak to działa:

Znajdź różnicę między 2 cyframi modulo 9, użyj maski bitowej (390 to binarna 110000110) i uzyskaj pojedynczy bit za pomocą []operatora.

GB
źródło
2
Ach miło, ciągle zapominam, że liczby całkowite można indeksować. +1
Martin Ender
16 bajtów: ->x,y{x*y%103%2}Zauważ, że 0i 1są odwrócone.
Eric Duminil,
1
I 15 bajtów, x*y%51>9jak wszyscy inni. Sądzę, że niesprawiedliwe byłoby głosowanie za tak radykalną zmianą.
GB
10

CJam , 8 bajtów

{*51%9>}

Nienazwany blok, który oczekuje dwóch kodów znaków na stosie i zastępuje je 0(przyjaciółmi) lub 1(wrogami).

Wypróbuj online!

Wyjaśnienie

Cóż, widzieliśmy teraz wiele zabawnych rozwiązań arytmetycznych, więc myślę, że to w porządku, jeśli przedstawię teraz swoje własne. Najbliżej tego, co widziałem do tej pory, jest rozwiązanie C Steadyboksa . Ten został znaleziony przy pomocy brutalnego forcerla GolfScript, który napisałem jakiś czas temu dla anarchii golfa.

Oto, co robi to z różnymi danymi wejściowymi (ignorując kolejność, ponieważ początkowe mnożenie jest przemienne):

xy   x    y    x*y   %51  >9

WU   87   85   7395    0   0
UB   85   66   5610    0   0
BR   66   82   5412    6   0
RG   82   71   5822    8   0
GW   71   87   6177    6   0
WB   87   66   5742   30   1
UR   85   82   6970   34   1
BG   66   71   4686   45   1
RW   82   87   7134   45   1
GU   71   85   6035   17   1

Widzimy, jak biorąc iloczyn iloczynu modulo 51 ładnie dzieli dane wejściowe na duże i małe wyniki, i możemy użyć dowolnej z wartości pomiędzy, aby rozróżnić oba przypadki.

Martin Ender
źródło
9

Röda , 30 22 21 bajtów

Bajty zapisane dzięki @fergusq przy użyciu _do pobierania wartości ze strumienia jako danych wejściowych

{[_ in"WUBRGWGRBUW"]}

Wypróbuj online!

Funkcja jest uruchamiana jak push "WU" | fpo przypisaniu nazwy do funkcji

Wyjaśnienie

{                      /* Declares an anonymous function */
 [                 ]   /* Push */
  _ in                 /* the boolean value of the value on the stream is in */
      "WUBRGWGRBUW"    /* this string */
}
Kritixi Lithos
źródło
o_O prędkość błyskawicy
Pavel
Możliwe jest zapisanie 5 bajtów poprzez odczytanie wartości wejściowych ze strumienia zamiast pobierania parametrów:, {[(_.._)in"WUBRGWGRBUW"]}ale wtedy funkcja musi zostać wywołana jak [a, b] | f.
fergusq
9

05AB1E , 10 bajtów

Zwraca 0 za przyjaciela i 1 za wroga.

‘Û‹BWR‘ûIå

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

‘Û‹BWR‘     # push the string "RUGBWR"
       û    # palendromize (append the reverse minus the first char)
        Iå  # check if input is in this string
Emigna
źródło
9

C, 33 32 29 24 22 bajtów

#define f(k,l)k*l%51<9

Zwraca 1 jeśli przyjaciele, 0 jeśli wrogowie.

Steadybox
źródło
8

Vim, 22 21 bajtów

CWUBRGWGRBUW<esc>:g/<c-r>"/d<cr>

Dane wejściowe: pojedynczy wiersz zawierający dwa znaki.

Wyjście: pusty bufor dla przyjaciół, bufor zawierający WUBRGWGRBUWwrogów.

Wyjaśnienie

C                                 # [C]hange line (deletes line into " register and enters insert mode)
 WUBRGWGRBUW<esc>                 # insert this text and exit insert mode
                 :g/      /d<cr>  # delete all lines containing...
                    <c-r>"        # ... the previously deleted input
m-chrzan
źródło
2
Możesz zrobić Czamiastcw
Kritixi Lithos
8

Japt , 6 bajtów

Zainspirowany rozwiązaniem @Martin Ender .

Pobiera tablicę dwóch kodów znaków jako danych wejściowych.

×%51<9

Wypróbuj online! | Pakiet testowy

Zwraca truedla przyjaciół, falsedla wrogów.

14-bajtowe rozwiązanie:

Pobiera dwa kody znaków jako dane wejściowe

nV a /3%3 f ¦1

Wypróbuj online! | Pakiet testowy

Wyjaśnienie:

nV a /3%3 f ¦1
nV a             // Absolute value of: First input (implicit) - Second input
      /3%3 f     // Divide by 3, mod 3, then floor the result
             ¦1  // Return true if the result does not equals 1, otherwise return false

12-bajtowe rozwiązanie:

"WUBRGW"ê èU

Wypróbuj online! | Pakiet testowy

Wyjaśnienie:

"WUBRGW"ê èU
"WUBRGW"ê     // "WUBRGW" mirrored = "WUBRGWGRBUW"
          èU  // Returns the number of times U (input) is found

Zwraca 1dla przyjaciół i 0dla wrogów.

9-bajtowe rozwiązanie :

Zainspirowany rozwiązaniem @ Arnauld .

*V%24%B%2

Pakiet testowy

Zwraca 1dla przyjaciół, 0dla wrogów.

11-bajtowe rozwiązanie:

zainspirowany rozwiązaniem @Mistah Figgins .

nV %9%5%3¦0

Pakiet testowy

Oliver
źródło
8

Brain-Flak , 155, 147 , 135 bajtów

(([(({}[{}]))<>])){({}())<>}(((([])[][][])[]())()()())<>{}<>{({}<><(({}))>)({}[{}]<(())>){((<{}{}>))}{}{{}({}<({}())>)(<()>)}{}<>}<>{}

Wypróbuj online!

Jest to 134 bajty kodu plus jeden bajt kary dla -aflagi, która umożliwia wejście ASCII.

Działa to poprzez znalezienie bezwzględnej różnicy między wejściami i sprawdzenie, czy są równe 2, 11, 16 lub 19. Jeśli tak, dane wejściowe są przyjacielem i wypisuje 1. Jeśli nie, nic nie wypisuje. Ponieważ nic w teście mózgowym nie odpowiada pustemu stosowi, co jest fałszem, żadne wyjście nie jest wartością fałszowania. ( meta )

Jedną rzeczą, która szczególnie podoba mi się w tej odpowiedzi, jest to, że fragment „absolutnej różnicy” (to znaczy (([(({}[{}]))<>])){({}())<>}{}{}<>{}) nie jest czysty na stosie, ale nadal można go użyć w tej odpowiedzi, ponieważ nie obchodzi nas, na którym stosie trafimy przed kodowaniem. możliwe różnice.

Przy późniejszej edycji wykorzystałem to jeszcze bardziej, nadużywając resztek na stosie, co nie kończy się absolutną różnicą. Podczas pierwszej wersji wysadziłem ich obu, aby zachować nieco więcej rozsądku. Nie zrobienie tego daje dwa główne pola golfowe:

  1. Oczywiście usuwa kod, aby je pop:, {}{}ale co ważniejsze:

  2. Pozwala nam to skompresować 2, 11, 16, 19sekwencję

    (((((()()))[][][](){})[][]())[])
    

    do

    (((([])[][][])[]())()()())
    

    Na szczęście nie ma potrzeby dodatkowego kodu, aby później obsłużyć te resztki, więc pozostały one tylko na innym stosie.

Ponieważ flakowanie mózgu jest niezwykle trudne do zrozumienia, oto czytelna / skomentowana wersja:

#Push the absolute difference of the two input characters. It is unknown which stack the result will end on
(([(({}[{}]))<>])){({}())<>}

#Push 2, 11, 16, 19, while abusing the values left on the stack from our "Absolute value" calculation
(((([])[][][])[]())()()())

#Pop a zero from the other stack and toggle back
<>{}<>

#While True
{

    #Move top over and duplicate the other top
    ({}<><(({}))>)

    #Equals?
    ({}[{}]<(())>){((<{}{}>))}{}

    #If so:
    {

        #Increment the number under the stack
        {}({}<({}())>)
        #Push a zero
        (<()>)

    }

    #Pop the zero
    {}

    #Go back to the other stack
    <>

#Endwhile
}

#Toggle back
<>

#Pop a zero
{}
DJMcMayhem
źródło
Jest push, pop, który możesz usunąć, i możesz wcisnąć 0 w, jeśli bardziej efektywnie, aby zejść do 129: TIO
Riley
@ Riley Cool, dzięki za wskazówkę! Lubię mieć skomentowaną wersję, więc przed aktualizacją poczekam, aż zrozumiem tę wersję.
DJMcMayhem
To były tylko dwie niewielkie zmiany. Oto ważna część. Moje komentarze są pisane wielkimi literami, przepraszam, jeśli wygląda na to, że krzyczę.
Riley,
7

Galaretka , 14 bajtów

“WUBRG”wЀIAÆP

Zwraca 1za wrogów i 0przyjaciół.

Pakiet testowy w Wypróbuj online!

W jaki sposób?

“WUBRG”wЀIAÆP - Main link                                   e.g. WG
“WUBRG”        - ['W','U','B','R','G']
       wЀ     - first index of sublist mapped over the input     [1,5]
          I    - incremental differences                           -4
           A   - absolute value                                     4
            ÆP - is prime?                                          0
Jonathan Allan
źródło
7

05AB1E , 7 bajtów

$Æ105¿Ö

To jest port mojej odpowiedzi na żelki . Pobiera na wejściu listę punktów kodowych. Drukuje 1 dla przyjaciół, 0 dla wrogów.

Wypróbuj online!

Jak to działa

$        Push 1 and [n, m] (the input).
 Æ       Reduce [n, m] by subtraction, pushing n - m.
  105¿   Take the GCD of n - m and 105.
      Ö  Test if 1 is divisible by the GCD (true iff the GCD is ±1).
Dennis
źródło
6

CJam , 16 12 11 10 bajtów

Rozegrano 4 bajty za pomocą algorytmu Mistah Figgins

Zaoszczędzono 1 bajt dzięki Lynn

l:m9%5%3%!

Wyjścia 1dla kolorów wroga, 0dla kolorów sojuszników.

Wypróbuj online! (Lub zweryfikuj wszystkie przypadki testowe )

Wyjaśnienie

l           e# Push a line of input as a string
 :m         e# Reduce the string by subtraction (using the ASCII values)
   9%5%3%   e# Mod by 9, then by 5, then by 3. By doing this, enemy
            e#  pairs go to 0, and allies go to 1, 2, -1, or -2.
         !  e# Boolean negation
Business Cat
źródło
Nie próbuj być zbyt sprytny! l:m9%5%3%!jest bajt krótszy.
Lynn,
@ Lynn Oh wow, to jest. To trochę nudne. Dzięki
Business Cat
5

Siatkówka , 18 bajtów

O`.
BR|BU|GR|GW|UW

Wypróbuj online!

Całkiem proste: sortuje dane wejściowe i próbuje dopasować do nich dowolną z posortowanych par sojuszników. Niestety nie sądzę, że oparty na łańcuchach Retina charakter pozwala na bardziej interesujące podejście do rywalizacji.

Jako rzut oka na następną wersję Retina, planuję dodać opcję, która zamienia wyrażenia regularne i ciąg docelowy (więc bieżący ciąg zostanie użyty jako wyrażenie regularne i dasz mu ciąg do sprawdzenia), w którym to przypadku jest on krótszy rozwiązanie zadziała (lub coś w tym stylu):

?`WUBRGWGRBUW
Martin Ender
źródło
4

Brachylog , 10 bajtów

Proste rozwiązanie, bez żadnych sztuczek.

p~s"WUBRGW

Wypróbuj online!

Wyjaśnienie

p               A permutation of the input
 ~s             is a substring of
   "WUBRGW      this string
Lew
źródło
4

Galaretka , 6 bajtów

ạ:3%3Ḃ

Dla kompletności. Jako argument przyjmuje dwa punkty kodowe. Daje 0 dla przyjaciół, 1 dla wrogów.

Wypróbuj online!

tło

Niech n i m będą punktami kodowymi dwóch znaków wejściowych. Biorąc | n - m | , musimy zajmować się tylko 2-kombinacjami postaci. Poniższa tabela pokazuje wszystkie 2 kombinacje znaków odpowiadające im różnice bezwzględne.

WU UB BR RG GW  WB UR BG RW GU
 2 19 16 11 16  21  3  5  5 14

Jeśli podzielimy te liczby całkowite przez 3 , otrzymamy następujące ilorazy.

WU UB BR RG GW  WB UR BG RW GU
 0  6  5  3  5   7  1  1  1  4

1 , 4 i 7 można zmapować na 1 , biorąc wyniki modulo 3 .

WU UB BR RG GW  WB UR BG RW GU
 0  0  2  0  2   1  1  1  1  1

Teraz musimy tylko spojrzeć na parzystość.

Jak to działa

ạ:3%3Ḃ  Main link. Left argument: n (code point). Right argument: m (code point)

ạ       Absolute difference; yield |n - m|.
 :3     Integer division by 3, yielding |n - m| / 3.
   %3   Modulo 3, yielding |n - m| / 3 % 3.
     Ḃ  Parity bit; yield |n - m| / 3 % 3 & 1.
Dennis
źródło
4

Cubix, 11 bajtów

Implementacja rozwiązania Arnauld przez Cubix.

U%O@A*'g%2W

Stosowanie

Wprowadź dwa znaki, a wyświetli się 0dla przyjaciół i 1wrogów. Wypróbuj tutaj.

Wyjaśnienie

Kod można rozszerzyć w ten sposób.

    U %
    O @
A * ' g % 2 W .
. . . . . . . .
    . .
    . .

Znaki są wykonywane w tej kolejności (z wyłączeniem przepływu kontrolnego):

A*'g%2%O@
A         # Read all input as character codes
 *        # Multiply the last two character codes
    %     # Modulo the result by
  'g      #     103
      %   # And modulo that by
     2    #     2
       O  # Output the result ...
        @ # ... and terminate
Łukasz
źródło
2

AWK, 23 bajtów

{$0="WUBRGWGRBUW"~$1}1

Przykładowe użycie: awk '{$ 0 = "WUBRGWGRBUW" ~ 1 $} 1' <<< UB

Drukuje się, 1jeśli para jest przyjacielem, w 0przeciwnym razie. Chciałem zrobić coś sprytnego, ale wszystko, o czym myślałem, potrwa dłużej.

Robert Benson
źródło
2

Galaretka , 12 bajtów

“WUBRGW”ŒBẇ@

Wyjścia 1dla sojuszników, 0wrogów.

Wypróbuj online!

Wyjaśnienie

“WUBRGW”ŒBẇ@   Main link

“WUBRGW”       The string "WUBRGW"
        ŒB     Bounce; yields "WUBRGWGRBUW"
          ẇ@   Check if the input exists in that string
Business Cat
źródło
2

Rubinowy, 28 bajtów

Dane wyjściowe true dla przyjaciela, false dla wroga:

p'WUBRGWGRBUW'.include?$**''

Wersja bez golfa nie różni się zbytnio:

p 'WUBRGWGRBUW'.include?(ARGV.join(''))
Sculper
źródło
2

GolfScript , 7 bajtów

~*51%9>

Pobiera dwa punkty kodowe jako dane wejściowe.

Wypróbuj online! (Zestaw testowy, który dla wygody konwertuje format wejściowy).

Port GolfScript mojej odpowiedzi CJam (który technicznie jest portem CJam wyniku mojej brutalnej forcerki GolfScript ... uhhh ...).

Ponieważ jednak GolfScript dostaje modulo z ujemnymi danymi wejściowymi, istnieje fajne alternatywne rozwiązanie o tej samej liczbie bajtów, które wykorzystuje 4dla wrogów zamiast 1:

~-)9%4&

Wypróbuj online!

xy   x    y    x-y    +1  %9  &4

WU   87   85     2     3   3   0
UB   85   66    19    20   2   0
BR   66   82   -16   -15   3   0
RG   82   71    11    12   3   0
GW   71   87   -16   -15   3   0
WB   87   66    21    22   4   4
UR   85   82     3     4   4   4
BG   66   71    -5    -4   5   4
RW   82   87    -5    -4   5   4
GU   71   85   -14   -13   5   4
Martin Ender
źródło
2

Java 7, 38 bajtów

int b(int a,int b){return(a-b)%9%5%3;}

Port z odpowiedzi Befunge-98 @Mistah Figgins jest najkrótszy w Javie 7 z dotychczas opublikowanych odpowiedzi.
Co do pozostałych:

39 bajtów: Port z odpowiedzi JavaScript (ES6) @Arnauld .

int a(int a,int b){return a*b%24%11%2;}

39 bajtów: Port od @MartinEnder „s CJam odpowiedź

Object e(int a,int b){return a*b%51>9;}

47 bajtów: Port z odpowiedzi @Steadybox 'C.

Object d(int a,int b){return(a=a*b%18)>7|a==3;}

52 bajty: Port z odpowiedzi @Lynn na Python 2

Object c(String s){return"WUBRGWGRBUW".contains(s);}

UWAGA: Pomiń odpowiedzi, które używają liczb pierwszych / palindromów i tym podobne, ponieważ w Javie nie są one zbyt krótkie. ;)
DO ZROBIENIA: Wymyślenie własnej odpowiedzi. Chociaż wątpię, że jest krótsza niż większość z nich.

Wypróbuj wszystko tutaj.


EDYCJA: Ok, sam wymyśliłem coś, co nie jest takie złe:

50 bajtów:

Object c(int a,int b){return(a=a*b%18)>3&a<7|a<1;}

Wyjaśnienie:

ab  a   b   a*b     %18

WU  87  85  7395    15
UB  85  66  5610    12
BR  66  82  5412    12
RG  82  71  5822    8
GW  71  87  6177    3
UW  85  87  7395    15
BU  66  85  5610    12
RB  82  66  5412    12
GR  71  82  5822    8
WG  87  71  6177    3

WB  87  66  5742    0
UR  85  82  6970    4
BG  66  71  4686    6
RW  82  87  7134    6
GU  71  85  6035    5
BW  66  87  5742    0
RU  82  85  6970    4
GB  71  66  4686    6
WR  87  82  7134    6
UG  85  71  6035    5

Wszyscy wrogowie są w przedziale 4-6 (włącznie) lub 0.
EDYCJA 2: Hmm .. Właśnie zauważyłam, że jest bardzo podobna do odpowiedzi @Steadybox .. :(

Kevin Cruijssen
źródło
2

PHP, 31 bajtów

echo!strstr(WBGURWRUGBW,$argn);

Uruchom z echo AB | php -nR '<code>, gdzie Ai Bsą dwa kolory.

strtrzwraca ciąg z pozycji, w której znajduje się wejście;
z WBGURWRUGBWjak stóg siana zwraca prawdziwy ciąg, jeśli kolory są wrogami; pusty ciąg, jeśli nie.

!zamienia prawdziwy ciąg znaków na false, co skutkuje pustym wyjściem,
a pusty ciąg na true, co daje wynik 1.

Tytus
źródło