Di quanti elfi ha bisogno per consegnare regali a Babbo Natale?


23

Babbo Natale ha bisogno di aiuto per determinare di quanti elfi avrà bisogno per aiutarlo a consegnare regali in ogni casa.

Il carbone è considerevolmente più pesante dei regali, quindi Babbo Natale avrà bisogno di tre elfi per ogni persona cattiva nella casa. Sono necessari solo due elfi per aiutare Babbo Natale a portare regali.

Sulla mappa di Babbo Natale, una casa è rappresentata da un *, e ogni casa è divisa da un +.

Ci sarà un numero su entrambi i lati della casa - quello a sinistra che rappresenta il numero di persone cattive nella casa e quello a destra che rappresenta il numero di persone simpatiche nella casa. Se non c'è un numero su un lato, viene interpretato come uno 0.

Babbo Natale non visita coloro che non sono nello spirito natalizio (non meritano nemmeno il carbone), quindi a volte una casa potrebbe non avere un numero su entrambi i lati. In questo caso, Babbo Natale non ha bisogno dell'aiuto di nessun elfo

Ad esempio, una delle mappe di Babbo Natale potrebbe apparire così

1*3+2*2+1*+*2

Nella prima casa ci sono 1 cattivo e 3 simpatici, Babbo Natale avrà bisogno di nove elfi. Nel secondo, ci sono 2 cattivi e 2 simpatici, Babbo avrà bisogno di dieci elfi. Nella terza casa ci sono 1 cattivo e 0 simpatici, Babbo Natale avrà bisogno di tre elfi, e nell'ultima casa ci sono 0 cattivi e 2 simpatici, Babbo Natale avrà bisogno di quattro elfi.

Questa è una versione troppo semplificata di una delle mappe di Babbo Natale, però. Normalmente, le mappe di Babbo Natale hanno più linee e sono di forma quadrata per adattarsi meglio alla sua lista. Una mappa normale potrebbe assomigliare a questa ( \na alla fine di ogni riga)

1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

In questa mappa, Babbo Natale ha bisogno ((1 + 0 + 0 + 1 + 2 + 3 + 1 + 0 + 0 + 0 + 4 + 1 + 0 + 0 + 1 + 2 + 3 + 2 + 0 + 0) * 3) + ((2 + 0 + 4 + 0 + 4 + 0 + 6 + 0 + 0 + 0 + 2 + 1 + 4 + 3 + 0 + 3 + 10 + 0 + 5 + 0) * 2)= 151 elfi

Sfida

Aiuta Babbo Natale a determinare di quanti elfi ha bisogno per consegnare merci in ogni casa!

case

  • Una casa è rappresentata da a *
  • Le case sono divise per +
  • Il numero a sinistra della casa simboleggia il numero di persone cattive (nessun numero significa 0)
  • Il numero a destra simboleggia il numero di persone simpatiche (nessun numero significa 0)
  • Potrebbero esserci newline ( \n) nell'input, che dovrebbe anche essere gestito come una divisione

Elfi

  • Babbo Natale ha bisogno dell'aiuto di tre elfi per i cattivi (il carbone è molto più pesante dei regali)
  • Babbo Natale ha bisogno dell'aiuto di due elfi per gente simpatica
  • Se non ci sono numeri su entrambi i lati, Babbo Natale non visiterà quella casa e quindi non avrà bisogno di elfi

Cosa fare

Stampa il numero di elfi di cui Santa ha bisogno per aiutarlo a consegnare regali alle case. Poiché tutto ciò che Babbo Natale deve sapere è quanti elfi portare, devi solo stampare il numero aggiunto di elfi di cui ha bisogno per l'elenco delle case

Casi test

1*1 => 5
1*2 => 7
2*1 => 8
1* => 3
*1 => 2
* => 0

1*1+1*1 => 10
1*2+2*1 => 15
1*+*1 => 5
1*1+*+1*1 => 10
*+*+*+* => 0

Regole

  • L'input può essere preso come argomento in una funzione oppure da STDIN o equivalente
  • L'output può essere il valore di ritorno di una funzione oppure può essere stampato su STDOUT o equivalente
  • L'ingresso conterrà solo numeri, +, *, e ritorni a capo\n
  • L'output dovrebbe essere solo il numero totale di elfi che Babbo Natale ha bisogno di aiuto per consegnare a Natale
  • Si applicano scappatoie standard

punteggio

La slitta di Babbo Natale è piena di regali che gli danno meno spazio per eseguire il codice, quindi ha bisogno del codice più corto che può ottenere (non preoccuparti se questo non ha senso. Se metti in discussione la logica di Babbo Natale finirai sulla lista dei cattivi ). Grazie al CORRETTO ragionamento di Babbo Natale , vince l'invio più breve in byte!

Classifica

Questo è un frammento di stack che genera sia una classifica che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, inizia la tua risposta con un titolo usando il seguente modello Markdown

## Language Name, N bytes

Dove N è la dimensione, in byte, dell'invio

Se vuoi includere più numeri nella tua intestazione (ad esempio, colpendo i vecchi punteggi o includendo i flag nel conteggio dei byte), assicurati solo che il punteggio effettivo sia l' ultimo numero nella tua intestazione

## Language Name, <s>K</s> X + 2 = N bytes


1
Mi chiedo, dato che Babbo Natale si fermerà in qualsiasi casa, non avrebbe solo bisogno di un massimo di max(naughty) + max(nice)elfi per l'intero percorso? Pensavo che avesse un gruppo di elfi che volano con lui, ma forse hai informazioni privilegiate su questo e devo guardare più da vicino quest'anno. :)
inserireusernamehere

8
@inserireusernamequi Attualmente lavoro presso Santa Inc. e posso dirti che la nostra infrastruttura funziona in modo fortemente asincrono. Non vuole che le sue risorse muoiano di fame, quindi assegniamo tutti i lavoratori necessari. Nel caso avessimo bisogno di un ELF extra, possiamo compilarne uno in pochi secondi hello-world.c. Gli elfi operai sono assegnati con impazienza agli obiettivi come ha detto Jojodmo (sono sicuro di conoscere Jojodmo, deve essere il nostro sistema) e quindi utilizzare un callback per avvisare quando è il momento di essere reinseriti nella piscina di slitte o quando un bambino li ha visti.
Stefano Sanfilippo,

2
@StefanoSanfilippo Ah, capisco. Grazie per tutte le informazioni dettagliate su queste informazioni classificate. E buon Natale. :)
inserireusernamehere

Questo ha perfettamente senso. Babbo Natale ha bisogno del codice più breve perché stampa ogni carattere del codice con una stampante e poi li mette sulla sua slitta prima di eseguirli.
A̲̲

Risposte:


2

Pyth, 21 byte

ssMs*VCcR\*scR\+.z_S3

Esempio multilinea

Suite di test a linea singola

ssMs*VCcR\*scR\+.z_S3
                .z        Take a input, as a list of lines.
            cR\+          Chop each line on '+'.
           s              Flatten into list of strings.
       cR\*               Chop each line on '*'.
      C                   Transpose, into a list of naughty and nice.
    *V            _S3     Vectorized multiplication with [3, 2, 1]. This replicates
                          the naughty list 3 times and the nice list 2 times.
   s                      Flatten.
 sM                       Convert each string to an int.
s                         Sum.

Scherzi a parte ... c'è qualcosa che Pyth non può fare in meno di 30 byte?
Jojodmo,

2
@Jojodmo Non se posso farne a meno ...
isaacg,

13

JavaScript (ES6), 52 byte

s=>eval(s.replace(/\D|$/g,m=>`.0*${m=="*"?3:2}+`)+0)

Spiegazione

Converte l'input in un'istruzione JavaScript valida. Sostituisce tutti *con .0*3+e tutti gli altri simboli (non numerici) con .0*2+. Ad esempio 8*9+*10diventa 8.0*3+9.0*2+.0*3+10. Alla fine si aggiunge .0*2alla fine per l'ultimo bel conteggio. Questo funziona perché n.0= ne .0= 0.

s=>
  eval(                      // execute the formed equation
    s.replace(/\D|$/g,       // replace each symbol (and also add to the end) with:
      m=>`.0*${m=="*"?3:2}+` // case * = ".0*3+", else replace with ".0*2+"
    )
    +0                       // add "0" to the end for the trailing "+"
  )

Test


9
+1 per l' .0idea.
nimi

3

Flex + C, 112 90 byte

 m=3,t;
%%
[0-9]+ t+=m*atoi(yytext);
\* m=2;
[+\n] m=3;
%%
main(){yylex();printf("%d",t);}

Il primo personaggio è uno spazio. Compilare con:

flex -o santa.c santa.l
cc santa.c -o santa -ll

Legge da STDIN, scrive su STDOUT. L'ingresso è terminato da EOF (Ctrl + D nella console).


2

Mathematica, 70 byte

a=Tr[FromDigits/@StringExtract[#,"
"|"+"->;;,"*"->#2]]&;3#~a~1+2#~a~2&

Utilizza StringExtractper estrarre i singoli numeri.


2

CJam, 23 byte

q'+NerN/{'*/3*5<:~~}%1b

Provalo qui.

Spiegazione

q      e# Read all input.
'+Ner  e# Replaces all "+" with linefeeds.
N/     e# Split the string around linefeeds (i.e. into houses).
{      e# Map this block over the list of house...
  '*/  e#   Split the string around the "*".
  3*   e#   Repeat the times.
  5<   e#   Truncate to 5 elements, keeping 3 copies of the naughty number and 2 copies of
       e#   the nice number.
  :~   e#   Evaluate each number (which may be an empty string which pushes nothing).
  ~    e#   Dump the list of numbers on the stack.
}%
1b     e# Sum all the numbers.

2

Scherzi a parte, 38 30 byte

'*Ws`'0+'*@s'≈£M4rR*`MΣ+'+,WXX

Dump esadecimale:

272a57736027302b272a407327f79c4d3472522a604de42b272b2c575858

Questa nuova versione rompe l'interprete online, ma funziona bene localmente. Ecco un esempio:

$ python2 seriously.py -f elves.srs
1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

151

Spiegazione:

'*                              Push a "*" to make the stack truthy
  W                        W    Repeat while the top of stack is truthy
                                  (A whole bunch of instructions just turn the "*" into a
                                  zero on the first pass, so I'll list them here in the
                                  order they actually accomplish useful things:)
                          ,     Read in a line of input
   s                    '+      Split it on occurrence of "+"
    `               `M          Map this function over the list of strings.
     '0+                        Prepend a "0" to ensure a naughty number exists
        '*@s                    Split the string on "*"
            '≈£M                Map over the string with int() to convert it to int
                4rR             Push [3,2,1,0]
                   *            Dot product
                      Σ+        Sum all the houses, and add it to the results
                                  from the previous line of input
                            XX  Pop the "" and '+ from the stack, leaving only the
                                result to be implicitly output.

Vecchia versione:

'+ε'*`+'++,`╬Xs`≈`╗`'0+'*@s╜M[3,2]*`MΣ

Dump esadecimale:

272bee272a602b272b2b2c60ce587360f760bb6027302b272a4073bd4d5b332c325d2a604de4

Provalo online

Spiegazione:

  ε'*                                   Initialize with two strings so the first + works
     `+'++,`╬                           Read in strings and compile them until "" is read
             X                          Throw away the ""
'+            s                         Split on +
               `≈`╗                     Chuck int function into reg0 to use within function
                   `               `M   Map this function over the list of houses
                    '0+                 Prepend a "0" to ensure a naughty number exists
                       '*@s             Split on *
                           ╜M           Convert the resulting list to ints with stored func
                             [3,2]*     Dot product with [3,2]
                                     Σ  Sum all houses

Questo potrebbe essere più breve se ho appena convertito ciascuna riga separatamente e le ho sommate tutte alla fine. Ci penserò più tardi.


2

PowerShell, 52 byte

Utilizzando variazione del user81655 's .0trucco

$OFS='+';"$("$args"-replace'\*','.0*3+2*0'|iex)"|iex

Versione Ungolfed

$OFS='+' # Set Output Field Separator to '+'
         # So if $arr = 1,2,3 then "$arr" will output 1+2+3

" # Cast result of subexpression to string using $OFS

    $( # Subexpression

        "$args" # Input is an array of arguments. Casting it to string using "$args"
                # is shorter then acessing the first element using $args[0]
                # $OFS wouldn't affect this, because input has only 1 element.

        -replace '\*' , '.0*3+2*0' # Replace every * with .0*3+2*0
                                   # Example: 1*+*1 becomes 1.0*3+2*0+.0*3+2*01

    ) | Invoke-Expression # Execute a result of subexpression as PS code.
                          # This will execute resulting multiline string line-by line
                          # and return an array of values, e.g.: 18,38,21,29,45

" Cast the aray above to string using '+' as Output Field Separator, e.g: 18+38+21+29+45

| Invoke-Expression # Execute the string above as PS code to get final result.
                    # E.g.: 18+38+21+29+45 = 151

Esempio di utilizzo

$Map = @'
1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*
'@

PS > .\SantaMap.ps1 $Map
151

1

Swift 2, 283 211 byte

func f(s:String)->Int{var r=0;for p in(s.characters.split{$0=="\n"}.map(String.init)){for v in p.utf8.split(43){let k="0\(v)".utf8.split(42);r+=(Int("\(k[0])")!)*3;r+=(k.count<2 ?0:Int("\(k[1])")!)*2}};return r}

Questo può essere testato su SwiftStub, qui

Ungolfed

func f(s: String) -> Int{
    var r = 0

    //for every value in the input, split every "\n" and mapped
    //to a String array
    for p in (s.characters.split{$0=="\n"}.map(String.init)){

        //for every value in the split input, split again at every + (Decimal 43)
        for v in p.utf8.split(43){
            //change the value to "0" + v, which doesn't change the
            //input, but in the event that there is no input on the
            //left side, a "0" will be used
            //
            //then split on every * (Decimal 42)
            let k = "0\(v)".utf8.split(42)

           //add to the total count of elves the number on the left * 3
            r+=(Int("\(k[0])")!) * 3

            //add to the total count of elves the number on the left * 2
            r+=(k.count < 2 ? 0 : Int("\(k[1])")!) * 2
        }

        //return the number of elves
        return r
    }
}

1

Python 3, 141 114 112 byte

Accetta input multilinea in questo modo c("1*2+*+*4+1*\n2*4+3*+1*6+*\n*+*+4*2+1*1\n*4+*3+1*+2*3\n3*10+2*+*5+*")

lambda s:sum(a and(3-z)*int(a)or 0for j in s.split("\n")for i in j.split("+")for z,a in enumerate(i.split("*")))

Ungolfed:

def c(s):
    t = 0
    for j in s.split("\n"):
        for i in j.split("+"):
            for z,a in enumerate(i.split("*"))
                if a == "":
                    a = 0
                else:
                    a = int(a)
                t += (3-z) * a  # alternate a*3 and a*2
    return t

1

Sono super in ritardo, ma volevo comunque provarci.

Rubino , 84 55 byte

Ho trovato di nuovo questa domanda dopo tanti anni e stavo pensando a una nuova risposta prima di rendermi conto di aver già risposto prima. Ops! Comunque, ecco una risposta drasticamente migliorata.

->m{m.scan(/(\d*)\*(\d*)/).sum{|a,b|3*a.to_i+2*b.to_i}}

Provalo online!

Vecchia risposta a 84 byte da quando ho risposto per la prima volta 2 anni fa:

->m{m.split(/[+\n]/).map{|h|b,g=h.split(?*).map &:to_i
3*(b||0)+2*(g||0)}.inject :+}

Provalo online!


1

Python 3 , 96 byte

lambda s:sum(int('0'+n)*(3-i%2)for i,n in enumerate(re.sub('[*\s]','+',s).split('+')));import re

Provalo online!

101 byte senza regex

lambda s:sum(int('0'+n)*(3-i%2)for i,n in enumerate(s.replace('*','+').replace('\n','+').split('+')))

Provalo online!

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.