Sandy Koufax's perfect game

Sandy Koufax's perfect game

Hall of Famer Sandy Koufax

Sandy Koufax of the Los Angeles Dodgers pitched a perfect game in the National League against the Chicago Cubs at Dodger Stadium on September 9, 1965.[1] Koufax, by retiring 27 consecutive batters without allowing any to reach base, became the sixth pitcher of the modern era, eighth overall, to throw a perfect game. The game was Koufax's fourth no-hitter, breaking Bob Feller's Major League record of three (and later broken by Nolan Ryan, in 1981). Koufax struck out 14 opposing batters, the most ever recorded in a perfect game, and matched only by San Francisco Giants pitcher, Matt Cain, on June 13, 2012. He also struck out at least one batter in all nine innings, the only perfect game pitcher to do so to date.

The game was also notable for the high quality of the performance by the opposing pitcher, Bob Hendley of the Cubs. Hendley gave up only one hit (which did not figure into the scoring) and allowed only two baserunners. Both pitchers had no-hitters intact until the seventh inning. The only run that the Dodgers scored was unearned. The game holds the record for fewest base runners (both teams), with two; the next lowest total is four.[2]

Koufax's perfect game is a memorable part of baseball lore. Jane Leavy's biography of Koufax is structured around a re-telling of the game. An article in Salon.com honoring Dodgers broadcaster Vin Scully focuses on his play-by-play call of the game for KFI radio.[3] This game was selected in a 1995 poll of members of the Society for American Baseball Research as the greatest game ever pitched.[4]

Contents

  • The game 1
  • Game Statistics 2
    • Box score 2.1
  • Notes 3
  • References 4
  • External links 5

The game

Koufax had not won a game in three weeks; not since Juan Marichal hit Koufax's catcher, John Roseboro, in the head with a baseball bat. The Dodgers were playing at home against the eighth-place Chicago Cubs. Bob Hendley, the pitcher for the Cubs, was just up from the minor leagues and had a 2–2 record.

Koufax retired the first batter he faced, Ernie Banks struck out on a forkball, and Byron Browne, during his first major league at-bat, lined out to center fielder Willie Davis. Koufax got Chris Krug to line out to center field to start off the third inning. Following him, Don Kessinger flew out on an 0–2 pitch and Hendley struck out. In the fourth inning, Koufax got Young to fly out to the first baseman and Beckert to fly out to right. Koufax then struck out Williams a second time.

In the top half of the fifth inning, the Cubs went three up, three down with Santo flying out, Banks striking out for the second time in the game, and Browne grounding out. By the bottom of the fifth, neither team had reached first base. That changed when Hendley walked Lou Johnson on a three-and-two pitch that could have gone either way. Ron Fairly dropped a sacrifice bunt that Hendley bobbled, leaving his only play at first base. On the first pitch to Jim Lefebvre, Johnson stole third base. The Cubs' catcher Krug threw the ball over Santo's head and into left field, which allowed Johnson to score. The Dodgers had scored a run without an official at-bat or RBI.

The bottom of the order came up in the sixth inning for the Cubs. Krug grounded the ball to shortstop Maury Wills, who threw it in the dirt to first baseman Wes Parker. Parker managed to dig the ball out to save the play and Koufax's perfect game. Kessinger hit a dribbler down the third base line, but Junior Gilliam was playing shallow (to guard against the bunt) and threw him out by half a step. Hendley, who still had a no-hitter going of his own, struck out on three pitches.

Koufax's performance worsened briefly in the seventh, when he threw one pitch that sailed past Young and went all the way to the backstop. Koufax recovered and struck out Young. Beckert was next; he flew out to right field. Williams started out with three straight balls. Koufax's next two pitches were fastballs right down the middle. Williams let the first one go and fouled off the second one. Williams ended up hitting a pop fly to left field on the next pitch. During the bottom of the seventh inning, Johnson broke up Hendley's no-hitter with a bloop hit behind the second baseman. By the time Banks reached it, Johnson was on second base. Fairly grounded out to second, stranding Johnson on second base.

The heart of the Chicago order came up in the eighth inning, and Koufax struck out all three of them. Banks, who struck out for the third time, never made contact the entire game. The Dodgers went three up and three down in the bottom half of the inning. Koufax again struck out the side in the ninth inning to secure the perfect game. Not until the San Francisco Giants' Chris Heston no-hit the New York Mets on June 9, 2015 would another pitcher complete a no-hitter by striking out the final three batters he faced, and not until the Cubs' Jake Arrieta no-hit the Dodgers on August 30 of the same season—a game also played in Dodger Stadium—would a pitcher secure a no-hitter by striking out all three batters he faced in the ninth inning. As Vin Scully, the Dodgers' long time play-by-play announcer, commented at the end: "And Sandy Koufax, whose name will always remind you of strikeouts, did it with a flourish. He struck out the last six consecutive batters. So when he wrote his name in capital letters in the record books, that "K" stands out even more than the O-U-F-A-X." The final out was made by Harvey Kuenn, the same man who made the final out of Koufax's 1963 no-hitter—which had been, appropriately, a ground ball back to Koufax. In the end, Johnson's hit was the only one by either team; the combined total of 1 hit for the entire game is a major league record. Koufax threw 113 pitches during the game, 79 of which were strikes.

Koufax's catcher, Nolan Ryan's seven no-hitters in 1973.

Five days after the perfect game, the Koufax-Hendley rematch took place at Wrigley Field. This time, Hendley defeated Koufax, 2–1.

Until the Philadelphia Phillies' Cole Hamels no-hit the Cubs on July 25, 2015, the perfect game had been the last no-hitter to be pitched against them. They had gone the longest of all Major League teams since a no-hitter was last pitched against them—a span of 7,920 games.

According to Leavy, it was known throughout the league that Koufax "telegraphed" his pitches: another "hitch" in his windup told batters whether the curveball or fastball was coming. Cubs outfielder Al Spangler reminded teammates of this just before the game. Cubs player Billy Williams later groused that "We knew what was coming, and we still couldn't hit it."require('Module:No globals')

local p = {}

-- articles in which traditional Chinese preceeds simplified Chinese local t1st = { ["228 Incident"] = true, ["Chinese calendar"] = true, ["Lippo Centre, Hong Kong"] = true, ["Republic of China"] = true, ["Republic of China at the 1924 Summer Olympics"] = true, ["Taiwan"] = true, ["Taiwan (island)"] = true, ["Taiwan Province"] = true, ["Wei Boyang"] = true, }

-- the labels for each part local labels = { ["c"] = "Chinese", ["s"] = "simplified Chinese", ["t"] = "traditional Chinese", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Cantonese Yale", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Zhuyin Fuhao", ["l"] = "literally", }

-- article titles for wikilinks for each part local wlinks = { ["c"] = "Chinese language", ["s"] = "simplified Chinese characters", ["t"] = "traditional Chinese characters", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Yale romanization of Cantonese", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Bopomofo", }

-- for those parts which are to be treated as languages their ISO code local ISOlang = { ["c"] = "zh", ["t"] = "zh-Hant", ["s"] = "zh-Hans", ["p"] = "zh-Latn-pinyin", ["tp"] = "zh-Latn", ["w"] = "zh-Latn-wadegile", ["j"] = "yue-jyutping", ["cy"] = "yue", ["poj"] = "hak", ["zhu"] = "zh-Bopo", }

local italic = { ["p"] = true, ["tp"] = true, ["w"] = true, ["j"] = true, ["cy"] = true, ["poj"] = true, } -- Categories for different kinds of Chinese text local cats = { ["c"] = "", ["s"] = "", ["t"] = "", }

function p.Zh(frame) -- load arguments module to simplify handling of args local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) return p._Zh(args) end function p._Zh(args) local uselinks = not (args["links"] == "no") -- whether to add links local uselabels = not (args["labels"] == "no") -- whether to have labels local capfirst = args["scase"] ~= nil

        local t1 = false -- whether traditional Chinese characters go first
        local j1 = false -- whether Cantonese Romanisations go first
        local testChar
        if (args["first"]) then
                 for testChar in mw.ustring.gmatch(args["first"], "%a+") do
          if (testChar == "t") then
           t1 = true
           end
          if (testChar == "j") then
           j1 = true
           end
         end
        end
        if (t1 == false) then
         local title = mw.title.getCurrentTitle()
         t1 = t1st[title.text] == true
        end

-- based on setting/preference specify order local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "poj", "zhu", "l"} if (t1) then orderlist[2] = "t" orderlist[3] = "s" end if (j1) then orderlist[4] = "j" orderlist[5] = "cy" orderlist[6] = "p" orderlist[7] = "tp" orderlist[8] = "w" end -- rename rules. Rules to change parameters and labels based on other parameters if args["hp"] then -- hp an alias for p ([hanyu] pinyin) args["p"] = args["hp"] end if args["tp"] then -- if also Tongyu pinyin use full name for Hanyu pinyin labels["p"] = "Hanyu Pinyin" end if (args["s"] and args["s"] == args["t"]) then -- Treat simplified + traditional as Chinese if they're the same args["c"] = args["s"] args["s"] = nil args["t"] = nil elseif (not (args["s"] and args["t"])) then -- use short label if only one of simplified and traditional labels["s"] = labels["c"] labels["t"] = labels["c"] end local body = "" -- the output string local params -- for creating HTML spans local label -- the label, i.e. the bit preceeding the supplied text local val -- the supplied text -- go through all possible fields in loop, adding them to the output for i, part in ipairs(orderlist) do if (args[part]) then -- build label label = "" if (uselabels) then label = labels[part] if (capfirst) then label = mw.language.getContentLanguage():ucfirst(

For a detailed account of Koufax's now-legendary game, including a video clip of an interview Koufax gave after the game as well as other video clips interviewing those involved in this game, see the following Grantland article celebrating the fiftieth anniversary of Koufax's achievement: http://grantland.com/the-triangle/mlb-sandy-koufax-don-hendley-perfect-game-50-year-anniversary-interview/.

Game Statistics

September 9, Dodger Stadium, Los Angeles, California[5]
Team 1 2 3 4 5 6 7 8 9 R H E
Chicago 0 0 0 0 0 0 0 0 0 0 0 1
Los Angeles 0 0 0 0 1 0 0 0 1 1 0
WP: Sandy Koufax (22–7)   LP: Bob Hendley (2–3)

Box score

Hitting
Chicago Cubs AB R H RBI Los Angeles Dodgers AB R H RBI
Young, DonDon Young, CF 3 0 0 0 Wills, MauryMaury Wills, SS 3 0 0 0
Beckert, GlennGlenn Beckert, 2b 3 0 0 0 Gilliam, JimJim Gilliam, 3B 3 0 0 0
Williams, BillyBilly Williams, RF 3 0 0 0   Kennedy, JohnJohn Kennedy, 3B 0 0 0 0
Santo, RonRon Santo, 3B 3 0 0 0 Davis, WillieWillie Davis, CF 3 0 0 0
Banks, ErnieErnie Banks, 1B 3 0 0 0 Johnson, LouLou Johnson, LF 2 1 1 0
Browne, ByronByron Browne, LF 3 0 0 0 Fairly, RonRon Fairly, RF 2 0 0 0
Krug, ChrisChris Krug, C 3 0 0 0 Lefebvre, JimJim Lefebvre, 2B 3 0 0 0
Kessinger, DonDon Kessinger, SS 2 0 0 0   Tracewski, DickDick Tracewski, 2B 0 0 0 0
  Amalfitano, JoeyJoey Amalfitano, PH 1 0 0 0 Parker, WesWes Parker, 1B 3 0 0 0
Hendley, BobBob Hendley, P 2 0 0 0 Torborg, JeffC 3 0 0 0
  Kuenn, HarveyHarvey Kuenn, PH 1 0 0 0 Koufax, SandySandy Koufax, P 2 0 0 0
Totals 27 0 0 0 Totals 24 1 1 0
Pitching
Chicago IP H R ER BB SO Los Angeles IP H R ER BB SO
Hendley, BobBob Hendley 8 1 1 0 1 3 Koufax, SandySandy Koufax 9 0 0 0 0 14
Totals 8 1 1 0 1 3 Totals 9 0 0 0 0 14

Notes


-- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --


local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno

local p = {}


-- Helper functions


local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end

local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end

function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end

function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end

function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end

function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end


-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.


function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end

function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end


-- Hatnote -- -- Produces standard hatnote text. Implements the template.


function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end

function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )

end

return p-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --


local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno

local p = {}


-- Helper functions


local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end

local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end

function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end

function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end

function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end

function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end


-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.


function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end

function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end


-- Hatnote -- -- Produces standard hatnote text. Implements the template.


function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end

function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )

end

return p
  1. ^ Box score and play by play
  2. ^ Leavy, p. 244.
  3. ^ Salon Brilliant Careers - Vin Scully
  4. ^ USA Today September 9, 1999.
  5. ^

References

External links

  • Baseball Library - biography and career highlights
  • Salon Brilliant Careers - Vin Scully
  • Transcript of Vin Scully's radio call of the ninth inning
  • retrosheet.org box score and play by play
  • baseball-reference.com box score and play by play
  • / Audio of Vin Scully's call