Relative number in vim - vim

I noticed a strange behavior in vim regarding the relative numbers:
:set nu
1
2
3 _
4
5
6
~
:set relativenumber
2
1
3 _
1
2
3
~
:set nonu
2
1
0 _
1
2
3
~
I was asking myself why sometime I see the absolute current line number and sometime I see 0 which is pretty useless.
Is this behavior normal and how to correctly number and relativenumber?

It's the expected behavior. From :help number_relativenumber
The 'relativenumber' option changes the displayed number to be
relative to the cursor. Together with 'number' there are these
four combinations (cursor in line 3):
'nonu' 'nu' 'nonu' 'nu'
'nornu' 'nornu' 'rnu' 'rnu'
|apple | 1 apple | 2 apple | 2 apple
|pear | 2 pear | 1 pear | 1 pear
|nobody | 3 nobody | 0 nobody |3 nobody
|there | 4 there | 1 there | 1 there

That behavior depends on how number and relativenumber are combined.
Everything is explained in :help number_relativenumber, a subsection of :help 'number' that you would have found if you had tried a little harder.

Related

Counting 15's in Cribbage Hand

Background
This is a followup question to my previous finding a straight in a cribbage hand question and Counting Pairs in Cribbage Hand
Objective
Count the number of ways cards can be combined to a total of 15, then score 2 points for each pair. Ace worth 1, and J,Q,K are worth 10.
What I have Tried
So my first poke at a solution required 26 different formulas. Basically I checked each possible way to combine cards to see if the total was 15. 1 way to add 5 cards, 5 ways to add 4 cards, 10 ways to add 3 cards, and 10 ways to add 2 cards. I thought I had this licked until I realized I was only looking at combinations, I had not considered the fact that I had to cap the value of cards 11, 12, and 13 to 10. I initially tried an array formula something along the lines of:
MIN(MOD(B1:F1-1,13)+1,10)
But the problem with this is that MIN takes the minimum value of all results not the individual results compared to 10.
I then tried it with an IF function, which worked, but involved the use of CSE formula even wehen being used with SUMPRODUCT which is something I try to avoid when I can
IF(MOD(B1:F1-1,13)+1<11,MOD(B1:F1-1,13)+1,10)
Then I stumble on an answer to a question in code golf which I modified to lead me to this formula, which I kind of like for some strange reason, but its a bit long in repetitive use:
--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2)
My current working formulas are:
5 card check
=(SUMPRODUCT(--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2))=15)*2
4 card checks
=(SUM(AGGREGATE(15,6,--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2),{1,2,3,4}))=15)*2
=(SUM(AGGREGATE(15,6,--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2),{1,2,3,5}))=15)*2
=(SUM(AGGREGATE(15,6,--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2),{1,2,4,5}))=15)*2
=(SUM(AGGREGATE(15,6,--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2),{1,3,4,5}))=15)*2
=(SUM(AGGREGATE(15,6,--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2),{2,3,4,5}))=15)*2
3 card checks
same as 4 card checks using all combinations for 3 cards in the {1,2,3}.
There are 10 different combinations, so 10 different formulas.
The 2 card check was based on the solution by Tom in Counting Pairs in Cribbage Hand and all two cards are checked with a single formula. (yes it is CSE)
2 card check
{=SUM(--(--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2)+TRANSPOSE(--MID("01020304050607080910101010",1+(MOD(B1:F1-1,13)*2),2))=15))}
Question
Can the 3 and 4 card combination sum check be brought into a single formula similar to the 2 card check?
Is there a better way to convert cards 11,12,13 to a value of 10?
Sample Data
| B | C | D | E | F | POINTS
+----+----+----+----+----+
| 1 | 2 | 3 | 17 | 31 | <= 2 (all 5 add to 15)
| 1 | 2 | 3 | 17 | 32 | <= 2 (Last 4 add to 15)
| 11 | 18 | 31 | 44 | 5 | <= 16 ( 4x(J+5), 4X(5+5+5) )
| 6 | 7 | 8 | 9 | 52 | <= 4 (6+9, 7+8)
| 1 | 3 | 7 | 8 | 52 | <= 2 (7+8)
| 2 | 3 | 7 | 9 | 52 | <= 2 (2+3+K)
| 2 | 4 | 6 | 23 | 52 | <= 0 (nothing add to 15)
Excel Version
Excel 2013
For 5:
=(SUMPRODUCT(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))=15)*2
For 4:
=SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,ROW($1:$5),{1,2,3,4;1,2,3,5;1,2,4,5;1,3,4,5;2,3,4,5}),ROW($1:$4)^0)=15))*2
For 3
=SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,ROW($1:$10),{1,2,3;1,2,4;1,2,5;1,3,4;1,3,5;1,4,5;2,3,4;2,3,5;2,4,5;3,4,5}),ROW($1:$3)^0)=15))*2
For 2:
SUMPRODUCT(--((CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))+(TRANSPOSE(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)))=15))
All together:
=(SUMPRODUCT(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))=15)*2+
SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,ROW($1:$5),{1,2,3,4;1,2,3,5;1,2,4,5;1,3,4,5;2,3,4,5}),ROW($1:$4)^0)=15))*2+
SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,ROW($1:$10),{1,2,3;1,2,4;1,2,5;1,3,4;1,3,5;1,4,5;2,3,4;2,3,5;2,4,5;3,4,5}),ROW($1:$3)^0)=15))*2+
SUMPRODUCT(--((CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))+(TRANSPOSE(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)))=15))
For older versions we need to "trick" INDEX into accepting the arrays as Row and Column References:
We do that by using N(IF({1},[thearray]))
=(SUMPRODUCT(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))=15)*2+
SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,N(IF({1},ROW($1:$5))),N(IF({1},{1,2,3,4;1,2,3,5;1,2,4,5;1,3,4,5;2,3,4,5}))),ROW($1:$4)^0)=15))*2+
SUMPRODUCT(--(MMULT(INDEX(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)*ROW($1:$10)^0,N(IF({1},ROW($1:$10))),N(IF({1},{1,2,3;1,2,4;1,2,5;1,3,4;1,3,5;1,4,5;2,3,4;2,3,5;2,4,5;3,4,5}))),ROW($1:$3)^0)=15))*2+
SUMPRODUCT(--((CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10))+(TRANSPOSE(CHOOSE(MOD(A1:E1-1,13)+1,1,2,3,4,5,6,7,8,9,10,10,10,10)))=15))
This is a CSE That must be confirmed with Ctrl-Shift-Enter instead of Enter when exiting edit mode.

Adding zeros to a string without generating a new variable

I am trying to add zeros to a string variable in such a way that all levels of the variables have same number of digits (assume 3).
clear
input tina bina str4 pine
1 10 "99"
1 11 "99"
2 11 "99"
2 11 "99"
3 12 "."
4 12 "888"
5 14 "88"
6 15 "777"
7 16 "77"
8 17 "0"
8 18 "7"
end
I managed to do this by generating a new variable which stores the number of digits I need to add to each observation in order to reach 3:
generate pi=3-strlen(pine)
replace pine= ("0"*pi) + pine if strlen(pine)<3
I wonder if there is a way to obtain the same result but without generating the variable?
I tried the following but it does not work :
replace pine= ("0"*(`=3-strlen(pine)')) + pine if strlen(pine)<3
Probably I am not so clear about what happens when I evaluate expressions.
Your approach does not work because it evaluates the expression for the first observation only:
. display `= 3 - strlen(pine)'
1
The single quotes are not required:
replace pine = ("0" * (3-strlen(pine) ) ) + pine if strlen(pine) < 3
+--------------------+
| tina bina pine |
|--------------------|
1. | 1 10 099 |
2. | 1 11 099 |
3. | 2 11 099 |
4. | 2 11 099 |
5. | 3 12 00. |
|--------------------|
6. | 4 12 888 |
7. | 5 14 088 |
8. | 6 15 777 |
9. | 7 16 077 |
10. | 8 17 000 |
|--------------------|
11. | 8 18 007 |
+--------------------+
I know there is already an accepted answer, but I wanted to throw out my suggestion. This is maybe a little bit simpler than the other answer and is straightforward to explain. You just want to replace a string variable of real numbers with leading zeros and keep it as a string. You can easily do this by running:
replace pine = string(real(pine),"%03.0f")
Depending on your goal this is maybe better than the previous answer, because it maintains your missing value as missing and not add zeros to it. Hopefully this helpful.

Excel Solver with Multiple Input Variables

I have an Excel sheet that has a list of sports players, their positions, a salary assigned to those players, and a projected amount of points.
I'm currently using solver to create the best group of sports players possible with certain position restrictions and within a predefined salary cap.
In my specific example, the different player positions are: PG, SG, SF, PF, C, G, and F. Note that a G can be either a PG or a SG, and a F can be either a SF or PF.
This solver is working currently, but in some cases a player might have multiple positions. So, for example, Player A can be used as a SF OR a SG.
Is there any way to account for this within a Solver function so that the player in question can be used in either slot?
To help explain, I'll provide some examples of the data being used. Here is a small sample of the player list:
Position Player Salary Game Points Pos 1 Pos 2
PF/C Kevin Love $10,400 Pho#Min 09:30PM ET 53.17 PF C
PG/SG Stephen Curry $10,000 GS#Bkn 07:30PM ET 47.50 PG SG
SG/SF James Harden $9,500 LAL#Hou 08:00PM ET 41.13 SG SF
PF/C LaMarcus Aldridge $9,500 Orl#Por 10:00PM ET 45.22 PF C
PF/C Anthony Davis $9,200 Was#NO 08:00PM ET 42.97 PF C
PF/C Blake Griffin $9,000 Bos#LAC 10:30PM ET 42.66 PF C
PG John Wall $8,900 Was#NO 08:00PM ET 42.09 PG
PF/C Dwight Howard $8,700 LAL#Hou 08:00PM ET 41.19 PF C
SG/SF Paul George $8,600 Ind#Atl 07:30PM ET 40.06 SG SF
PF Paul Millsap $8,400 Ind#Atl 07:30PM ET 37.96 PF
PF/C Al Horford $8,300 Ind#Atl 07:30PM ET 37.33 PF C
To solve the G and F issue, I have a list that tallies the "selected" players, and that list has a min/max of each. So in this example I need 1 PG, 1 SG, and 1 G. So I have a PG column with a min of 1 and a max of 2, a SG column with a min of 1 and a max of 2, and a G column, which adds PG/SG together that has a min of 3 and a max of 3. Then part of the solver criteria is all the min/max must match.
I have split the first column into POS1 and POS2 to separate the two possible positions, but I can't figure out how to include both in the solver function. For a player like Kevin Love, I want the solver to take into account that he can be placed in either the PF, F, or C spots.
Here is that table:
PG SG SF PF C G F Ttl
Min 1 1 1 1 1 3 3 8
Max 3 3 3 3 2 4 4 8
Cur 1 3 1 2 1 4 3 8
So for example, the Solver criteria is:
Sum of Salary <= Salary Cap (50000)
PG Cur >= PG Min
Repeat for all Min
PG Cur <= PG Max
Repeat for all Max
Maximize Points
And finally, here's an example of a solution:
PG Stephen Curry $10,000 47.5
SG James Harden $9,500 41.13
SF Paul George $8,600 40.06
PF Dwight Howard $8,700 41.19
C Blake Griffin $9,000 42.66
G John Wall $8,900 42.09
F Al Horford $8,300 37.33
Total $63,000 292.5
Each player fits into their slot because one of their two positions (POS1 or POS2) fits the criteria. Obviously the total doesn't fit, so this wouldn't be a viable solution, but it's just an example.
Hopefully I've provided enough details, but if not please let me know and I'll be happy to explain further. Thanks in advance.
Your question is still a bit vague because your Salary Cap is $50,000 but you show $63,000 of players selected.
Assumptions:
1. You want 5 players since that is the number of players floor and the only way to get a team consisting of your player-list below $50,000. This is probably Fantasy hoops and you want 7 or 8, but the solution should still work for 8 players with either a broader list of options and lower salaries.
2. I'll also assume that there is little-no VBA in here since you didn't provide any - or at least none of that needs to be adjusted.
My solution (which is still in testing) is to throw/cast (or VBA equivalent) for Pos1 and Pos2 to a text of position number (i.e., 1 = PG, 2=SG, etc.).
Next, =concatenate(Pos1, Pos2) so that a PG is an 11, a PG/SG is a 12, etc. ("G" is also an 11 in this scenario which might put a glitch in my logic).
Change your Position Table with Min/Max/Cur values looks something like this:
Pos. | PG | G | PG/SG | SG | SG/SF | SF/PF | F | PF | PF/C | C
--------------------------------------------------------------------
Pos1 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5
Pos2 | 1 | 2 | 2 | 2 | 3 | 4 | 4 | 4 | 5 | 5
PosNbr | 11 | 12 | 12 | 22 | 23 | 34 | 34 | 44 | 45 | 55
--------------------------------------------------------------------
Min | 1 | 3 | 3 | 1 | | 3 | 4 | 1 | | 1
Max | 3 | 4 | 4 | 3 | | 4 | 4 | 3 | | 2
Curr | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0
(values are my own).

Multiple-digit numbers getting split by space in NuGram?

I'm seeing some unexpected behavior in the NuGram IDE Eclipse plug-in for ABNF grammar development.
Say I have a rule that reads:
$fifties =
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59
;
The sentence generator comes up with the matches 5 0, 5 1, 5 2, ... I would normally expect 50, 51, 52, and so forth, but according to NuGram's coverage tool these are considered OOG.
Come to find that it will split any multiple-digit number with spaces, unless there's a leading non-number:
1234 -> 1 2 3 4
1234asdf -> 1 2 3 4 asdf
asdf1234 -> asdf1234
1234asdf5678 -> 1 2 3 4 asdf5678
As far as I know, a normal ABNF grammar wouldn't do this. Or am I forgetting something?
This is because NuGram IDE considers digits as individual DTMF tones. I agree that this behaviour should only apply to DTMF grammars and not voice grammars.
You can surround sequences of digits with double quotes, like:
$fifties =
"50" | "51" | "52" | "53" | "54" | "55" | "56" | "57" | "58" | "59"
;
Hope that helps!

Why use 0d_ in DiffOrig in Vim?

In the online manual of Vim, :help DiffOrig
will show the recommended command sequence to get changes of current editing file.
Here it is:
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
I wonder what the effect of 0d_ is. I tried 0d_ in normal mode, it works like dd, but I can't understand why it used here.
Let's explain it a bit: Suppose you have original foo.txt containing (with line numbers):
1 a
2 c
3 d
~
You have added a line containing “b” between lines 1 and 2:
:vert new creates a new, empty, buffer in a vertical split (:help :new)
:set bt=nofile makes it a scratch buffer (:help 'bt'). Note:
1 a | 1 ·<cursor here
2 b | ~
3 c | ~
4 d | ~
~ | ~
:r # inserts after current line, contents of alternate file (#), as stored on the file system. You haven't saved the other buffer, so you get original content. (:help alternate-file).
:help :r tells you that it always inserts after. Therefore:
1 a | 1
2 b | 2 a
3 c | 3 c
4 d | 4 d
~ | ~
:0d_ removes the first line. Why 0, I don't know it really, I would rather
write it :1d_. :help range tells:
When using a 0 (zero) this is interpreted as a 1 by most commands
The _ specifies that it goes to the black-hole register. See
:help :d about the :d ex command, it works linewise.
The rest is obvious.

Resources