Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

Social Engineering: Theory and Practice

Bart Massey (PO8) <bart@cs.pdx.edu>

March 23, 1997 (edited May 23, 2011)

The Netrunner Runner Prep card Social Engineering is an oft-used card: it provides both an early-game speedup
and a way of dealing with particularly nasty ice in the late game. It, along with its early-game counterpart
Inside Job, is an important Runner-deck tool. However, Social Engineering suffers from a bad reputation. It is
all too easy for the Runner to lose an unaffordable number of bits at a critical time during the game. On the
other hand, if the Runner is unwilling to risk enough bits the chance of success is not sufficiently high to justify
the play of the card.
The question, then, is one of economicscan Social Engineering be made to pay? The inventors of the branch
of Mathematics known as Game Theory wanted to answer exactly this sort of question. Game Theory can tell
us how to play Social Engineering optimally in a given situation. I will describe theoretically optimal strategies
for Social Engineering, and give some suggestions about how to convert this theory into practice.
Heres the rules for Social Engineering, as taken from BitBytes (<adriant@greenie.com>) now-defunct spoiler
list.

Social Engineering: Prep (1) [1.0 U]


Hide at least (2) from your pool in your hand; the Corp then guesses how many bits you hid. If the
Corp guesses correctly, lose that many bits. Otherwise, choose a data fort and a piece of ICE on
that fort. Then make a run on that fort, during which you automatically pass that piece of ICE.

Assume we are on a run, with a pool of n bits. Then, let us choose to risk i bits (2 i n) with probability
proportional to 1/i. We must normalize, so we are chosing to risk i bits with probability

1/i
p(i) =
1/2 + 1/3 + + 1/n

When n = 5, for example, we have probabilities

i p(i)
2 0.39
3 0.26
4 0.19
5 0.15

Now imagine that the Corp chooses any pure strategy (i.e., it always guesses some particular number of bits).
Its expected return on this strategy (i.e., the number of bits the Corp expects to cost the Runner due to guessing
correctly) is 0.78 bitsindependent of the strategy it selects.

i e(i)
2 0.78
3 0.78
4 0.78
5 0.78

1
In other words, no matter what pure strategy the Corp picks, it will cost the Runner an average of 1.78 bits
(including the cost of playing the card plus the expected bit loss) to play Social Engineering. It can be proven
from this (see any book on Game Theory) that any combination of pure Corp strategies will achieve the same
result, and thus that this strategy is optimal for the Runner.
The above optimal strategy is based on a fairly unrealistic assumption. Presumably the Runner is playing
this card because they will receive some utility from a successful run, rather than just to avoid losing bits.
Unfortunately, there is no clear value of being able to pass a selected piece of ice in the game. Let us
arbitrarily set this value at 3 bits, just to see how this benefit affects our calculations. (Why 3 bits? Inside
Job, which costs 2 bits, will let us pass the first piece of ice for free. Let us assume that the value of passing an
arbitrary piece of ice is half again as much. We will generalize later in any case.)
We will now use a different strategy, namely; we will risk i bits with probability 1/(i + 3). Normalizing gives us
1/(i + 3)
p(i) =
1/5 + 1/6 + + 1/(n + 3)
When n = 5, we choose with probability

i p(i)
2 0.32
3 0.26
4 0.23
5 0.20

and the Corps expected return for any pure strategy (including the 3-bit benefit of preventing the run as well
as the expected cost to the Runner of being guessed and the cost of playing the card) is

i e(i)
2 2.6
3 2.6
4 2.6
5 2.6

Thus we have an optimal strategy for the Runner under the new conditions. It will cost the Runner about 2.6
bits, including the opportunity cost of missed runs, to play Inside Job. (There is some additional opportunity
cost of playing a Prep during the run, but this is difficult to estimate and fairly small in any case.) Note how
much the probabilities have flattened out. Indeed, as the value to the Corp of an unsuccessful run gets large
it swamps the expected value of making the Runner lose the guess bits; the Runners optimal strategy quickly
converges on simply picking a random value uniformly from the range 2 . . . n.
A natural question to ask about strategy involves asymptotic behavior: what is the optimal strategy as the size
n of the Runners bit pool gets large? The limit
n
X 1
lim
n
i=2
i

divergesas expected, having more bits is better for the Runner. Notice that the expected return for the Corp
as a function of the Runners bit pool size n is
1
e(n) = 1 +
1/5 + 1/6 + + 1/(n + 3)
The denominator of the right-hand term of this sum is a harmonic series: it grows toward infinity as n gets large.
Thus, the expected Corp return converges on 1. But dont be fooled: the divergence of the harmonic series is
notoriously slow. When n = 100 (surely infinity from most Corps point of view) we still have e(n) = 1.32.
Note that we picked a utility of 3 for a successful run fairly arbitrarily. Depending on the game situation, this
utility estimate could be wildly off. For example, you know theres a Political Overthrow in a fort, and its

2
protected by Filter-Filter-Colonel Failure. Your icebreakers are Codecracker and Raptor. How much would you
be willing to pay for a Social? On the other hand, a Filter protects a Holovid Campaign, but you dont have
any icebreakers yet. How much would you be willing to pay for a Social?
Fortunately, the calculations we have been performing generalize quite easily to the case of a u-bit utility:

1/(i + u)
p(i, n, u) =
1/(2 + u) + 1/(3 + u) + + 1/(n + u)
1
e(n, u) = 1 +
1/(2 + u) + 1/(3 + u) + + 1/(n + u)

One interesting way to pick the utility for Social Engineering is to ask the card itself its value of a run! We do
this by noting that the card is presumably zero-sum: the benefit u to the Runner should exactly balance the
cost e(n, u) to the Corp. To find this balance we need to solve
1
1+ =u
1/(2 + u) + 1/(3 + u) + + 1/(n + u)

for u. One can start by rewriting this as

1/(2 + u) + 1/(3 + u) + + 1/(n + u) = 1/(u 1)

but I dont see how to proceed analytically. Numerically, we find the following:

n u
2 *
3 4.5
4 3.0
5 2.4
6 2.1
7 2.0
8 1.9
9 1.8
10 1.8

100 1.3

The * at n = 2 is because the equation for u is singular at this valueno solution exists. Intuitively this is
because the Corp will never guess wrong; the Runner would thus be stupid to play the card. The fact that the
u value is dependent on the size n of the Runner bit pool looks rather strange at first glance. However, it points
up the fact that as the Runner has more bits his chances of using Social Engineering successfully get better and
better: a run made using the card therefore costs less and less.
Note that once the Runner has 6 or more bits the expected return (when playing optimally at u = 3) doesnt
change much as the bit pool increases. However, what does change is the risk of a disastrous outcome for the
Runner. It is true that the expected return for the Corp when it chooses n is exactly the same as when it
chooses 2. However, if the Corp happens to guess right in the first case the Runner loses a lot of bits. This will
happen rarely, but the Runner may be risk-averse; willing to lose more on average to avoid the risk of major
losses. One easy way to limit risk is for the Runner to treat the pool as though it has only as many bits as the
Runner is willing to risk, and calculate accordingly. The cost of this risk management becomes very high at 4
bits or below, and I dont advise itif losing 4 bits would be a disaster for the Runner, the Runner shouldnt
be playing a Social Engineering at that point.
A final question is how to use our formulae in a game situation. If one is playing online, one might have a Social
Engineering Bit Picker sitting in a window on ones terminal. The Bit Picker would select a bit value b(n, u)
from the appropriate probability distribution p(i, n, u)see the accompanying Nickle code in Appendix B for
the start of an implementation. If one is playing head-to-head, it would be possible to program a programmable

3
calculator, PDA, etc., to perform this same calculation. Unfortunately, this might or might not be allowed by
a tournament director, and it would be cumbersome and unpleasant in any case.
A Runner lacking a handy computation engine could use a set of tables for percentile dice, parameterized by
n and u, to select bit values. These tables are included as Appendix A to this article. It is highly desirable to
screen the die roll used for bit selection from the Runner; thus, a reasonable approach would to glue the tables
to the inside of a cardboard screen behind which the dice are rolled and the bits selected.
Ideally, one could find an approximation or set of approximations using just ordinary die rolls and no difficult
arithmetic, such that a selection reasonable approximating optimality could be quickly and unobtrusively carried
out in a game situation. Unfortunately, I see no obvious rules of thumb for small n and/or uother than not
to play Social Engineering in these cases. For u 4 or n 5, however, it appears that the error induced by
merely rolling a die and guessing as many bits as it says (rerolling if it is out of range) is fairly small. We can
quantify the cost of this non-optimal strategy. The expected return for the Corp is

c(i) = (1 + i + u) (1/(n 1) p(i))

where p(i) is the true probability that should be assigned to the i-th bit. It is clear that the Corps best bet is
always to take i = n, and that the largest error obtains when u = 4. It turns out that the error gets larger as
n increases (which makes intuitive sense, since the Runner is supposed to be getting a better and better deal,
and isnt) but stays very close to 1/2 bit for a wide range of n and u values above our targets. This is another
interesting consequence of the slow divergence of the harmonic serieswe know that the error becomes infinite
for large enough n, but when n = 100, we still have error less than 0.72!
One unfortunate effect of this strategy, however, is that the optimal Corp strategy is to guess the entire value
of the bit pool or thereabouts. This might make a risk-averse Runner who has rolled up a large choice slightly
nervous, especially since this Corp strategy gets slightly better as the size of the Runner bit pool increases. An
obvious way to counter this problem is to count die rolls of 1 as 2s: this overweights the value 2 at the expense
of the other values. It turns out that the optimal Corp strategy (again for n 5 or u 4) is now to always
guess 2. Fortunately, the expected Corp gain over optimal strategy is still about 1/2 bit, and falls rapidly off as
n increases (for fixed u).
All of the above is pretty abstract. Heres what I suggest as a Runner strategy for Social Engineering, given
that neither software nor tables are available:

1. Figure out how much the run is worth. Call this number u. If u is less than 3 bits, dont play the Social.
2. Figure out how many bits you will put in the pool to choose from when playing the Social. Dont forget
to subtract the cost of the Social itself. Call this number n.
3. If n is more bits that the Runner can safely lose, reduce n to the number of bits the Runner can safely
lose.
4. If n 4 and u 4, dont play the Social.

5. If n > 6:
(a) Obtain or synthesize an m-sided die, with n < m.
(b) Reroll until the result r of the roll satisfies 1 r n.
(c) If r is 1, make r be 2.
(d) Risk r bits.
6. Otherwise:
(a) Obtain a 6-sided die.
(b) Reroll until the result r of the roll satisfies 2 r n.
(c) Risk r bits.

4
When written out like this, the algorithm looks a bit complicated. In point of fact, its straightforward once you
get the hang of it.
One last obvious question is: what of the poor Corp? Well, the Runner has been careful to make any strategy
yield pretty similar results. It turns out that a solid Corp strategy is to do the same thing that the Runner
is supposedly doing. This isnt perfect, given that the Runner is approximating, but it is good enough in my
opinion. Theres a little game one can play with n vs. n 1 and a large bit pool, but it makes little difference.
So, how good a card is Social Engineering, anyhow? Looks like its a little better deal than Inside Job in most
cases: the extra 0.5-1.5 bit expected penalty for choosing an arbitrary piece of ice is pretty tasty in a lot of
situations. On the other hand, since Inside Job passes the 1st ice it encounters, it can be useful in situations
where the Corp cant afford to rez more than 1 of the several pieces of ice on a fort. Cest la vie. Hopefully, this
exposition will help Runners and Corps alike deal with Social Engineering, and encourage its use.

Dedication
To my brother, Neal F. Guye (Byron William Massey, 19672010), the greatest Netrunner of all time. His
commitment to the game was the inspiration for this analysis.

5
Appendix A: Guess Tables For Social Engineering
To use these tables, find the table for the u value you are interested in, and go to the column for the n of the bit
pool you have and are willing to risk. The e value, at the bottom, tells how much, including opportunity cost,
this Social run will cost you. If this is acceptable, then play the Social, and roll percentile dice. Pick the row
whose entry in your chosen column is the largest value less than or equal to the die roll. Look to the left to see
how many bits to risk.

u=0
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----59---45---37---33---30---28---26---24---23---22---21---21---20
03----99---75---63---56---51---47---44---42---40---38---37---36---34
04---------99---83---73---67---62---58---55---52---50---48---47---45
05--------------99---87---79---73---69---65---62---60---57---55---54
06-------------------99---90---83---78---74---70---67---65---63---61
07------------------------99---91---86---81---77---74---72---69---67
08-----------------------------99---92---88---84---80---77---75---73
09----------------------------------99---93---89---85---82---80---77
10---------------------------------------99---94---90---87---84---82
11--------------------------------------------99---95---91---88---86
12-------------------------------------------------99---95---92---89
13------------------------------------------------------99---95---93
14-----------------------------------------------------------99---96
15----------------------------------------------------------------99
e= 2.20 1.92 1.78 1.69 1.63 1.58 1.55 1.52 1.50 1.48 1.46 1.44 1.43

u=1
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----56---41---34---29---26---24---22---20---19---18---18---17---16
03----99---73---60---52---46---42---39---37---35---33---32---31---30
04---------99---81---70---63---57---53---50---47---45---43---42---40
05--------------99---85---77---70---65---61---58---55---53---51---49
06-------------------99---88---81---75---70---67---64---61---59---57
07------------------------99---90---84---79---74---71---68---65---63
08-----------------------------99---92---86---81---78---74---72---69
09----------------------------------99---93---88---84---80---77---74
10---------------------------------------99---93---89---85---82---79
11--------------------------------------------99---94---90---87---84
12-------------------------------------------------99---94---91---88
13------------------------------------------------------99---95---92
14-----------------------------------------------------------99---95
15----------------------------------------------------------------99
e= 2.71 2.28 2.05 1.92 1.82 1.75 1.70 1.66 1.62 1.60 1.57 1.55 1.53

u=2
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----54---39---31---27---24---21---20---18---17---16---15---15---14
03----99---71---58---49---44---40---36---34---32---30---29---28---27
04---------99---80---68---60---55---50---47---44---42---40---38---37
05--------------99---84---75---68---63---58---55---52---50---48---46
06-------------------99---87---79---73---68---64---61---58---56---54
07------------------------99---89---82---77---72---69---66---63---60
08-----------------------------99---91---85---80---76---72---69---67
09----------------------------------99---92---87---82---78---75---72

6
10---------------------------------------99---93---88---84---81---78
11--------------------------------------------99---93---89---86---82
12-------------------------------------------------99---94---90---87
13------------------------------------------------------99---94---91
14-----------------------------------------------------------99---95
15----------------------------------------------------------------99
e= 3.22 2.62 2.32 2.13 2.00 1.91 1.84 1.79 1.74 1.71 1.67 1.65 1.62

u=3
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----53---38---30---25---22---20---18---17---16---15---14---13---13
03----99---70---56---48---42---38---34---32---30---28---27---26---24
04---------99---79---67---59---53---48---45---42---40---38---36---35
05--------------99---84---74---66---61---56---53---50---47---45---43
06-------------------99---87---78---72---66---62---59---56---53---51
07------------------------99---89---81---76---71---67---64---61---58
08-----------------------------99---90---84---79---74---71---68---65
09----------------------------------99---91---86---81---77---74---71
10---------------------------------------99---92---87---83---79---76
11--------------------------------------------99---93---89---85---81
12-------------------------------------------------99---94---90---86
13------------------------------------------------------99---94---90
14-----------------------------------------------------------99---95
15----------------------------------------------------------------99
e= 3.73 2.96 2.58 2.34 2.18 2.07 1.98 1.91 1.86 1.81 1.77 1.74 1.71

u=4
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----52---37---29---24---21---19---17---16---15---14---13---12---12
03----99---70---55---46---41---36---33---30---28---27---25---24---23
04---------99---78---66---57---51---47---43---40---38---36---34---33
05--------------99---83---73---65---59---55---51---48---46---44---42
06-------------------99---86---77---70---65---61---57---54---52---50
07------------------------99---88---81---75---70---66---62---59---57
08-----------------------------99---90---83---78---73---69---66---63
09----------------------------------99---91---85---80---76---73---69
10---------------------------------------99---92---87---82---78---75
11--------------------------------------------99---93---88---84---80
12-------------------------------------------------99---93---89---85
13------------------------------------------------------99---94---90
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 4.23 3.30 2.83 2.55 2.36 2.22 2.12 2.03 1.97 1.91 1.86 1.83 1.79

u=5
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----52---36---28---24---20---18---16---15---14---13---12---12---11
03----99---69---54---46---40---35---32---29---27---26---24---23---22
04---------99---78---65---57---50---46---42---39---37---35---33---32
05--------------99---83---72---64---58---54---50---47---44---42---40
06-------------------99---86---77---70---64---60---56---53---50---48
07------------------------99---88---80---74---69---65---61---58---55
08-----------------------------99---90---83---77---72---68---65---62
09----------------------------------99---91---85---80---75---72---68
10---------------------------------------99---92---86---82---78---74

7
11--------------------------------------------99---93---88---83---80
12-------------------------------------------------99---93---89---85
13------------------------------------------------------99---94---90
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 4.73 3.64 3.09 2.75 2.53 2.37 2.25 2.15 2.07 2.01 1.96 1.91 1.87

u=6
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----51---36---28---23---20---17---16---14---13---12---12---11---10
03----99---69---54---45---39---34---31---28---26---25---23---22---21
04---------99---77---64---56---50---45---41---38---36---34---32---30
05--------------99---82---71---63---57---53---49---46---43---41---39
06-------------------99---85---76---69---63---59---55---52---49---47
07------------------------99---88---79---73---68---64---60---57---54
08-----------------------------99---89---82---76---72---67---64---61
09----------------------------------99---91---84---79---74---71---67
10---------------------------------------99---92---86---81---77---73
11--------------------------------------------99---92---87---83---79
12-------------------------------------------------99---93---88---84
13------------------------------------------------------99---94---89
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 5.24 3.98 3.34 2.96 2.70 2.52 2.38 2.27 2.18 2.11 2.05 1.00 1.95

u=7
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----51---35---27---23---19---17---15---14---13---12---11---10---10
03----99---68---53---44---38---34---30---28---26---24---22---21---20
04---------99---77---64---55---49---44---40---37---35---33---31---30
05--------------99---82---71---63---57---52---48---45---42---40---38
06-------------------99---85---75---68---63---58---54---51---48---46
07------------------------99---87---79---72---67---63---59---56---53
08-----------------------------99---89---82---76---71---67---63---60
09----------------------------------99---90---84---78---74---70---67
10---------------------------------------99---91---85---81---76---73
11--------------------------------------------99---92---87---82---78
12-------------------------------------------------99---93---88---84
13------------------------------------------------------99---93---89
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 5.74 4.31 3.60 3.16 2.87 2.67 2.51 2.39 2.29 2.20 2.14 2.08 2.03

u=8
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----51---35---27---22---19---17---15---14---12---12---11---10---10
03----99---68---53---44---38---33---30---27---25---23---22---21---20
04---------99---77---63---55---48---43---40---37---34---32---30---29
05--------------99---82---70---62---56---51---47---44---42---39---37
06-------------------99---85---75---68---62---57---53---50---48---45
07------------------------99---87---79---72---67---62---58---55---53
08-----------------------------99---89---81---75---70---66---63---59
09----------------------------------99---90---83---78---73---69---66
10---------------------------------------99---91---85---80---76---72
11--------------------------------------------99---92---87---82---78

8
12-------------------------------------------------99---93---88---83
13------------------------------------------------------99---93---89
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 6.24 4.65 3.85 3.37 3.04 2.81 2.64 2.50 2.39 2.30 2.22 2.16 2.10

u=9
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----51---35---27---22---19---16---15---13---12---11---10---10---09
03----99---68---53---43---37---33---29---27---25---23---21---20---19
04---------99---76---63---54---48---43---39---36---34---31---30---28
05--------------99---81---70---62---55---51---47---44---41---39---37
06-------------------99---85---75---67---61---57---53---50---47---44
07------------------------99---87---78---72---66---62---58---55---52
08-----------------------------99---89---81---75---70---66---62---59
09----------------------------------99---90---83---78---73---69---65
10---------------------------------------99---91---85---80---75---72
11--------------------------------------------99---92---86---82---77
12-------------------------------------------------99---93---87---83
13------------------------------------------------------99---93---88
14-----------------------------------------------------------99---94
15----------------------------------------------------------------99
e= 6.74 4.98 4.09 3.57 3.21 2.96 2.77 2.62 2.50 2.40 2.31 2.24 2.18

u=10
b= n=03 n=04 n=05 n=06 n=07 n=08 n=09 n=10 n=11 n=12 n=13 n=14 n=15
02----51---34---26---22---18---16---14---13---12---11---10---10---09
03----99---68---52---43---37---32---29---26---24---22---21---20---19
04---------99---76---63---54---47---42---39---36---33---31---29---28
05--------------99---81---70---61---55---50---46---43---40---38---36
06-------------------99---84---74---67---61---56---52---49---46---44
07------------------------99---87---78---71---66---61---57---54---51
08-----------------------------99---89---81---74---69---65---61---58
09----------------------------------99---90---83---77---72---68---65
10---------------------------------------99---91---85---79---75---71
11--------------------------------------------99---92---86---81---77
12-------------------------------------------------99---92---87---83
13------------------------------------------------------99---93---88
14-----------------------------------------------------------99---93
15----------------------------------------------------------------99
e= 7.24 5.32 4.35 3.77 3.38 3.10 2.89 2.73 2.60 2.49 2.40 2.32 2.26

9
Appendix B: Code Used In Preparing This Article
Here is the code I used in computing the numbers used in the article, including the tables of Appendix A.
This code is written for Keith Packards and my Nickle programming language (http://nickle.org); it was
originally written in the Nickle predecessor language nick, and has been lightly edited for clarity. Hopefully
the code will be understandable by someone familiar with most any standard imperative programming language.

# Social Engineering table generator


# Copyright 1997 Bart Massey

function norm(n,u) {
auto s = 0;
for (auto i = 2; i <= n; i++)
s += 1 / (i + u);
return s;
}

function p(i, n, u) {
return (1 / (i + u)) / norm(n, u);
}

function ex(n, u) {
return 1 + 1 / norm(n, u);
}

function d(i, n, u) {
auto s = 0;
for (auto j = 2; j <= i; j++)
s += p(j, n, u);
return floor(s * 100) - 1;
}

function normtest(n, u) {
auto s = 0;
for (auto i = 2; i <= n; i++)
s += p(i,n,u);
return s;
}

function printtab(u, nn) {


printf("u=%d\n", u);
printf("b= ");
for (auto n = 3; n <= nn; n++)
printf(" n=%02d", n);
printf("\n");
for (auto i = 2; i <= nn; i++) {
printf("%02d-", i);
for (auto n = 3; n <= nn; n++)
if (i <= n)
printf("---%02d", d(i, n, u));
else
printf("-----");
printf("\n");
}
printf("e= %4.2f", ex(3, u));

10
for (auto n = 4; n <= nn; n++)
printf(" %4.2f", ex(n,u));
printf("\n");
}

function printtabs(nu, nn) {


printtab(0, nn);
for (auto i = 1; i <= nu; i++) {
printf("\n");
printtab(i,nn);
}
}

printtabs(10,15)

11

You might also like