Import Image

In[]:=
wingsImage=Import["https://pbs.twimg.com/media/DqELgT7XQAYcaj8.jpg"];
In[]:=
ImageResize[wingsImage,500]
Out[]=

Text recognition

Use TextRecognize to see if you can get decent results. I found by increasing the image size, I could get better results:
In[]:=
text=TextRecognize[ImageResize[wingsImage,Scaled[3.5]]]
Out[]=
WINGS​4 Chicken Wings 4.55 24 Chicken Wings 27.25​5 Chicken Wings 5.70 2_5 Chicken Wings 27.80 A- 1​6 Chicken Wings 6.80 26 Chicken Wings 28.95​7 Chicken Wings 7.95 27 Chicken Wings 30.108 Chicken Wings 9.10 n 28 Chicken Wings 31.20​1 9 Chicken Wings 10.20 29 Chicken Wings 32.35 I10 Chicken Wings 11.35 k 30 Chicken Wings 33.501.1 Chicken Wings 12.50 1 35 Chicken Wings 39.15' l1​i 12 Chicken Wings 13.60 I 40 Chicken Wings 44.80​1 13 Chicken Wings 14.75 i i 45 Chicken Wings 50.5014 Chicken Wings 15.90 1' i 50 Chicken Wings 55.601 15 Chicken Wings 17.00 3 2 60 Chicken Wings 67.0016 Chicken Wings 18.15 70 Chicken Wings 78.3017 Chicken Wings 19.30 ` 75 Chicken Wings 83.4518 Chicken Wings 20.40 i 1 80 Chicken Wings 89.1019 Chicken Wings 21.55 90 Chicken Wings 100.45\20 chicken Wings 22.70 'f 100 chicken Wings 111.25x21 Chicken Wings 23.80 ` E 125 Chicken Wings 139.00​, 22 Chicken Wings 24.95 150 Chicken Wings 166.85​\23 Chicken Wings 26.10 200 Chicken Wings 222.50​_.- .-.___-_ v`_.__`.._
Do some cleanup to make numbers work out:
In[]:=
textFixed=StringReplace[text,{Except[LetterCharacter|"."|DigitCharacter|WhitespaceCharacter]""}]
Out[]=
WINGS​4 Chicken Wings 4.55 24 Chicken Wings 27.25​5 Chicken Wings 5.70 25 Chicken Wings 27.80 A 1​6 Chicken Wings 6.80 26 Chicken Wings 28.95​7 Chicken Wings 7.95 27 Chicken Wings 30.108 Chicken Wings 9.10 n 28 Chicken Wings 31.20​1 9 Chicken Wings 10.20 29 Chicken Wings 32.35 I10 Chicken Wings 11.35 k 30 Chicken Wings 33.501.1 Chicken Wings 12.50 1 35 Chicken Wings 39.15 l1​i 12 Chicken Wings 13.60 I 40 Chicken Wings 44.80​1 13 Chicken Wings 14.75 i i 45 Chicken Wings 50.5014 Chicken Wings 15.90 1 i 50 Chicken Wings 55.601 15 Chicken Wings 17.00 3 2 60 Chicken Wings 67.0016 Chicken Wings 18.15 70 Chicken Wings 78.3017 Chicken Wings 19.30 75 Chicken Wings 83.4518 Chicken Wings 20.40 i 1 80 Chicken Wings 89.1019 Chicken Wings 21.55 90 Chicken Wings 100.4520 chicken Wings 22.70 f 100 chicken Wings 111.25x21 Chicken Wings 23.80 E 125 Chicken Wings 139.00​ 22 Chicken Wings 24.95 150 Chicken Wings 166.85​23 Chicken Wings 26.10 200 Chicken Wings 222.50​. .. v...

String processing

The cleaned up data looks good. With a simple StringExpression, I can make an Association of wing number to price:
In[]:=
wingCountToPriceRaw=Association[StringCases[textFixed,n:NumberString~~Whitespace~~"chicken"~~Whitespace~~"wings"~~Whitespace~~price:NumberString(ToExpression[n]ToExpression[price]),IgnoreCaseTrue]]
Out[]=
44.55,2427.25,55.7,2527.8,66.8,2628.95,77.95,2730.1,89.1,2831.2,910.2,2932.35,1011.35,3033.5,1.112.5,3539.15,1213.6,4044.8,1314.75,4550.5,1415.9,5055.6,1517.,6067.,1618.15,7078.3,1719.3,7583.45,1820.4,8089.1,1921.55,90100.45,2022.7,100111.25,2123.8,125139.,2224.95,150166.85,2326.1,200222.5
I can make the prices be actual dollars with Quantity:
In[]:=
wingCountToPrice=Quantity[#,"USDollars"]&/@KeySort[wingCountToPriceRaw]
Out[]=
1.1
$
12.50
,4
$
4.55
,5
$
5.70
,6
$
6.80
,7
$
7.95
,8
$
9.10
,9
$
10.20
,10
$
11.35
,12
$
13.60
,13
$
14.75
,14
$
15.90
,15
$
17.00
,16
$
18.15
,17
$
19.30
,18
$
20.40
,19
$
21.55
,20
$
22.70
,21
$
23.80
,22
$
24.95
,23
$
26.10
,24
$
27.25
,25
$
27.80
,26
$
28.95
,27
$
30.10
,28
$
31.20
,29
$
32.35
,30
$
33.50
,35
$
39.15
,40
$
44.80
,45
$
50.50
,50
$
55.60
,60
$
67.00
,70
$
78.30
,75
$
83.45
,80
$
89.10
,90
$
100.45
,100
$
111.25
,125
$
139.00
,150
$
166.85
,200
$
222.50

I noticed that 11 was mistaken as 11, so I’ll fix it manually:
Now, the data is in a nice structure:

Verify Data

Let’s make a grid to check that the data is correct:

Simple Analysis

Many people made many plots like these:

Price vs Wing Count

Price per Wing vs Wing Count

Nutrition Information

Pregenerate up to 100 to make page load times faster:
Copy them to the cloud:
Make a top-level function that decides how to get the image:

Minimizing cost

It’s cheapest to buy sets of 25 wings:
If you’re buying less than 25, then it’s cheapest to buy multiples of three:

Minimize cost for a given number of wings

Find the cheapest and most expensive ways to buy a given number of wings using FrobeniusSolve:

Investigate performance

For numbers below 50, they take less than a few seconds each to generate all solutions:
The number of solutions increases dramatically for larger numbers, so a heuristic must be used above 50 to limit the number of solution and keep decent performance .

Make readable result

Package up into a readable result:

Deploying something to the cloud

Deploy an interactive form in the cloud

Copy this notebook to the cloud

This allows others to see it in the cloud with ease: