Cyfryzacje

12

Wejście:

Lista liczb całkowitych (które nigdy nie będą zawierać zera)

Wynik:

Lista tego samego rozmiaru z liczbą opartą na następujących elementach:

  • Jeśli bieżący element jest ujemny: Spójrz na wszystkie elementy przed tym elementem i policz, ile razy cyfry wystąpiły w tych innych liczbach
  • Jeśli zamiast tego bieżący element jest dodatni: spójrz na wszystkie elementy po tym elemencie i policz, ile razy cyfra wystąpiła w tych innych liczbach

Jest jeden zwrot: jeśli wielkość listy jest parzysta, liczymy każdą liczbę tylko raz (nawet jeśli pasuje do wielu cyfr), a jeśli wielkość jest nieparzysta, liczymy każdą cyfrę liczb dla każdej cyfry bieżącego elementu (powielona cyfry są liczone wiele razy).

Podajmy kilka przykładów, aby to trochę wyjaśnić:

Przykład z listą parzystą:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Rozmiar listy jest parzysty , więc każdą liczbę liczymy tylko raz.

  • 4: Jest pozytywny, więc czekamy z niecierpliwością. Istnieją trzy numery zawierające cyfrę 4( 42, -942, 8374). Więc zaczynamy od 3.
  • 10: Jest pozytywny, więc czekamy z niecierpliwością. Istnieją dwie liczby zawierające cyfrę 1i / lub 0( -10, -200). Więc drugie wyjście to 2.
  • 42: Znowu pozytywne, więc naprzód. Istnieją cztery numery zawierające albo cyfrę 4i / lub 2( -942, 8374, 728, -200). Tak więc trzeci wynik to 4.
  • -10: Tym razem jest to negatywne, więc patrzymy wstecz. Jest tylko jedna liczba zawierająca cyfrę 1i / lub 0(ignorujemy znak minus) ( 10). Więc czwarte wyjście to 1.
  • itp.

Przykład z nieparzystą listą:

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Rozmiar listy jest nieparzysty , dlatego liczymy każdą cyfrę.

  • 382: Jest pozytywny, więc czekamy z niecierpliwością. Jest jedna 3w pozostałych liczbach ( 381), sześć 8w pozostałych liczbach ( -82, -8, 381, 228, 28, -28), a sześć 2w pozostałych liczbach ( -82, 228, 28, -28, 2). Więc zaczynamy od 13.
  • -82: Jest negatywny, więc do tyłu. Jest jeden 3pod drugim numerem ( 382) i jeden 8pod drugim numerem ( 382). Więc drugie wyjście to 2.
  • ...
  • 228: To pozytywne, więc naprzód. Istnieją trzy 2„sw innych numerów ( 28, -28, -2), a kolejne trzy 2” s, a dwa 8„s w innych liczb ( 28, -28). Więc ten wynik to 8.
  • itp.

Zasady konkursu:

  • Możesz założyć, że dane wejściowe nigdy nie będą zawierać 0jako element, ponieważ nie są ani dodatnie, ani ujemne.
  • Możesz założyć, że lista wejściowa zawsze będzie zawierać co najmniej dwa elementy.
  • I / O jest elastyczny. Dane wejściowe / wyjściowe mogą być tablicą / listą liczb całkowitych, ciągiem rozdzielanym, matrycą cyfr / znaków itp.
  • Jeśli pierwsza liczba na liście jest liczbą ujemną lub ostatnia liczba na liście jest liczbą dodatnią, będzie to 0 na wynikowej liście.
  • W przypadku list nieparzystych liczby zawierające tę samą cyfrę wiele razy są liczone wiele razy, podobnie jak 228w powyższym nieparzystym przykładzie, w którym 8zamiast (3 + 3 + 2) zamiast 5(3 + 2).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

Input:  [4, 10, 42, -10, -942, 8374, 728, -200]
Output: [3, 2,  4,  1,   2,    1,    1,   5   ]

Input:  [382, -82, -8, 381, 228, 28, 100, -28, -2]
Output: [13,  2,   2,  4,   8,   3,  0,   11,  6 ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19]
Output: [9,  1,   7,  3,   5,  5,   3,  7,   1,  9  ]

Input:  [10, -11, 12, -13, 14, -15, 16, -17, 18, -19, 20]
Output: [11, 2,   8,  4,   5,  6,   3,  8,   1,  10,  0 ]

Input:  [88, 492, -938, 2747, 828, 84710, -29, -90, -37791]
Output: [8,  9,   3,    9,    3,   4,     5,   4,   12    ]

Input:  [-1, 11, 11, 1]
Output: [0,  2,  1,  0]

Input:  [1, 11, 11, -1]
Output: [3, 2,  1,  3 ]

Input:  [-1, 11, 1]
Output: [0,  2,  0]

Input:  [1, 11, -1]
Output: [3, 2,  3 ]
Kevin Cruijssen
źródło

Odpowiedzi:

3

05AB1E , 30 bajtów

vy0›iNƒ¦}ëN£}€Sþyδ¢IgÈiĀ€Ù}OOˆ

Wypróbuj online!

Emigna
źródło
δ¢, nigdy nie widziałem dobrze używanego podwójnego wektora, ładny.
Magic Octopus Urn
5

Python 2 , 149 148 121 116 111 107 bajtów

lambda l:[sum([any,sum][len(l)%2](map(`n`.count,`abs(v)`))for n in l[:i:2*(v<0)-1])for i,v in enumerate(l)]

Wypróbuj online!

TFeld
źródło
4

Java (JDK 10) , 204 bajty

a->{int l=a.length,r[]=new int[l],i=0,j,x,y,b,s,t=10;for(;i<l;i++)for(j=i+(s=a[i]>0?1:-1);0<=j&j<l;j+=s)for(b=0,x=a[i];x!=0;x/=t)for(y=a[j];b<1&y!=0;y/=t)if(x%t==-y%t|x%t==y%t){r[i]++;b+=1-l%2;}return r;}

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
[1,11,-1]powinien wrócić [3,2,3]. To nieparzysta lista, więc wszystkie cyfry się liczą. Pierwszy 1: czekam trzy 1s W sumie: 11,-1. Po drugie 11: czekaj na każdą cyfrę: jeden 1+ jeden 1. Po trzecie -1: Spójrz do tyłu, trzy 1s W sumie: -1,11. (Przy listach nieparzystych powinieneś spojrzeć na każdą cyfrę, nawet taką samą. Wyjaśnię to w wyzwaniu, ale ten nieparzysty przykład z liczbą 228nieco to wyjaśnia.)
Kevin Cruijssen
@KevinCruijssen Powinien zostać teraz naprawiony.
Olivier Grégoire,
Rzeczywiście tak jest. Już się obawiałem, że wstępne wyjaśnienie mogło być nieco niejasne, kiedy je opublikowałem. Teraz zobaczę, czy mogę zagrać w golfa z twoją odpowiedzią. ;)
Kevin Cruijssen
1
Nie mam dużo czasu, albo, ale jedno można golf jest dodanie nowej zmiennej ,ti zmienia i+(a[i]>0?1:-1)się i+(t=a[i]>0?1:-1), a następnie po prostu użyć j+=tzamiast j+=a[i]>0?1:-1.
Kevin Cruijssen
1
Możesz zapisać 2, jeśli zadeklarujesz na przykład t = 10 i
zastąpisz
3

Perl 6 , 100 85 bajtów

{.kv.map:{sum map (?*,+*)[$_%2],.[grep (*-$^i)*$^v>0,^$_].map:{.comb$v.abs.comb}}}

Wypróbuj online!

Używa dużego operatora mnożenia ⊍.

nwellnhof
źródło
1

JavaScript (Node.js) , 164.158.140 139 bajtów

a=>a.map((x,i)=>a.slice(x<0?0:i+1,x<0?i:l).map(b=>c+=[...b+""].map(X=>s+=X>=0&&(x+"").split(X).length-1,s=0)&&l%2?s:+!!s,c=0)|c,l=a.length)

Wypróbuj online!

DanielIndie
źródło
To wygląda jak JS6, a nie cokolwiek Node-y.
Nie, że Charles
jest to ciąg wygenerowany przez tio. ma Node Babel lub SpiderMonkey JS. nadal działa na węźle, więc jest w porządku
DanielIndie
1

Rubin , 126 bajtów

->l{k=l.map{|i|i.abs.digits};c=-1;k.map{|n|x=k[l[c+=1]<0?0...c:c+1..-1];x.sum{|j|x=n.sum{|d|j.count d};l.size%2<1?x<1?0:1:x}}}

Wypróbuj online!

Asone Tuhid
źródło
1

Galaretka , 43 42 bajty

>0ị"ḊÐƤżṖƤƊAṾ€€FċЀ¥e€€³LḂ©¤?"AṾ$€SṀ€S$®?€

Wypróbuj online!

dylnan
źródło