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


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.

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)

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

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

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.


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


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.


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

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


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

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

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


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!


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

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

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


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.