Dodawanie-odejmowanie liczb w ciągu ciągu

14

Weź ciąg jako dane wejściowe i wykonaj dodawanie / odejmowanie wszystkich cyfr w ciągu i wyprowadzaj w wyniku sumę tych operacji.

Zasady

  • Cyfry w ciągu są odczytywane od lewej do prawej
  • Jeśli cyfra (n) jest nieparzysta, wykonaj dodawanie z następną cyfrą (n + n1)
  • Jeśli cyfra (n) jest parzysta, wykonaj odejmowanie od następnej cyfry (n - n1)
  • Jeśli osiągnąłeś ostatnią cyfrę w ciągu, wykonaj operację z pierwszą cyfrą w ciągu
  • Dane wyjściowe będą sumą wszystkich uzyskanych wartości
  • Jeśli w ciągu znajduje się tylko jedna cyfra, wykonaj operację samodzielnie (n + n lub nn)
  • Jeśli w ciągu nie ma cyfr, wynikiem jest 0

Przykład

Input: r5e6o9mm!/3708dvc    
Process: (5+6) + (6-9) + (9+3) + (3+7) + (7+0) + (0-8) + (8-5)
Output: 32

Notatki

  • Akceptowana jest albo funkcja, albo pełny program
  • Maksymalna długość wejściowa będzie zależeć od limitu wprowadzania języka przez Twój język
  • Brak ograniczeń wprowadzania znaków, ale tylko cyfry o połowie szerokości liczą się do wyniku
  • Wygrywa najmniej bajtów
Noir Antares
źródło
4
Przydałoby się
2
Polecam dodać przypadek testowy zakończony nieparzystą cyfrą.
Arnauld,
3
Sugerowana testcase: "", "0","1"
TSH
1
Czy możemy traktować dane wejściowe jako tablicę znaków zamiast ciągu? (Julia dokonuje rozróżnienia między tymi dwoma).
Sundar - Przywróć Monikę
4
@sundar Obecny konsensus jest taki, że ciąg znaków jest definiowany jako ciąg znaków. Rozumiem, że tablice znaków są zatem domyślnie dozwolone, nawet jeśli twój język ma rodzimy typ łańcucha .
Arnauld,

Odpowiedzi:

6

Galaretka , 17 15 12 bajtów

fØDV€ḂT‘ịƲSḤ

Wypróbuj online!

Wypróbuj przypadki testowe.

Program przechowuje tylko cyfry następujące po nieparzystej cyfrze, a następnie oblicza dwukrotnie sumę.

fØDV€ḂT‘ịƲSḤ   
f                   Remove anything that isn't...
 ØD                 a digit.
   V€               Cast each digit to an integer
         Ʋ          Monad:
     Ḃ              Parity of each digit.
      T             Indices of truthy elements (odd digits).
       ‘            Increment.
        ị           Index into list of digits.
                    Wraps to beginning and if there are no digits this returns 0.
          S         Sum.
           Ḥ        Double.
dylnan
źródło
3

K (oK) , 47 43 40 31 bajtów

Rozwiązanie:

{+/(1_x,*x)*2*2!x^:(x-:48)^!10}

Wypróbuj online!

Wyjaśnienie:

Usuń wszystko z łańcucha, który nie jest liczbą (jednocześnie konwertując), modulo 2, pomnóż przez 2, pomnóż za pomocą x obróconego o 1 i zsumuj.

{+/(1_x,*x)*2*2!x^:(x-:48)^!10} / solution
{                             } / lambda taking implicit x
                           !10  / range 0..10
                          ^     / except
                   (     )      / do this together
                    x-:48       / subtract 48 from x (type fudging char ascii value -> ints), save back into x
                x^:             / x except right, and save back to x
              2!                / modulo 2
            2*                  / multiply by 2
           *                    / multiply by
   (      )                     / do this together
        *x                      / first element of x
       ,                        / append to
      x                         / x
    1_                          / drop first (ie rotate everything by 1)
 +/                             / sum, add (+) over (/)

Naiwne rozwiązanie:

Usuń wszystko z ciągu, który nie jest liczbą (jednocześnie konwertując), weź 2-elementowe okno przesuwne, dowiedz się, czy są nieparzyste, czy parzyste, zastosuj odpowiednio dodawanie / odejmowanie, a następnie podsumuj.

{+/((-;+)2!x).'2':(1+#x)#x^:(x-:48)^!10}

Wypróbuj online!

Uwagi:

  • -4 bajty dzięki @ngn dzięki inteligentnemu sposobowi filtrowania danych wejściowych
  • -3 bajty przy użyciu przesuwanego okna zamiast przekształcania
  • -9 bajtów przenoszących rozwiązanie ngn (podejście nie naiwne)
streetster
źródło
1
x:48!x@&x in,/$!10->x^:(x-:48)^!10
ngn
Napisałem rozwiązanie w q / kdb +, a następnie przeniesione do ok ... może być w stanie wycisnąć jeszcze kilka bajtów z tego!
streetster,
1
Zamieściłem osobną odpowiedź w ngn / k, zachęcamy do zgłaszania pomysłów. Myślę, że ok będzie najkrótszy, ponieważ mój parser to w tej chwili śmieci - nie analizuje poprawnie zmodyfikowanego przypisania. Nawiasem mówiąc, nie byłem świadomy, ':że to „przesuwane okno” - interesujące.
ngn
Wygląda na to, że dobrze znasz k. Jeśli kiedykolwiek masz ochotę dyskutować o programowaniu wektorowym z osobami o podobnych poglądach lub po prostu obserwować, jak reszta z nas się kłóci - mamy ten czat . Większość żartów dotyczy APL, ale K i J również są na ten temat.
ngn
2

Perl 6 , 41 bajtów

{2*sum rotate($!=.comb(/\d/))Z*(@$! X%2)}

Wypróbuj online!

Używa tej samej logiki, co odpowiedź Dylnan's Jelly . Suma obejmuje tylko cyfry następujące po liczbie nieparzystej, a następnie mnożone przez 2.

Jo King
źródło
2

PowerShell, 80 78 76 bajtów

($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s

-2 bajty dzięki Neilowi z rozwiązaniem Retina

-2 bajty dzięki AdmBorkBork

Skrypt testowy:

$f = {
($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s
}

&$f 'r5e6o9mm!/3708dvc'

Wyjaśnienie

Po pierwsze: można dodać 2 * n, jeśli poprzednia cyfra jest nieparzysta, i 0, jeśli poprzednia cyfra jest parzysta.

($d="$args"-split'\D*'-ne'')+ # let $d is array contains digits only, each element is a digit
$d[0]|                        # apend first digit to the end of the array
?{                            # where for each digit
    $p-match'[13579]'         # predicate is 'previous digit is odd' (it is false on the first iteration because $p is null)
    $p=$_                     # let previous digit is current
}|
%{                            # for each digit matched to the predicate
    $s+=2*$_                  # add current digit multiply 2 to $s. 
}
$s                            # return sum

Dodatkowe 99 bajtów

Zainspirowany przez @Neil. Ponowne dopasowanie tylko cyfr „poprzednia cyfra jest nieparzysta”. Matchesjest zmienną automatyczną .

param($d)$d+($d-match'\d')+$Matches[0]|sls '(?<=[13579]\D*)\d'-a|%{$_.Matches.Value|%{$s+=2*$_}};$s
mazzy
źródło
1
Zapisz zamianę bajtów |?{$_}na -ne''inną i przenieś ją $d="$args"-split'\D*'-ne''do parens, takich jak ($d="$args"-split'\D*'-ne'')+$d[0].
AdmBorkBork
2

MATL , 18 17 bajtów

t4Y2m)!Ut1YSof)sE

Wypróbuj online!

(-1 bajt dzięki Luis Mendo / Giuseppe / oba!)

Wyjaśnienie:

     % Implicit input
 t   % duplicate input
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc']
 4Y2 % push inbuilt literal, characters '0':'9'
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc' '0123456789']
 m)  % extract only characters from input that belong to '0':'9'
     % stack: ['5693708']
 !U  % transpose and convert each value from string to number
     % stack: [5 6 9 3 7 0 8]
 t   % duplicate that
 1YS % circular shift by 1
     % stack: [[5 6 9 3 7 0 8] [8 5 6 9 3 7 0]]
 o   % parity check - 1 for odd, 0 for even
     % stack: [[5 6 9 3 7 0 8] [0 1 0 1 1 1 0]]
 f   % find non-zero value indices in last array
     % stack: [[5 6 9 3 7 0 8] [2 4 5 6]]
 )   % index at those places in the first array
 s   % sum
 E   % multiply by 2
     % (implicit) convert to string and display

Podstawową ideą jest to, że liczby następujące po liczbach parzystych można zignorować, podczas gdy liczby następujące po liczbach nieparzystych są podwojone - a końcowy wynik to suma tych podwójnych wartości.

Nie sądziłem, że fpo sprawdzeniu parzystości obędzie konieczne, ale z jakiegoś powodu MATL nie widzi tablicy zer i jedynek wynikających z otablicy logicznej, zamiast tego przyjmuje je jako indeksy liczbowe i indeksy w pozycjach 1i end.

sundar - Przywróć Monikę
źródło
Myślę, że możesz użyć !Uzamiast 48-. Wydaje się, że transpozycja nie wyrządza tutaj żadnej szkody. odla doublewejścia jest po prostu mod(...,2), więc wyjście jest double. Niezła NaNsztuczka wejściowa! Jeśli to ma rozwiązać problem z zewnętrznym wyjściem w STDOUT, Dennis wpadł na pomysł i prawdopodobnie to naprawi wkrótce
Luis Mendo
!Uzamiast48-
Giuseppe,
@LuisMendo welp, pobiłeś mnie do bicia!
Giuseppe,
@Giuseppe :-D :-D
Luis Mendo
Dziękuję obojgu, zredagowane. @LuisMendo Kiedy więc odaje logiczne wyjście tablicowe - a może nie? (Muszę wyznać, że nigdy tak naprawdę nie zaglądałem do systemu numerycznego MATLAB.) Tak, pomyślałem, że NaNbyłby dobrym wartownikiem, ponieważ jest mało prawdopodobne, aby był gdziekolwiek, ale dobrze wiedzieć, że nie będzie potrzebny na dłużej !
Sundar - Przywróć Monikę
2

K (ngn / k) , 33 bajty

{+/(1_x,*x)*2*2!x:-48+x^x^,/$!10}

Wypróbuj online!

{ } jest funkcją z argumentem x

!10 jest lista 0 1 ... 9

$ konwertować na ciągi

,/ powiązać

x^oznacza xbez tego, co jest po prawej stronie

x^x^oznacza xprzecięty z tym, co jest po prawej stronie, tzn. nie należy wprowadzać tylko cyfrx

-48+odejmij 48, który jest kodem ASCII z"0"

x: Przypisać do x

2! mod 2

2* pomnożone przez 2

1_x,*xjest jedna kropla: xpo której następuje pierwsza z x; tzn. xobrócony w lewo o jeden krok

+/ suma

ngn
źródło
2

Japt (v2.0a0), 25 19 bajtów

-6 bajtów dzięki Shaggy .

kè\D
íÈ°*2*Y°u}Ué)x

Wypróbuj tutaj .

Tym razem działa bez cyfr! Dane wejściowe to lista znaków.

LegionMammal978
źródło
19 bajtów , w tym przejście na Japt v2. xJednak niezadowolony z tablicy w funkcji. Zadzwoń do mnie na czacie, jeśli masz jakieś pytania.
Kudłaty
Czekaj, właśnie zauważyłem, że to nie zadziała, jeśli dane wejściowe nie zawierają żadnych cyfr.
Kudłaty
Ponadto, gdzie jest źródło v2.0a0, Shaggy? Nie mogę tego znaleźć w repozytorium.
LegionMammal978
To jest v1, a to jest v2.
Kudłaty
W przypadku, gdy przegapiłeś to na czacie, mam dla ciebie to 12 bajtów .
Kudłaty
2

05AB1E , 12 9 bajtów

Oszczędza 1 bajt w stosunku do naiwnej metody, wykorzystując sztuczkę parzystości dylnana Oszczędność
3 bajtów dzięki Mr. Xcoder

þDÁ€ÉÏSO·

Wypróbuj online!

Wyjaśnienie

þ              # push only digits of input
 D             # duplicate
  Á            # rotate right
   ۃ          # get the parity of each
     Ï         # keep only true items
      SO       # calculate digit-sum
        ·      # double
Emigna
źródło
Hmm, to þÀIþ€ÉÏSO·, þÀDÁ€ÉÏSO·, þÀ¹þ€ÉÏSO·lub þÀsþ€ÉÏSO·przekazać wszystkie przypadki testowe dla -2 bajtów?
Pan Xcoder,
@ Mr.Xcoder: Ach, tak. Ładny! Możemy nawet zrobić þDÁ€ÉÏSO·dla -3 :)
Emigna
1

Siatkówka , 37 bajtów

(\d).*
$&$1
L$`(?<=[13579]\D*).
2**
_

Wypróbuj online! Wyjaśnienie:

(\d).*
$&$1

Dołącz duplikat pierwszej cyfry.

L$`(?<=[13579]\D*).

Dopasuj cokolwiek, którego pierwsza poprzednia cyfra jest nieparzysta.

2**

Konwertuj wszystkie mecze na jednoosobowe i podwajaj je. (Nie-cyfry są traktowane jako zero.)

_

Weź sumę. Jeśli nie było żadnych dopasowań, to daje zero w razie potrzeby.

Najlepsze, co mogłem zrobić w Retina 0.8.2, to 44 bajty:

[^\d]

(.).*
$&$1
(?<![13579]).

.
$*
.
..
.

Wypróbuj online! Wyjaśnienie:

[^\d]

Usuń cyfry.

(.).*
$&$1

Dołącz kopię pierwszej cyfry.

(?<![13579]).

Usuń cyfry, które nie następują po liczbie nieparzystej.

.
$*

Konwertuj na unary.

.
..

Podwój je.

.

Weź sumę.

Neil
źródło
Obawiam się, że wynik będzie niepoprawny, jeśli ostatnia cyfra nie będzie nieparzysta
mazzy
1
@mazzy Kiedy mówisz ostatnią cyfrę, masz na myśli przed lub po skopiowaniu pierwszej cyfry na koniec?
Neil,
'do końca'. krok „Dołącz duplikat pierwszej cyfry” jest kopiowany do końca? dobrze. chłodny. Dzięki
mazzy
1

Galaretka , 15 bajtów

fØDV€1ịṭƊ+_Ḃ?ƝS

Wypróbuj online!

Erik the Outgolfer
źródło
Mam nadzieję, że nie masz nic przeciwko, jeśli pożyczę1ịṭƊ
dylnan
1

JavaScript (ES6), 56 bajtów

Pobiera dane wejściowe jako tablicę znaków.

s=>s.map(c=>1/c?r+=p*(p=c*2&2,n=n||c,c):0,n=p=r=0)|r+p*n

Wypróbuj online!

Skomentował

s =>                     // given the input array s[]
  s.map(c =>             // for each character c in s[]:
    1 / c ?              //   if c is a digit:
      r +=               //     update r:
        p * (            //       p = either 0 or 2 (always 0 on the 1st iteration)
          p = c * 2 & 2, //       p = 0 if c is even, 2 if c is odd
          n = n || c,    //       if n is still equal to 0 (as an integer), set it to c
          c              //       compute p * c
        )                //     add the result to r
    :                    //   else:
      0,                 //     do nothing
    n = p = r = 0        //   n = first digit, p = previous digit, r = result
  )                      // end of map()
  | r + p * n            // compute the last operation with the 1st digit and add it to r
Arnauld
źródło
1

JavaScript (Node.js) , 85 84 83 82 bajtów

-1 bajty dzięki ovs

s=>(s.match(/\d/g)||[]).reduce((r,n,i,a)=>r+(+n)+a[a[++i]!=null?i:0]*-(1-n%2*2),0)

Wypróbuj online!

Pobiera dane wejściowe ciągu, znajduje cyfry jako tablicę znaków lub zwraca pustą tablicę, jeśli nie znaleziono, a następnie używa koercji typu, aby zapewnić prawidłowe dodawanie / odejmowanie wartości. Wyszukiwanie do przodu wstępnie zwiększa indeks i używa zwięzłej kontroli zwięzłości, a następnie ostatnia część sprawdza, czy liczba jest nieparzysta, a nawet w celu wymuszenia dodawania lub odejmowania (+ i - to - itd.)

bluefinger
źródło
n-0może być+n
ows
Witamy w PPCG!
Conor O'Brien
1

R , 58 bajtów

function(x,y=strtoi(x[x%in%0:9]))sum(c(y[-1],y[1])*y%%2*2)

Wypróbuj online!

digEmAll
źródło
67 bajtów, jeśli nie przeszkadza ci arraywyjście.
Giuseppe,
1
hmm tak naprawdę nie można użyć iloczynu z powodu pustej tablicy, xxxwięc jest to 68 bajtów przy użyciu zmiany indeksowania w acelu wygenerowania y.
Giuseppe,
@Giuseppe: zmodyfikowano, dziękuję :)
digEmAll
@Giuseppe: Pytam cię o opinię, ponieważ jesteś mądrzejszym golfistą ... z komentarzy wydaje się, że możemy użyć wektora znaków, w tym przypadku możliwe jest 61 bajtów: Wypróbuj online! co myślisz ?
digEmAll
użyj strtoizamiast as.double, ale tak, to powinno być w porządku.
Giuseppe,
0

Perl 5 , 48 bajtów

$;=$;[++$-%@;],$\+=$_%2?$_+$;:$_-$;for@;=/\d/g}{

Wypróbuj online!

Podoba mi się, jak tajemniczo to wygląda, ale jest to dość prosta pętla wokół wszystkich liczb w ciągu.

Dom Hastings
źródło
0

Julia 0.6 , 77 69 bajtów

s->(s=s.-'0';s=s[0.<=s.<=9];endof(s)>0?sum(2(s%2).*[s[2:end];s[]]):0)

Wypróbuj online!

sundar - Przywróć Monikę
źródło
0

C Sharp 180 bajtów

To nie jest zbyt dobry golf, lol.

s=>{var q=new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));q.Enqueue(q.First());int t,o=0;o=q.Dequeue();try{while(true){t+=o+(o%2==0?-1:1)*(o=q.Dequeue());}}catch{return t;}}

Nie golfowany:

var q = new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));
int t,o=0;

q.Enqueue(q.First());    
o=q.Dequeue();

try{
    while(true){
        t += o + (o%2==0?-1:1) * (o=q.Dequeue());
    }
}
catch {
    return t;
}
IEatBagels
źródło
0

Stax , 14 bajtów

ÿ←«4é■≥B▬ê→█T♥

Uruchom i debuguj

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

Vd|&    filter out non-digits
c|(\    zip into pairs after rotating right
F       for each digit pair
  B2%s  first-of-pair % 2, then swap top two stack elements
  eH*   eval digit as integer, double, then multiply
  +     add to running total

Uruchom ten

rekurencyjny
źródło
0

JavaScript (ES6), 52 bajty

s=>s.filter(t=>1/t&&~(a+=u*t,u=t%2),a=u=0)[0]*u+a<<1

Oczekuje wprowadzania jako tablicy znaków. Zastrzeżenie: Ze względu na zastosowanie przesunięcia bitów, wyjście ma górną granicę2^31-1

Wypróbuj online!

Wyjaśnienie

Zasadniczo podwaja sumę cyfr po wartościach nieparzystych.

s => s.filter(             // filter to preserve the first digit
    t =>
        1/t &&             // short-circuits if NaN
        ~(                 // coerce to truthy value
            a += u * t,    // adds value only if previous digit is odd
            u = t%2        // store parity of current digit
        ),
    a = u = 0
)[0]                       // first digit
* u + a
<< 1                       // bit-shift to multiply by 2 (also coerces a NaN resulting from a string devoid of digits to 0)
nadmiar
źródło