Scal dwie wartości

44

Masz dwie wartości, z których każda 0reprezentuje „nieznany” lub jedną z nich 1,2,3. Połącz je w jedną wartość w następujący sposób:

  • Jeśli obie wartości są niezerowe i równe, wypisz tę wartość:
    (3,3) -> 3
  • Jeśli obie wartości są niezerowe, ale nierównomierne, wyjmij 0 dla nieznanych:
    (1,2) -> 0
  • Jeśli jedna wartość jest równa zero, a druga nie jest, wypisz wartość niezerową:
    (2,0) -> 2, (0,1) -> 1
  • Jeśli obie wartości są równe zero, wyjście wynosi zero:
    (0,0) -> 0

Przypadki testowe:

Istnieje 16 możliwych par danych wejściowych.

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

Liderów

xnor
źródło
8
Czwarta zasada pasuje do pierwszej reguły, więc nie wiem, dlaczego je rozdzieliłeś.
Fatalize
1
Nitpick: Czwarty punkt jest zbędny, możesz po prostu usunąć „niezerowe” z pierwszego punktu. EDYCJA: Wow, czym jest ninja @Fatalize.
Erik the Outgolfer
Również 3 nie jest tutaj naprawdę konieczne, chociaż zwiększa liczbę możliwych danych wejściowych.
Erik the Outgolfer
2
Rozważałem skondensowanie reguł, ale pomyślałem, że najłatwiej będzie po prostu wymienić wszystkie przypadki zerowe / niezerowe i pozostawić optymalizację golfistom.
xnor
2
To potrzebuje tabeli wyników , na pierwszej stronie zaczynają się już pojawiać odpowiedzi na drugiej stronie.
Ørjan Johansen

Odpowiedzi:

22

Python 3 , 27 25 bajtów

lambda x,y:(x|y)>>(x*y&2)

Wypróbuj online!

Dennis
źródło
5
Podoba mi się, że psuje się to dla danych powyżej 3. Jak to wymyśliłeś?
Jakob
4
Zasadniczo dużo prób i błędów.
Dennis
1
Ciekawy. Przez chwilę zastanawiałem się nad zautomatyzowaniem wyszukiwania za pomocą wyrażeń o ograniczonej długości z udziałem dwóch liczb wewnętrznych i kilku operatorów, ale przestrzeń jest o wiele za duża nawet przy około 20 bajtach. Wymagana jest inteligencja!
Jakob
16

Galaretka , 4 bajty

gf|S

Wypróbuj online!

Jak to działa

gf|S  Main link. Left argument: x. Right argument: y.

g     Compute a, the gcd of x and y.
  |   Compute b, the bitwise OR of x and y.
 f    Filter; yield all common elements of [a] and [b].
   S  Take the sum.
Dennis
źródło
10

APL (Dyalog) , 5 bajtów

⌈×∧=⌊

Wypróbuj online!

Przydatne odniesienie

∧=⌊: Zwraca, 1jeśli najniższa wspólna wielokrotność jest równa minimum. Jest to prawdą tylko wtedy, gdy jedna z wartości wynosi zero lub obie są równe. Alternatywnie mogłem=*⌊

⌈×: Maksimum pomnożone przez powyższe.

H.PWiz
źródło
7

Język programowania Szekspira , 296 bajtów

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

Wypróbuj online!

Pierwszy udział w konkursie golfa, więc zacznijmy od jednego z moich ulubionych języków żartów!

Objaśnienie: Deklaracja dwóch zmiennych Ford i Ajax (dostępne najkrótsze nazwy zmiennych)

Z.Ford,.Ajax,.

Pierwsza scena: Wstaw dwie wartości do zmiennej, następnie przetestuj je pod kątem równości, a następnie przetestuj Ajax względem 0. Jeśli wartość, którą musimy zwrócić, jest zapisana w zmiennej Ford, przejdź do sceny C.

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

Jeśli Ford ma wartość 0, wypisz Ajax, w przeciwnym razie ustaw Ajax na 0, a następnie wypisz Ajax. Następnie przejdź do końca programu.

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

Scena C: Wydrukuj Forda

Scene C:.
Ajax:open heart.

Scena V: Koniec programu.

Scene V:.
[Exeunt]
Guillaume Ruchot
źródło
221 bajtów
Jo King
2
@JoKing Twoja wersja jest niezaprzeczalnie lepsza niż moja, myślę, że byłoby lepiej, gdybyś opublikował ją jako odpowiedź, ponieważ uzasadnienie programu jest zupełnie inne i nie chcę przypisywać sobie uznania za twoją pracę
Guillaume Ruchot
6

Ruby , 21 bajtów

->a,b{(a|b)*531[a*b]}

Wypróbuj online!

Ponieważ Ruby

Krótkie wyjaśnienie:

  • a|b jest bitwse LUB, więc daje nam odpowiednią liczbę, jeśli a == b lub jeden z nich jest równy zero.

  • Magiczna liczba 531to 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, a operator [] wyodrębnia jeden bit. Oznacza to: pomnóż przez 1, jeśli a * b wynosi 0, 1, 2, 4 lub 9, pomnóż w przeciwnym razie 0.

  • To nie zadziała dla wartości> 3
GB
źródło
5

Pyth , 8 7 bajtów

@{+0SQ3

Wypróbuj online!

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

Przypadek 1 - Obie wartości są niezerowe i równe

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

Przypadek 2 - Obie wartości są niezerowe i nierówne

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

Przypadek 3 - Dokładnie jedna wartość zero

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

Przypadek 4 - obie wartości zero

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

Alternatywne rozwiązanie, również 7 bajtów

*eSQ}s{

Wypróbuj online

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

Poprzednia wersja, 8 bajtów

@+0{-QZ3
Sok
źródło
@xnor Dzięki za wykrycie tego, należy to teraz naprawić
Sok
@{+0Q3działa na 6 bajtów.
Pan Xcoder
4

Stax , 8 bajtów

Ç∞∟∙◄╥*♣

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

Uruchom ten

rekurencyjny
źródło
4

(pierwsze zgłoszenie, więc proszę nie kopać zbyt mocno)

Python 2 , 57 44 43 bajty

lambda a,b:(0 if a*b else a+b)if a-b else a

Wypróbuj online!

(nieco skompresowany po spojrzeniu na pierwszą odpowiedź pytona )

18 października jest dniem ciszy na SE
źródło
33 bajty
Jo King
Przekreślone 44 to wciąż 44; (
Jo King
@JoKing huh wut? Twoje rozwiązanie jest świetne, próbowałem zrobić to z arytmetyką, ale zawiodłem i powróciłem do if / else
października jest dniem ciszy w
4

C (gcc), 25 bajtów

f(a,b){a=a^b&&a*b?0:a|b;}

pseudo kod:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`
Geo
źródło
3

C (gcc), 26 bajtów

f(a,b){a=a*b?a-b?0:a:a+b;}

Wypróbuj online!

Expanation / Ungolfed:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}
pizzapanty184
źródło
3

MATL , 9 bajtów

dGp*~GX>*

Wypróbuj online!

Wyjaśnienie:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output
Stewie Griffin
źródło
Nieudany outgolf:t?td~*]X>
zegar słoneczny
3

GNU sed, 23 bajty

s/^0?(.)\1?0?$/\1/
t
c0

(musi być uruchamiany z -rflagą)

Wypróbuj online!

KernelPanic
źródło
1
Witamy w PPCG :) Obecny konsensus jest taki, że flagi nie są liczone (jestem na telefonie, więc nie mogę połączyć odpowiednich Meta).
Kudłaty
1
Fajnie! Będę edytować później, ponieważ jestem również na telefonie; wolne -3 bajty to wspaniałe powitanie w PPCG :)
KernelPanic
3

QBasic, 34 bajty

Odmienne podejście!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

Zauważ, że niezerowe wartości w siatce wyjściowej są bitami ORdwóch liczb wejściowych. To jest po prostu a OR bw QBasic. Chcemy wyprowadzić tę wartość, kiedy a*b=0 OR a=bi gdzie 0indziej, co możemy zrobić, mnożąc przez minus powyższego warunku (ujemny, ponieważ prawda jest -1w QBasic).

DLosc
źródło
2

pieprzenie mózgu, 25 bajtów

,>,[>]<<[[->->+<<]>[>]]>.

Dane wejściowe to dwie bajty (nie ascii)

KSab
źródło
2

Szybki , 118 bajtów

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}
onnoweb
źródło
4
Witamy w PPCG! Nie znam Swift, ale prawdopodobnie możesz zaoszczędzić wiele bajtów, tworząc nazwy zmiennych po 1 znak i usuwając spacje wokół operatorów takich jak !=i trójskładnikowy.
tragiczny
1
Cześć, witamy w PPCG! Jak wspomniano przez @ Οurous, możesz zmieniać n1i n2do pojedynczych znaków, aby je skracać; usuń białe spacje i nawiasy oraz usuń niektóre spacje. Ponadto ==0może być <1i !=0może być >0, ponieważ wiemy, że tylko dane wejściowe 0,1,2,3są możliwe. Nigdy wcześniej nie programowałem w Swift, ale zmniejszyłem go do 91 bajtów w ten sposób: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Wypróbuj online.
Kevin Cruijssen
Ponadto wydaje się, że można go skrócić do 51 bajtów w następujący sposób: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Wypróbuj online. Ponownie witamy w PPCG i życzymy udanego pobytu!
Kevin Cruijssen
1
Oprócz golfów @ KevinCruijssen możesz zmienić swoje zgłoszenie w anonimowe zamknięcie, aby zaoszczędzić 87 bajtów: {$0==$1||1>$0*$1 ?max($0,$1):0} Wypróbuj online!
Pan Xcoder,
2

Partia, 38 36 35 30 bajtów

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

Port odpowiedzi Pythona @ Dennisa, ponieważ warunki warunkowe są w Batch za drogie.

Neil
źródło
2

J , 8 7 bajtów

1 bajt zapisany przez H.PWiz.

>.*=^<.

Wypróbuj online!

Port AJ rozwiązania APL H.PWiz

=czy liczby są równe? (wyniki w 1 lub 0)

^ do potęgi

<. mniejsza liczba

* pomnożone przez

>. większa liczba

Galen Iwanow
źródło
1
>.*=^<.na 7 bajtów
H.PWiz
@ H.PWiz Dziękujemy! Sprytne użycie =i ^!
Galen Iwanow
2

05AB1E , 9 8 bajtów

àIËIP_+*

-1 bajt dzięki @MagicOctopusUrn .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

Ogólne wyjaśnienie:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0
Kevin Cruijssen
źródło
Ës0å~iZë0był mój; niezłe. Nie jestem pewien, czy uda ci się pokonać 9 bajtów.
Magic Octopus Urn
1
Cofam to, à®Ë®P_+*gdzie _jest logicznie równoważne z
Magic Octopus Urn
_zamienia 0 w 1, wszystkie inne wartości w 0.
Magiczna ośmiornica Urn
@MagicOctopusUrn Thanks! Kiedy udzieliłem tej odpowiedzi, patrzyłem na dokumenty, aby zobaczyć, czy istnieje == 0polecenie, ale nie wiedziałem _, że robi to dokładnie. Powinien być przydatny również w przypadku innych wyzwań w przyszłości. TIL :)
Kevin Cruijssen
2

JavaScript, 35 bajtów

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0
David
źródło
2

JavaScript ES6, 25 22 21 20 bajtów

a=>b=>a?b-a?!b*a:a:b

14 13 bajtów , jeśli argumenty podano w posortowanej kolejności

a=>b=>a%b?0:b
MattH
źródło
2

QBasic, 38 36 35 bajtów

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

Częściowo inspirowane przez Erika IF ... THEN ... ELSEodpowiedź , oto rozwiązanie tylko matematyka.

Jak się tu dostałem

Ważna uwaga dla zrozumienia matematyki z warunkami: w QBasic wyniki operatorów porównania są, 0a -1nie 0i 1.

Zaczynamy od kodu Erika:

IF a*b THEN?a*-(a=b)ELSE?a+b

Innymi słowy, jeśli ai boba są niezerowe, to wydrukuj a*-(a=b)( ajeśli a=binaczej 0); inny (przynajmniej jedna ai bwynosi zero), wyjście a+b(liczba różna od zera, lub 0jeśli są równe zeru).

Tutaj jest już trochę matematyki z warunkowymi. Zróbmy krok dalej i zobaczmy, czy możemy IFcałkowicie wyeliminować to stwierdzenie. Będziemy musieli zastosować a*b>0warunek zewnętrzny: a*bmoże mieć wiele różnych prawdziwych wartości, co jest w porządku, IFale powoduje problemy matematyczne.

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

Jest to standardowy trik z IF-elimination. Kiedy cjest prawdą, c*a*(a=b)jest -a*(a=b)i (c+1)*(a+b)jest 0; kiedy cjest fałszywe, c*a*(a=b)jest 0i (c+1)*(a+b)jest a+b. To wyrażenie daje takie same wyniki jak IF ... THEN ... ELSE. Jedynym problemem jest to, że nasz program ma 40 bajtów zamiast 38. Być może możemy go skrócić, zmieniając układ matematyki.

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

Nadal 40 bajtów ...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

Teraz nasz program powrócił do 38 bajtów. Ale ponieważ używamy tylko craz, nie musimy już przypisywać jej do zmiennej:

?(a*b>0)*(a+b+a*(a=b))+a+b

Teraz mamy do 36 bajtów.

Ale poczekaj, jest więcej ... To a+b+a*(a=b)wyrażenie wygląda na zbędne. a*(a=b)jest -ajeśli a=bi 0inaczej. Kiedy go dodamy a, otrzymamy, 0czy a=bi ainaczej. Może uda nam się osiągnąć to samo w mniejszej liczbie bajtów, odwracając warunek.

b+a*-(a<>b)

Na początku nie wygląda to krócej. Ale możemy zapisać bajt, odejmując zamiast dodawać wartość ujemną:

b-a*(a<>b)

I oto nasze 35-bajtowe rozwiązanie.

DLosc
źródło
Niezła sztuczka tam ...
Erik the Outgolfer,
1

Czysty , 46 43 42 bajtów

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

Wypróbuj online!

Anonimowa kompozycja :: [Int] -> Int, sortuje parę, a następnie dopasowuje pierwszego członka.

Wykonanie go jako złożonej lambdy ma tę samą długość:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort
Obrzydliwe
źródło
1

Galaretka , 7 6 bajtów

׬o=a»

Wypróbuj online! lub Wypróbuj wszystkie kombinacje!

W jaki sposób?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

Stosując metodę z odpowiedzi APL , otrzymujemy taką samą liczbę bajtów. Jeden bajt dłuższy niż ta odpowiedź, ponieważ najniższa wspólna wielokrotność to dwa bajty.

6 bajtów

«=æl×»

Wypróbuj online!

dylnan
źródło
Zwracam również uwagę na alternatywną metodę poniżej
H.PWiz
@ H.PWiz Oh, myślałem, że używasz tej samej metody, co w linku
dylnan
Podaję dwie metody ∧=⌊i =*⌊. Drugi z nich jest preferowany przez Jelly
H.PWiz
@ H.PWiz Nie mówię APL, po prostu użyłem opisanej przez ciebie metody. Co ma =*⌊zrobić?
dylnan
Jest prawie taki sam jak galaretka, tyle że jest to minimum. Lub można użyć ×w obu językach
H.PWiz