Unire due valori


44

Hai due valori ciascuno dei quali 0rappresenta "sconosciuto" o uno di 1,2,3. Uniscili in un unico valore come segue:

  • Se entrambi i valori sono diversi da zero e uguali, genera quel valore:
    (3,3) -> 3
  • Se entrambi i valori sono diversi da zero ma disuguali, restituisci 0 per sconosciuto:
    (1,2) -> 0
  • Se un valore è zero e l'altro no, genera il valore diverso da zero:
    (2,0) -> 2, (0,1) -> 1
  • Se entrambi i valori sono zero, output zero:
    (0,0) -> 0

Casi test:

Esistono 16 coppie di input possibili.

  | 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

Classifiche


8
La quarta regola si adatta alla prima regola, quindi non so perché le hai separate.
Fatalizza

1
Nitpick: il 4 ° punto è ridondante, puoi semplicemente rimuovere "diverso da zero" dal primo punto. EDIT: Wow, cos'è un ninja @Fatalize.
Erik the Outgolfer

Inoltre, 3 non è davvero necessario qui, sebbene aumenti il ​​numero di possibili input.
Erik the Outgolfer,

2
Ho considerato di condensare le regole, ma ho pensato che sarebbe stato più chiaro elencare tutti i casi zero / diversi da zero e lasciare l'ottimizzazione ai golfisti.
xnor

2
Questo ha bisogno di una classifica , la prima pagina sta iniziando a ottenere risposte già battute sulla seconda.
Ørjan Johansen,

Risposte:


22

Python 3 , 27 25 byte

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

Provalo online!


5
Mi piace che questo si interrompa per gli input superiori a 3. Come ti è venuto in mente questo?
Jakob,

4
Fondamentalmente un sacco di tentativi ed errori.
Dennis,

1
Interessante. Per un momento ho pensato di automatizzare una ricerca attraverso espressioni di lunghezza limitata che coinvolgono due ints e alcuni operatori, ma lo spazio è troppo grande anche a circa 20 byte. È richiesta un po 'di intelligenza!
Jakob,

16

Gelatina , 4 byte

gf|S

Provalo online!

Come funziona

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.

10

APL (Dyalog) , 5 byte

⌈×∧=⌊

Provalo online!

Riferimento utile

∧=⌊: Restituisce 1se il minimo comune multiplo è uguale al minimo. Questo è vero solo se uno dei valori è zero o entrambi sono uguali. In alternativa avrei potuto=*⌊

⌈×: Il massimo moltiplicato per quanto sopra.


7

Shakespeare Programming Language , 296 byte

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]

Provalo online!

Prima partecipazione a una sfida di code-golf, quindi cominciamo con una delle mie lingue di scherzo preferite!

Spiegazione: Dichiarazione delle due variabili Ford e Ajax (nomi delle variabili più brevi disponibili)

Z.Ford,.Ajax,.

Prima scena: inserisci i due valori nella variabile, quindi verifica l'uguaglianza, quindi verifica Ajax rispetto a 0. Se il valore che dobbiamo restituire è memorizzato nella variabile Ford, vai alla scena 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.

Se Ford è 0, stampa Ajax, altrimenti imposta Ajax su 0, quindi stampa Ajax. Quindi vai alla fine del programma.

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

Scena C: Stampa Ford

Scene C:.
Ajax:open heart.

Scena V: fine del programma.

Scene V:.
[Exeunt]


2
@JoKing la tua versione è innegabilmente migliore della mia, penso che sarebbe meglio se la pubblicassi come risposta poiché il ragionamento alla base del programma è abbastanza diverso e non voglio prendermi il merito per il tuo lavoro
Guillaume Ruchot,

6

Rubino , 21 byte

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

Provalo online!

Perché Ruby

Breve spiegazione:

  • a|b è bitwse OR, quindi ci dà il numero giusto se a == b o uno di questi è zero.

  • Il numero magico 531è 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0 e l'operatore [] estrae un singolo bit. Questo significa: moltiplicare per 1 se a * b è 0, 1, 2, 4 o 9, moltiplicare per 0 altrimenti.

  • Questo non funzionerà per valori> 3



5

Pyth , 8 7 byte

@{+0SQ3

Provalo online!

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

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

Caso 1 - Entrambi i valori diversi da zero e uguale

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

Caso 2 - Entrambi i valori diversi da zero e disuguale

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

Caso 3 - Esattamente un valore zero

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

Caso 4 - Entrambi i valori zero

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

Soluzione alternativa, anche 7 byte

*eSQ}s{

Provalo 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) 

Versione precedente, 8 byte

@+0{-QZ3

@xnor Grazie per avvistare questo, è necessario fissare ora
Sok

@{+0Q3funziona per 6 byte.
Mr. Xcoder,


4

Stax , 8 byte

Ç∞∟∙◄╥*♣

Esegui ed esegui il debug

Disimballato, non golfato e commentato, sembra così.

    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

Esegui questo




4

C (gcc), 25 byte

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

pseudo-codice:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`

3

C (gcc), 26 byte

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

Provalo 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 
    ;
}

3

MATL , 9 byte

dGp*~GX>*

Provalo online!

Spiegazione:

           % 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


3

GNU sed, 23 byte

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

(deve essere eseguito con -rflag)

Provalo online!


1
Benvenuti in PPCG :) Il consenso attuale è che i flag non vengono conteggiati (sono sul mio telefono, quindi non riesco a collegare la Meta pertinente).
Shaggy,

1
Oh fico! Modificherò più tardi dato che sono anche sul mio telefono; a -3 byte gratuiti è un grande benvenuto in PPCG :)
KernelPanic,

3

QBasic, 34 byte

Approccio diverso!

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

Si noti che i valori diversi da zero nella griglia di output sono tutti bit a bit ORdei due numeri di input. Questo è solo a OR bin QBasic. Vogliamo generare questo valore quando a*b=0 OR a=b, e 0altrimenti, cosa che possiamo fare moltiplicando per il negativo del suddetto condizionale (negativo, poiché la verità è -1in QBasic).


2

Brainfuck, 25 byte

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

L'input ha due valori di byte (non ascii)


2

Rapido , 118 byte

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}

4
Benvenuti in PPCG! Non conosco Swift, ma probabilmente puoi salvare molti byte rendendo i nomi delle variabili di 1 carattere ciascuno e rimuovendo gli spazi bianchi attorno agli operatori come !=e il ternario.
Οuroso

1
Ciao, benvenuto in PPCG! Come accennato da @ Οurous, è possibile modificare n1e n2singoli caratteri per accorciarli; rimuovere alcuni spazi bianchi e parentesi e rimuovere alcuni spazi. Inoltre, ==0può essere <1e !=0può essere >0, poiché sappiamo che 0,1,2,3sono possibili solo gli input . Non avevo mai programmato nemmeno in Swift prima, ma l'ho ottenuto fino a 91 byte in questo modo: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} provalo online.
Kevin Cruijssen,

Inoltre, sembra che tu possa accorciarlo a 51 byte in questo modo: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} provalo online. Benvenuto a PPCG, e goditi il ​​tuo soggiorno!
Kevin Cruijssen,

1
Oltre ai golf di @ KevinCruijssen, puoi trasformare il tuo invio in una chiusura anonima per salvare 87 byte: {$0==$1||1>$0*$1 ?max($0,$1):0} provalo online!
Mr. Xcoder,

2

Lotto, 38 36 35 30 byte

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

La risposta di Port of @ Dennis Python, poiché i condizionali sono troppo costosi in Batch.



2

J , 8 7 byte

1 byte salvato da H.PWiz.

>.*=^<.

Provalo online!

AJ port della soluzione APL di H.PWiz

=i numeri sono uguali? (risultati in 1 o 0)

^ al potere di

<. il numero più piccolo

* moltiplicato per

>. il numero più grande


1
>.*=^<.per 7 byte
H.Piz,

@ H.PWiz Grazie! Uso intelligente di =e ^!
Galen Ivanov,

2

05AB1E , 9 8 byte

àIËIP_+*

-1 byte grazie a @MagicOctopusUrn .

Provalo online o verifica tutti i casi di test .

Spiegazione:

à         # 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

Spiegazione generalizzata:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0

Ës0å~iZë0era mio; Ben fatto. In realtà non sei sicuro di poter battere di 9 byte di molto.
Magic Octopus Urn

1
Riprendo à®Ë®P_+*dove _è logicamente equivalente a
Magic Octopus Urn

_trasforma 0 in 1, tutti gli altri valori in 0.
Magic Octopus Urn

@MagicOctopusUrn Grazie! Quando ho fatto questa risposta stavo guardando i documenti per vedere se c'era un == 0comando, non sapevo che lo facesse _esattamente. Dovrebbe essere utile anche per altre sfide in futuro. TIL. :)
Kevin Cruijssen,

2

Javascript, 35 byte

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0


2

Javascript ES6, 25 22 21 20 byte

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

14 13 byte , se gli argomenti sono forniti in ordine

a=>b=>a%b?0:b


2

QBasic, 38 36 35 byte

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

In parte ispirato dalla risposta di ErikIF ... THEN ... ELSE , ecco una soluzione solo matematica.

Come sono arrivato qui

Nota importante per la comprensione della matematica con i condizionali: in QBasic, i risultati degli operatori di confronto sono 0e -1, non 0e 1.

Iniziamo con il codice di Erik:

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

In altre parole, se ae bsono entrambi diversi da zero, quindi stampare a*-(a=b)( aif a=b, altrimenti 0); else (almeno uno di ae bè zero), output a+b(il numero diverso da zero, o 0se sono entrambi zero).

C'è già un po 'di matematica con i condizionali in corso qui. Facciamo un passo avanti e vediamo se possiamo eliminare completamente l' IFaffermazione. Dovremo usare a*b>0per la condizione esterna: a*bpuò avere più valori di verità diversi, il che va bene IFma causa problemi per la matematica.

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

Questo è il trucco standard di IF-eliminazione. Quando cè vero, c*a*(a=b)è -a*(a=b)ed (c+1)*(a+b)è 0; quando cè falso, c*a*(a=b)è 0ed (c+1)*(a+b)è a+b. Quindi questa espressione dà gli stessi risultati di IF ... THEN ... ELSE. L'unico problema è che rende il nostro programma 40 byte anziché 38. Forse possiamo accorciarlo riorganizzando la matematica.

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

Ancora 40 byte ...

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

Ora il nostro programma è tornato a 38 byte. Ma poiché stiamo usando solo cuna volta, non dobbiamo più assegnarlo a una variabile:

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

Ora siamo scesi a 36 byte.

Ma aspetta, c'è di più ... Quell'espressione a+b+a*(a=b)sembra un po 'ridondante. a*(a=b)è -ase a=be 0altrimenti. Quando lo aggiungiamo a a, otteniamo 0se a=be aaltrimenti. Forse possiamo ottenere la stessa cosa in meno byte, invertendo la condizione.

b+a*-(a<>b)

All'inizio, questo non sembra più breve. Ma possiamo salvare un byte sottraendo invece di aggiungere un negativo:

b-a*(a<>b)

E lì abbiamo la nostra soluzione a 35 byte.


Bel trucco laggiù ...
Erik the Outgolfer,

1

Pulito , 46 43 42 byte

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

?o sort

Provalo online!

Composizione anonima :: [Int] -> Int, ordina la coppia e quindi abbina il primo membro.

Farlo come un lambda composto ha la stessa lunghezza:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort

1

Gelatina , 7 6 byte

׬o=a»

Provalo online! oppure prova tutte le combinazioni!

Come?

׬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.

Usando il metodo nella risposta APL , otteniamo lo stesso numero di byte. Un byte più lungo di quella risposta perché il minimo comune multiplo è di due byte.

6 byte

«=æl×»

Provalo online!


Noto anche un metodo alternativo di seguito
H.Piz,

@ H.PWiz Oh, pensavo che stessi usando lo stesso metodo di quello nel link
dylnan

Do due metodi ∧=⌊e =*⌊. Il secondo è preferito da Jelly
H.Pwiz,

@ H.PWiz Non parlo APL, stavo solo usando il metodo che hai descritto. Cosa fa =*⌊?
dylnan,

È praticamente lo stesso di Jelly, tranne che è minimo. Oppure si potrebbe usare ×in entrambe le lingue
H.Piz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.