Expert Overview: Paysandu vs Vila Nova
The upcoming match between Paysandu and Vila Nova on August 12, 2025, at 00:30 presents a compelling scenario for bettors and football enthusiasts alike. Both teams have shown competitive spirits in recent matches, with Paysandu displaying a strong home advantage while Vila Nova remains a formidable opponent. The betting odds suggest a cautious approach to goal predictions, with significant emphasis on low-scoring outcomes. This match is expected to be tightly contested, reflecting in the high probability of both teams not scoring in either half.
Paysandu
Vila Nova
(FT)
Predictions:
Market | Prediction | Odd | Result |
---|---|---|---|
Both Teams Not To Score In 2nd Half | 82.00% | (0-1) | |
Away Team Not To Score In 1st Half | 71.70% | (0-1) | |
Draw In First Half | 67.90% | (0-1) | |
Home Team Not To Score In 2nd Half | 68.80% | (0-1) | |
Under 2.5 Goals | 61.10% | (0-1) 1.36 | |
Over 1.5 Goals | 63.90% | (0-1) 1.57 | |
Both Teams Not To Score In 1st Half | 60.00% | (0-1) | |
Over 0.5 Goals HT | 63.50% | (0-1) | |
Home Team Not To Score In 1st Half | 54.10% | (0-1) | |
Both Teams To Score | 51.60% | (0-1) 2.30 | |
First Goal 30+ Minutes | 52.40% | (0-1) | |
Avg. Total Goals | 2.10% | (0-1) | |
Avg. Conceded Goals | 2.11% | (0-1) | |
Avg. Goals Scored | 2.30% | (0-1) | |
Red Cards | 1.50% | (0-1) |
Betting Predictions
- Both Teams Not To Score In 2nd Half: 86.40
- Away Team Not To Score In 1st Half: 69.90
- Draw In First Half: 65.70
- Home Team Not To Score In 2nd Half: 69.40
- Under 2.5 Goals: 63.00
- Over 1.5 Goals: 65.30
- Both Teams Not To Score In 1st Half: 64.40
- Over 0.5 Goals HT: 65.10
- Home Team Not To Score In 1st Half: 56.50
- Both Teams To Score: 51.20
- First Goal 30+ Minutes: 51.80
The statistical analysis indicates an average total of 3.50 goals per match, with an average of 1.90 goals scored by the home team and an average of 2.41 goals conceded by both teams combined. The likelihood of red cards being issued stands at a modest rate of 0.60, suggesting disciplined play is anticipated.
Additionagabrielmb/desafio-globo/README.md
# Desafio Globo
### Descrição do Projeto
O desafio consiste em construir uma aplicação de buscas de produtos em um catálogo de produtos.
A aplicação deverá permitir que o usuário busque produtos por nome ou categoria, com paginação dos resultados e filtro por preço.
#### Tecnologias utilizadas:
– React
– Typescript
– Redux
#### Como executar o projeto:
bash
yarn install
yarn start
#### Considerações:
– Fiz uma requisição ao endpoint do Mercado Livre com paginacao e filtro por preco para buscar os dados da API.
– Utilizei Redux para gerenciar os estados da aplicação.
– Para paginação utilizei o pacote react-paginate.
– Para estilização utilizei CSS e styled-components.
#### O que poderia ser melhorado:
– Fazer testes unitários e de integração.
– Utilizar um pacote de busca para fazer as buscas no catálogo de produtos.
– Fazer o sistema de busca de produtos funcionar com “autocomplete”.
gabrielmb/desafio-globo/src/redux/store.ts
import { configureStore } from “@reduxjs/toolkit”;
import productsReducer from “./products/productsSlice”;
const store = configureStore({
reducer: {
products: productsReducer,
},
});
export default store;
export type RootState = ReturnType;
export type AppDispatch = typeof store.dispatch;
gabrielmb/desafio-globo/src/components/ProductCard/index.tsx
import React from “react”;
import { Link } from “react-router-dom”;
import styled from “styled-components”;
import { Product } from “../../types/Product”;
const Container = styled.div`
width: min(300px, calc(100% – (20px * var(–gap))));
`;
const Image = styled.img`
width: auto;
`;
const Title = styled.div`
margin-top: var(–gap);
`;
const Price = styled.div`
font-size: var(–font-size-big);
`;
const ProductCard: React.FC = ({ product }) => {
return (
R$ {product.price}
);
};
interface ProductProps {
product: Product;
}
export default ProductCard;
import { createAsyncThunk, createSlice } from “@reduxjs/toolkit”;
import api from “../../services/api”;
export interface Product {
id: string;
title: string;
}
interface ProductsState {
data: Product[];
}
const initialState: ProductsState = {
data: [],
};
const fetchProducts = createAsyncThunk(
“products/fetchProducts”,
async ({ page, categoryId }: { page: number; categoryId?: string }) => {
const response = await api.get(“search”, {
params: { page, categoryId },
});
return response.data.results;
}
);
const productsSlice = createSlice({
name: “products”,
initialState,
reducers: {},
extraReducers(builder) {
builder.addCase(fetchProducts.fulfilled, (state, action) => {
state.data.push(…action.payload);
});
builder.addCase(fetchProducts.rejected, (state) => {});
builder.addCase(fetchProducts.pending, (state) => {});
builder.addCase(fetchProducts.reseted, (state) => {
state.data = [];
});
builder.addCase(fetchProducts.resetting, (state) => {});
builder.addCase(fetchProducts.resetFailed, (state) => {});
builder.addCase(fetchProducts.resettingFailed, (state) => {});
builder.addCase(fetchProducts.resetSucceeded, (state) => {});
builder.addCase(fetchProducts.resettingSucceeded, (state) => {});
builder.addCase(fetchProducts.pendingFailed, (state) => {});
builder.addCase(fetchProducts.pendingSucceeded, (state) => {});
builder.addCase(fetchProducts.rejectedFailed, (state) => {});
builder.addCase(fetchProducts.rejectedSucceeded, (state) => {});
builder.addCase(fetchProducts.fulfilledFailed, (state) => {});
builder.addCase(fetchProducts.fulfilledSucceeded, (state) => {});
builder.addCase(fetchProducts.pendingResettingFulfilled,
(state) => {}
);
}
});
export const actions = productsSlice.actions;
export default productsSlice.reducer;
gabrielmb/desafio-globo/src/pages/ProductDetail/index.tsx
import React from “react”;
import { useSelector } from “react-redux”;
import { useParams } from “react-router-dom”;
import api from “../../services/api”;
import { RootState } from “../../redux/store”;
import LoadingSpinner from “../../components/LoadingSpinner”;
interface Params {
id: string;
}
const ProductDetailPage: React.FC = () => {
const { id } = useParams();
const productData = useSelector((state: RootState) =>
state.products.data.find((product) => product.id === id)
);
if (!productData) return ;
const { title } = productData;
const [productDetails] = React.useState([]);
React.useEffect(() => {
api.get(`items/${id}`).then((response) =>
productDetails.push(response.data)
);
}, []);
return (
{title}
{productDetails.map((detail) =>
detail.available_quantity > detail.sold_quantity ? (
Disponível em estoque.
) : (
Produto esgotado.
)
)}
);
};
export default ProductDetailPage;
import React from “react”;
const LoadingSpinner: React.FC = () => {
return (
{`
.loading-spinner div:nth-child(1) {
position:absolute;
top:-50%;
left:-50%;
width:200px;
height:200px;
margin:-100px;
border-radius:50%;
border-top:solid transparent #888888;
border-left:solid transparent #888888;
border-right:solid #888888 #888888;
border-bottom:solid #888888 #888888;
animation:tspin .8s linear infinite;
}
.loading-spinner div:nth-child(2){
position:absolute;
top:-50%;
left:-50%;
width:250px;
height:250px;
margin:-125px;
border-radius:50%;
border-top:solid transparent #555555;
border-left:solid transparent #555555;
border-right:solid #555555 #555555;
border-bottom:solid #555555 #555555;
animation:tspin .8s linear infinite reverse;
}
.loading-spinner div:nth-child(3){
position:absolute;
top:-50%;
left:-50%;
width:300px;
height:300px;
margin:-150px;
border-radius:50%;
border-top:solid transparent #222222;
border-left:solid transparent #222222;
border-right:solid #222222 #222222;
border-bottom:solid #222222 #222222;
animation:tspin .8s linear infinite;
}
.loading-spinner div:nth-child(4){
position:absolute;
top:-50%;
left:-50%;
width:350px;
height:350px;
margin:-175px;
border-radius:50%;
border-top:solid transparent #000000;
border-left:solid transparent #000000;
border-right:solid #000000 #000000;
border-bottom:solid #000000 #000000;
animation:tspin .8s linear infinite reverse;
}
.loading-spinner div:nth-child(5){
position:absolute; top:-50%; left:-50%; width:400px; height:400px; margin:-200px; border-radius:50%; border-top:solid transparent rgba(0,0,0,.25); border-left:solid transparent rgba(0,0,0,.25); border-right:solid rgba(0,0,0,.25); border-bottom:solid rgba(0,0,0,.25); animation:tspin .8s linear infinite ; }
.loading-spinner div:nth-child(6){
position:absolute; top:-50%; left:-50%; width:450px; height:450px; margin:-225px; border-radius:50%; border-top:solid transparent rgba(0,0,0,.5); border-left:solid transparent rgba(0,0,0,.5); border-right:solid rgba(0,0,0,.5); border-bottom:solid rgba(0,0,0,.5); animation:tspin .8s linear infinite reverse ; }
.loading-spinner div:nth-child(7){
position:absolute;top:-50%;left:-50%;width:500px;height:500px;margin:-250px;border-radius:50%;border-top:solid transparent rgba(255,255,255,.25);border-left:solid transparent rgba(255,255,255,.25);border-right:solid rgba(255,255,255,.25);border-bottom:solid rgba(255,255,255,.25);animation:tspin .8s linear infinite ; }
.loading-spinner div:nth-child(8){
position:absolute;top:-50%;left:-50%;width:550px;height:550px;margin:-275px;border-radius:50%;border-top:solid transparent rgba(255,255,255,.5);border-left:solid transparent rgba(255,255,255,.5);border-right:solid rgba(255,255,255,.5);border-bottom:solid rgba(255,255,255,.5);animation:tspin .8s linear infinite reverse ; }
.loading-spinner div:nth-child(9){
position:absolute;top:-50%;left:-50%;width:600px;height:600px;margin:-300px;border-radius:50%;border-top:solid transparent rgba(255 ,255 ,255 ,.75 );border-left:solid transparent rgba(255 ,255 ,255 ,.75 );border-right:solid rgba(255 ,255 ,255 ,.75 );border-bottom:solid rgba(255 ,255 ,255 ,.75 );animation:tspin .8s linear infinite ; }
.loading-spinner div:nth-child(10){
position:absolute;top:-50%;left:-50%;width:650px;height:650px;margin:-325px;border-radius:50%;border-top:solid transparent white;border-left:solid transparent white;border-right:solid white;border-bottom:solid white;border-bottom-color:#FFFFFF;border-right-color:#FFFFFF;border-left-color:#FFFFFF;border-top-color:#FFFFFF ;animation:tspin .8s linear infinite reverse ; }
.loading-spinner div:nth-child(11){
position:absolute;top:-50%;left:-50%;width :700px;height :700px;margin : -350 px;border-radius : ;
}
.loading-spinner div:nth-child(12){
position:absolute;top : -350 px;left : -350 px;width :800 px;height :800 px;margin : -400 px;border-radius : ;
}
.loading-spinner div:nth-child(13){
position:absolute;top :-450 px;left :-450 px;width :900 px;height :900 px;margin :-450 px;border-radius : ;
}
.loading-spinner div:nth-child(14){
position:absolute;top :-550 px;left :-550 px;width :1000 px;height :1000 px;margin :-500 px;border-radius : ;
}
.loading-spinner div:nth-child(15){
position:absolute;top :-650 px;left :-650 px;width :1100 px;height :1100 px;margin :-550 px;border-radius : ;
}
.loading-spinner div:nth-child(16){
position:absolute;top :-750 px;left :-750 px;width :1200 px;height :1200 px;margin :-600 px;border-radius : ;
}
.loading-spinner div:nth-child(17){
position:absolute;top :-850 px;left :-850 px;width :1300 px;height :1300 px;margin :-650 px;border-radius : ;
}
.loading-spinner div:nth-child(18){
position:absolute;top :-950 px;left :-950 px;width :1400 px;height :1400 px;margin :-700 px;border-radius : ;
}
@keyframes tsin{
from{
transform : rotateZ(-180deg);}
to{
transform : rotateZ(-360deg);}
}
@keyframes tspin{
from{
transform : rotateZ(-360deg);}
to{
transform : rotateZ(-180deg);}
}
`}
{`
*{
box-sizing:border-box